【问题标题】:SQLite and UTF8SQLite 和 UTF8
【发布时间】:2011-07-07 15:32:48
【问题描述】:

我有一个奇怪的问题。无法将函数添加到 sqlite/在 c++/Qt 上编写。 功能应高于 Utf-8 符号;

    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;
        }
}

【问题讨论】:

    标签: qt sqlite function


    【解决方案1】:

    你没有具体说明问题,但我想你应该传递一个指向函数的指针:

    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;
    }
    ...
    

    我没试过,所以检查一下。

    【讨论】:

    • 这不是已解决的问题。程序突然关闭,然后我正在尝试打开 base 和 init 函数。
    • 这是未解决的问题。问题完全一样。
    • 问题是……你没有说你遇到的问题是什么……你有没有试过放一些调试日志或者在debug中运行?
    • 问题是我打开数据库时程序崩溃
    • 问题变得更有趣了。此错误适用于 x64 系统。在 x86 上没有这个问题。你能解释一下吗?并在这方面提供帮助。
    猜你喜欢
    • 2013-03-10
    • 2012-11-11
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    • 2011-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多