2011-07-06 76 views
0

我有一個奇怪的問題。無法添加功能sqlite /寫在c + +/Qt。 函數應該做Utf-8符號的上限;SQLite和UTF8

this->db = QSqlDatabase::addDatabase("QSQLITE"); 
    this->db.setDatabaseName(db); 
    this->db.open(); 
    QVariant v = this->db.driver()->handle(); 
    sqlite3 *handler = *static_cast<sqlite3 **>(v.data()); 
    sqlite3_create_function(handler, "myUpper", 1, SQLITE_ANY, NULL, myFunc, NULL, NULL) 

而且功能:

void myFunc(sqlite3_context * ctx, int argc, sqlite3_value ** argv) 
{ 
     if(argc != 1) return; 
     QString str; 
     switch(sqlite3_value_type(argv[0])) 
     { 
       case SQLITE_NULL: 
       { 
         sqlite3_result_text(ctx, "NULL", 4, SQLITE_STATIC); 
         break; 
       } 
       case SQLITE_TEXT: 
       { 
         QString wstr((char*)sqlite3_value_text16(argv[0])); 
         wstr = wstr.toUpper(); 
         sqlite3_result_text16(ctx, wstr.toStdString().c_str(), wstr.size() , SQLITE_TRANSIENT); 
         break; 
       } 
       default: 
         sqlite3_result_text(ctx, "NULL", 4, SQLITE_STATIC); 
       break; 
     } 
} 

回答

2

沒有指定的問題,但我想你應該通過一個函數指針:

sqlite3_create_function(handler, "myUpper", 1, SQLITE_ANY, NULL, &myFunc, NULL, NULL) 

編輯: 我你傳遞給函數wstr.toStdString()。c_str()。這是不允許的,因爲返回的指針只是臨時的,並且會超出範圍。我會做的是:

... 
case SQLITE_TEXT: { 
    QString wstr((char*)sqlite3_value_text(argv[0])); 
    wstr = wstr.toUpper(); 
    QByteArray array = wstr.toLocal8Bit(); 
    const char* cstr = array.data(); 
    sqlite3_result_text(ctx, cstr, wstr.size() , SQLITE_TRANSIENT); 
    break; 
} 
... 

我沒有嘗試它,所以檢查這一點。

+0

這是沒有解決的問題。程序突然關機,然後我試圖打開基地和初始化功能。 – pod2metra

+0

我在編輯我的答案,添加一些更多信息。 –

+0

這是解決不了的問題。問題和原來一樣。 – pod2metra