Uno familias función de unión problema SQLite3 tienen que prestar atención al utilizar

sqlite3_bind recientes _ * () Función encontró un problema al insertar datos es ilegible, y en Inglés y chino son ilegibles, y la inserción de datos ilegibles son los mismos, además de cadenas, otros tipos de datos es normal, el código como sigue:

​
....
sqlite3_stmt *stmt;
unsigned int rec_offset = 0;
if (sqlite3_prepare_v2 (dbHandle, cmdString, strlen(cmdString), &stmt, NULL) == SQLITE_OK)
{
    for (unsigned int i = 0; i < row_num; ++i)
    {
        for (unsigned int k = 0; k < columnVector.size(); k++)
​​​​​​​        {
            switch (columnVector[k].type)
            {
                case DB_DATATYPE_STRING :
                {
                    char * tmp_char = (char*)malloc (columnVector[k].data_size);
                    memcpy (tmp_char, (char*)data_buffer + rec_offset, columnVector[k].data_size);
                    sqlite3_bind_text (stmt, k + 1, tmp_char, columnVector[k].data_size,								                   SQLITE_STATIC);
                    free (tmp_char);
                    break;
                }
                case DB_DATATYPE_INT:
                {
                    int tempInt;
                    memcpy (&tempInt, (char*)data_buffer + rec_offset, sizeof(int));
                    sqlite3_bind_int(stmt, k + 1, tempInt);
                    break;
                }
                ...
                default:
                {
                    cout<<"不支持的数据类型!!!!!"<<endl;
                    break;
                }
            }//switch 一行的每一列按类型进行绑定处理
            rec_offset += columnVector[k].data_size;
        }//for(k) 一行的所有列处理完毕
        int retcode = sqlite3_step (stmt);
        if ( retcode == SQLITE_DONE)
        {
            sqlite3_reset (stmt);
        }
    }//for(i) 所有数据绑定完毕
    int retcode = sqlite3_finalize (stmt);
    ...
}

​

Después de la Internet para encontrar el problema, encontrar un puesto ( https://www.jb51.net/article/110054.htm ) me sentí un poco como mi caso, parte del código se ha modificado para resolver el problema, porque en sqlite3_step (prop) antes de llamar unen la unión de una fila de datos todavía deben existir, no puede ser puesto en libertad, de lo contrario no puede realmente escritura.

Modificar el código de la siguiente manera:

​
​
....
if (sqlite3_prepare_v2 (dbHandle, cmdString, strlen(cmdString), &stmt, NULL) == SQLITE_OK)
{
    for (unsigned int i = 0; i < row_num; ++i)
    {
        //申请最大内存,这里假设字符串类型字段长度不超过500,每个字段都是字符串类型
        char *tmp_char = (char*)calloc(500 * columnVector.size(), 1);
        for (unsigned int k = 0; k < columnVector.size(); k++)
​​​​​​​        {
            switch (columnVector[k].type)
            {
                case DB_DATATYPE_STRING :
                {
                    memcpy (tmp_char + 500 * k, (char*)data_buffer + rec_offset, columnVector[k].data_size);
                    sqlite3_bind_text (stmt, k + 1, tmp_char + 500 * k, columnVector[k].data_size, SQLITE_STATIC);
                    break;
                }
                ...
            }//switch 一行的每一列按类型进行绑定处理
            rec_offset += columnVector[k].data_size;
        }//for(k) 一行的所有列处理完毕
        int retcode = sqlite3_step (stmt);
        free(tmp_char);  //释放申请的内存
        if ( retcode == SQLITE_DONE)
        {
            sqlite3_reset (stmt);
        }
    }//for(i) 所有数据绑定完毕
    int retcode = sqlite3_finalize (stmt);
    ...
}

​

​

Grabar este tema, con la esperanza de amigos ayudar a resolver el mismo problema.

Publicado 65 artículos originales · ganado elogios 34 · vistas 260 000 +

Supongo que te gusta

Origin blog.csdn.net/huanggang982/article/details/98167786
Recomendado
Clasificación