微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如果语句包含 RETURNING 子句,则 mysql_stmt_bind_result() 失败

如何解决如果语句包含 RETURNING 子句,则 mysql_stmt_bind_result() 失败

我对以下使用 MariaDB Connector/C API 的代码有疑问。

bool database_account_create(char *name,uint8_t *password,uint64_t salt,char *ip,uint32_t *id)
{
    MysqL_STMT *statement = MysqL_stmt_init(&CONNECTION);
    if (statement == NULL) {
        fprintf(stderr,"MysqL_stmt_init() Failed %d: %s\n",MysqL_errno(&CONNECTION),MysqL_error(&CONNECTION));
        return false;
    }

    // Undocumented MariaDB feature: use -1 to tell MysqL_stmt_prepare() to use strlen() on the provided string
    if (MysqL_stmt_prepare(statement,"INSERT INTO accounts (name,password,salt,lastIp) VALUES (?,?,?) RETURNING id",-1) != 0) {
        fprintf(stderr,"MysqL_stmt_prepare() Failed %d: %s\n",MysqL_stmt_errno(statement),MysqL_stmt_error(statement));
        goto error;
    }

    struct InputBinder i_binder;
    MysqL_BIND input[4];
    input_binder_init(&i_binder,4,input);
    input_binder_next_varstring(&i_binder,name);
    input_binder_next_binary(&i_binder,ACCOUNT_HASHED_PASSWORD_LENGTH,password);
    input_binder_next_ulong(&i_binder,&salt);
    input_binder_next_varstring(&i_binder,ip);

    if (MysqL_stmt_bind_param(statement,input) != 0) {
        fprintf(stderr,"MysqL_stmt_bind_param() Failed %d: %s\n",MysqL_stmt_error(statement));
        goto error;
    }

    struct OutputBinder o_binder;
    MysqL_BIND output[1];
    output_binder_init(&o_binder,1,output);
    output_binder_next_uint(&o_binder,id);

    if (MysqL_stmt_bind_result(statement,output) != 0) {
        fprintf(stderr,"MysqL_stmt_bind_result() Failed %d: %s\n",MysqL_stmt_error(statement));
        goto error;
    }

    if (MysqL_stmt_execute(statement) != 0) {
        fprintf(stderr,"MysqL_stmt_execute() Failed %d: %s\n",MysqL_stmt_error(statement));
        goto error;
    }

    if (MysqL_stmt_fetch(statement) != 0) {
        fprintf(stderr,"MysqL_stmt_fetch() Failed %d: %s\n",MysqL_stmt_error(statement));
        goto error;
    }

    MysqL_stmt_close(statement);
    return true;

error:
    MysqL_stmt_close(statement);
    return false;
}

顾名思义,该函数通过提供名称、散列密码、salt 和 IP 向数据库添加一个新帐户,并在 id 参数中返回新帐户的 ID。

CONNECTION 是连接到数据库的有效 MysqL 结构。

struct InputBinderstruct OuputBinder 是辅助结构,用于为 MysqL_BIND 的字段设置正确的值。

代码MysqL_stmt_bind_result() 处失败,带有 CR_NO_STMT_METADATA。如果删除RETURNING 子句和输出绑定,则该函数按预期工作,只是它不会取回 ID。

我做错了吗?如果是这种情况,取回插入行的 ID 的正确方法是什么?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。