Синтаксическая ошибка в подготовительном операторе mySQL с использованием C API - PullRequest
0 голосов
/ 20 февраля 2019

Я создал базу данных MySQL с некоторыми хранимыми процедурами.Используя mySQL Workbench, SP отлично работает, и теперь мне нужно запустить их с помощью программы ac.

Я создал программу, которая успешно подключается к моей БД, и я могу запускать процедуры, которые не требуют параметров.

Чтобы запустить более сложную процедуру, мне нужно использовать оператор prepare в c: в частности, я хочу вызвать процедуру esame_cancella(IN code CHAR(5)), которая удаляет выбранную строку таблицы 'esame'.

    int status;
    MYSQL_RES *result;
    MYSQL_ROW row;
    MYSQL_FIELD *field;
    MYSQL_RES *rs_metadata;
    MYSQL_STMT *stmt;
    MYSQL_BIND ps_params[6];
    unsigned long length[6];
    char cod[64];

    printf("Codice: ");
    scanf ("%s",cod);
    length[0] = strlen(cod);

    stmt = mysql_stmt_init(conn);
    if (stmt == NULL) {
        printf("Could not initialize statement\n");
        exit(1);
    }

    status = mysql_stmt_prepare(stmt, "call esame_cancella(?) ", 64);
    test_stmt_error(stmt, status); //line which gives me the syntax error 

    memset(ps_params, 0, sizeof(ps_params));

    ps_params[0].buffer_type = MYSQL_TYPE_VAR_STRING;
    ps_params[0].buffer = cod;
    ps_params[0].buffer_length = 64;
    ps_params[0].length = &length[0];
    ps_params[0].is_null = 0;


    // bind parameters
    status = mysql_stmt_bind_param(stmt, ps_params); //muore qui
    test_stmt_error(stmt, status);

    // Run the stored procedure
    status = mysql_stmt_execute(stmt);
    test_stmt_error(stmt, status);

    }

Я использую test_stmt_error, чтобы увидеть процедуры вызова журнала MySQL.

    static void test_stmt_error(MYSQL_STMT * stmt, int status)
    {
        if (status) {
            fprintf(stderr, "Error: %s (errno: %d)\n",
            mysql_stmt_error(stmt), mysql_stmt_errno(stmt));
            exit(1);
        }
    }

, когда я компилирую и запускаю свою программу, у меня есть следующий журнал:

Ошибка: у вас естьошибка в вашем синтаксисе SQL;проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы найти правильный синтаксис для использования рядом с '' в строке 1 (номер ошибки: 1064)

Любая помощь?

1 Ответ

0 голосов
/ 20 февраля 2019

Похоже, что длина строки, передаваемая в mysql_stmt_prepare, неверна - попробуйте изменить 64 на 24.

Или еще лучше, попробуйте что-то вроде:

const char sql_sp[] = "call esame_cancella(?) ";
...
status = mysql_stmt_prepare(stmt, sql_sp, sizeof(sql_sp));
...