mysql - 使用 C API 的 MySQL 准备语句中的语法错误

标签 mysql c database-connection prepared-statement

我创建了一个 MySQL 数据库,其中包含一些存储过程。使用 MySQL Workbench SP 分支很好,现在我需要使用 C 程序启动它们。

我创建了该程序,它成功连接到我的数据库,并且我能够启动不需要参数的程序。

要启动更复杂的过程,我需要使用 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);
        }
    }

当我编译并启动程序时,我有以下日志:

Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1 (errno: 1064)

有什么帮助吗?

最佳答案

看起来传递给 mysql_stmt_prepare 的字符串长度是错误的 - 尝试将 64 更改为 24。

或者更好的是,尝试类似的方法:

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

关于mysql - 使用 C API 的 MySQL 准备语句中的语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54793506/

相关文章:

postgresql - 当存在事件连接时删除数据库

java - 动态创建一个jboss数据源连接池

php - 将复选框与相应的输入字段分组

mysql - 从 WPF 应用程序连接到 MySQL 数据库

c - C 中条件 if 条件的简写形式

c - 将 Gstrplaybin 链接到自定义视频接收器 videoconvert 和接收器不链接 gstreamer

excel - 如何改进 Excel 数据连接的刷新?

php - XAMPP 中的 phpMyAdmin 错误 #1146

php - 使用 mySQLi 保留字和函数 - 安全

c++ - 预编译 header 和 ASLR 有什么问题?