2009-09-09 76 views
6

我使用SQLite從C++應用程序(3.6.4)(使用標準的C API)。我的問題是:一旦查詢已準備好,使用sqlite3_prepare_v2(),並使用參數sqlite3_bind_xyz()進行綁定 - 是否有任何方法可以獲取包含原始SQL查詢的字符串?獲取從準備好的聲明原始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

感謝您的答覆,我會試試看 – 2009-09-09 10:25:21

+0

這是儘可能有可能去沒有做太多的黑客。我接受,因爲似乎沒有一種正確的方式去做我最初想要的東西。 – 2010-03-17 09:43:58

4

你可能想使用sqlite3_trace

這將調用回調函數(您定義)和參數的上是準備報表(包括綁定參數的SQL的一個char * )。