SQLite

2009-09-09 15 views
6

में तैयार कथन से मूल SQL क्वेरी प्राप्त करें मैं एक C++ एप्लिकेशन (मानक सी एपीआई का उपयोग कर) से SQLite (3.6.4) का उपयोग कर रहा हूं। मेरा सवाल है: एक बार एक प्रश्न तैयार किया गया है, sqlite3_prepare_v2() का उपयोग करके, और sqlite3_bind_xyz() का उपयोग कर पैरामीटर के साथ बाध्य - क्या मूल SQL क्वेरी वाली स्ट्रिंग प्राप्त करने का कोई तरीका है?SQLite

कारण कुछ गलत होने पर कारण है, मैं क्वेरी मुद्रित करना चाहता हूं (डीबगिंग के लिए - यह एक इन-हाउस डेवलपर केवल टेस्ट ऐप है)।

उदाहरण:

sqlite3_prepare_v2(db, "SELECT * FROM xyz WHERE something = ? AND somethingelse = ?", -1, &myQuery, NULL); 
sqlite3_bind_text(myQuery, 1, mySomething); 
sqlite3_bind_text(myQuery, 2, mySomethingElse); 
// .... 

// somewhere else, in another function perhaps 
if (sqlite3_step(myQuery) != SQLITE_OK) 
{ 
    // Here i'd like to print the actual query that failed - but I 
    // only have the myQuery variable 
    exit(-1); 
} 

बोनस अंक अगर यह भी वास्तविक पैरामीटर ही था प्रिंट आउट कर सकते हैं। :)

उत्तर

3

sqlite3.c (समामेलन) में टिप्पणियों के अनुसार, sqlite3_sql(myQuery) मूल SQL पाठ वापस कर देगा।

मुझे किसी विशेष इंडेक्स पर मूल्य को ढूँढने के लिए कोई फ़ंक्शन नहीं दिखता है, लेकिन हम आसानी से SQLite फ़ंक्शंस के मानक सेट में एक जोड़ सकते हैं। यह कुछ इस तरह लग सकता है:

const char* sqlite3_bound_value(sqlite3_stmt* pStmt, int index) 
{ 
    Vdbe *p = (Vdbe *)pStmt; 

    // check if &p->aVar[index - 1] points to a valid location. 
    return (char*)sqlite3ValueText(&p->aVar[index - 1], SQLITE_UTF8); 
} 

खैर, इसके बाद के संस्करण कोड केवल एक संभव तरीका sqlite3_bound_value से पता चलता() लागू किया जा सकता। मैंने इसका परीक्षण नहीं किया है, यह गलत हो सकता है, लेकिन यह कुछ संकेत देता है कि कैसे/कहां से शुरू किया जाए।

+0

उत्तर के लिए धन्यवाद, मैं इसे –

+0

पर आज़मा दूंगा, जहां तक ​​यह एक हैक के बिना बहुत संभव था। मैं स्वीकार कर रहा हूं क्योंकि मूल रूप से जो करना चाहता था वह करने का एक उचित तरीका प्रतीत नहीं होता है। –

1

प्रलेखन का हवाला देते हुए:

"वी 2" इंटरफेस में, तैयार बयान है कि लौटा दिया जाता है (sqlite_stmt वस्तु) मूल SQL पाठ की एक प्रति शामिल हैं।

http://www.sqlite.org/c3ref/prepare.html

4

आप शायद sqlite3_trace उपयोग करने के लिए

यह एक कॉलबैक फ़ंक्शन (आपके द्वारा निर्धारित) और फोन करेगा मापदंडों के पर चाहते तैयार बयान (बाध्य मापदंडों सहित की एसक्यूएल का एक चार * है)।