Пустая строка вставлена ​​в базу данных вместо переданного значения - PullRequest
1 голос
/ 12 апреля 2019

Я пытаюсь вставить значение с помощью c в sqlite3, но вместо переданного значения в таблицу вставляется пустая строка

int main() {
sqlite3 *db;
sqlite3_stmt *stmt;
int rc ;
rc = sqlite3_open("mydb.db", &db);

if (rc)
{
    fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
}
else
{
    fprintf(stderr, "Opened database successfully\n");
}

sqlite3_prepare_v2(db, "select * FROM `99940` a INNER JOIN (SELECT rowid FROM `Search_99940` ('B Rujesh P Balakrishnan')) b ON b.rowid = a.rowid WHERE upper(a.circle) = ('TAMIL NADU')", -1, &stmt, NULL);

sqlite3_bind_int(stmt, 0, 16);

if ((rc = sqlite3_step(stmt)) == SQLITE_ROW)
{
    string try1 = string(reinterpret_cast<const char*>(sqlite3_column_text(stmt, 1)));
    string try2 = string(reinterpret_cast<const char*>(sqlite3_column_text(stmt, 2)));
    string try3 = string(reinterpret_cast<const char*>(sqlite3_column_text(stmt, 3)));
    string try4 = string(reinterpret_cast<const char*>(sqlite3_column_text(stmt, 4)));
    string try5 = string(reinterpret_cast<const char*>(sqlite3_column_text(stmt, 5)));
    string try6 = string(reinterpret_cast<const char*>(sqlite3_column_text(stmt, 6)));
    string try7 = string(reinterpret_cast<const char*>(sqlite3_column_text(stmt, 7)));
    string try8 = string(reinterpret_cast<const char*>(sqlite3_column_text(stmt, 8)));
    string try9 = string(reinterpret_cast<const char*>(sqlite3_column_text(stmt, 9)));


    char* errorMessage;
    sqlite3_exec(db, "BEGIN TRANSACTION", NULL, NULL, &errorMessage);

    char buffer[] = "INSERT INTO `99946` (Number,Full_Name,Address,Date,Circle,Operator,Alterno,IDProof,SimType)  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?);";   
    sqlite3_prepare_v2(db, buffer, strlen(buffer), &stmt, NULL);

    for (unsigned i = 0; i < 1; i++)
    {
        sqlite3_bind_text(stmt, 1, try1.c_str(), 0, NULL);
        sqlite3_bind_text(stmt, 2, try2.c_str(), 0, NULL);
        sqlite3_bind_text(stmt, 3, try3.c_str(), 0, NULL);
        sqlite3_bind_text(stmt, 4, try4.c_str(), 0, NULL);
        sqlite3_bind_text(stmt, 5, try5.c_str(), 0, NULL);
        sqlite3_bind_text(stmt, 6, try6.c_str(), 0, NULL);
        sqlite3_bind_text(stmt, 7, try7.c_str(), 0, NULL);
        sqlite3_bind_text(stmt, 8, try8.c_str(), 0, NULL);
        sqlite3_bind_text(stmt, 9, try9.c_str(), 0, NULL);

        if (sqlite3_step(stmt) != SQLITE_DONE)
        {
            printf("Commit Failed!\n");
        }
        else
        {
            printf("Success!\n");
        }
        sqlite3_reset(stmt);
   }
    sqlite3_exec(db, "COMMIT TRANSACTION", NULL,NULL, &errorMessage);
    sqlite3_finalize(stmt);
}

return 0;

}

Мой запрос на выбор работает нормальноа также я получаю значение в try1 до try9.Например, try1 = 'xyz', и я получаю это значение, используя

string try1 = string(reinterpret_cast<const char*>(sqlite3_column_text(stmt, 1)));

Что не так, я не понимаю, пожалуйста, помогите мне решить эту проблему.Я не понимаю, как я пытаюсь вставить текст?

1 Ответ

1 голос
/ 12 апреля 2019

Вы пишете 0 байт на данный момент.

Пояснение:

    sqlite3_bind_text(stmt, 1, try1.c_str(), 0, NULL);

И синтаксис

int sqlite3_bind_text(sqlite3_stmt*,int,const char*,int,void(*)(void*));

Согласно sqlite3

Третий аргумент - это значение для привязки к параметру. Если третий параметр для sqlite3_bind_text () или sqlite3_bind_text16 () или sqlite3_bind_blob () является нулевым указателем, тогда четвертый параметр игнорируется, и конечный результат такой же, как sqlite3_bind_null ().

В тех подпрограммах, которые имеют четвертый аргумент, его значением является число байтов в параметре. Чтобы было понятно: значение является числом байты в значении, а не количество символов. Если четвертый параметр для sqlite3_bind_text () или sqlite3_bind_text16 () отрицательный, тогда длина строки - это число байтов до первого нулевой терминатор.


Таким образом, измените его на приведенное ниже, чтобы записывать до нулевого байта.

sqlite3_bind_text(stmt, 1, try1.c_str(), -1, NULL);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...