1

我尝试在准备好的语句中调用带有二进制参数的过程。但它在所有情况下都失败了。

我可以在网上找到的所有示例都与输出二进制值有关,而不是与输入值有关。

我能怎么做 ?

提前致谢。

一个非常简单的程序:

CREATE PROCEDURE `testVarsGet2` (
    IN i_ulv BINARY(12),
  OUT o_cnt INT(11),
    OUT o_errno INT(11))
testVarsGet2:BEGIN
DECLARE t_ulv BINARY(12);

select `ulv` into t_ulv from `testVars`  where `ulv` =i_ulv;

IF  ROW_COUNT() = 0 THEN 
    SET o_errno = -1002;
    LEAVE testVarsGet2;
END IF;
select `cnt` into o_cnt from `testVars`  where `ulv` = i_ulv;

SET o_errno = 0;

LEAVE testVarsGet2;
END;

如果 ulv 没问题, o_errno = 0 ,如果不是 o_errno =- 1002

命令行 :

mysql> call testVarsGet2 (0x7124A57EF08100010000DF3F,@cnt , @err); select  @cnt, @err;
Query OK, 1 row affected (0.00 sec)

+------+------+
| @cnt | @err |
+------+------+
|    1 |    0 |
+------+------+
1 row in set (0.00 sec)

或者

mysql> call testVarsGet2 (unhex('7124A57EF08100010000DF3F'),@cnt , @err); select  @cnt, @err;
Query OK, 1 row affected (0.00 sec)

+------+------+
| @cnt | @err |
+------+------+
|    1 |    0 |
+------+------+
1 row in set (0.00 sec)

但是在 C/C++ 程序中,如果我使用语句,它会失败

 mysql_stmt_prepare(stmt, "call testVarsGet2 ( unhex(?), ? , ?)", strlen(..));

with 

const char * value = "7124A57EF08100010000DF3F"
len = 24;

    bind[0].buffer_type = MYSQL_TYPE_STRING;
    bind[0].buffer = (char *)value;
    bind[0].buffer_length = 32;
    bind[0].is_null= 0;
    bind[0].length= &len;

或者

mysql_stmt_prepare(stmt, "call testVarsGet2 ( ?, ? , ?)", strlen(..));

value = "0x7124A57EF08100010000DF3F"

或具有二进制值

const char * value = "7124A57EF08100010000DF3F"
len = 12

unsigned char * value_bin = hex2bin (value );

    bind[0].buffer_type = MYSQL_TYPE_BLOB;
    bind[0].buffer = (char *)value_bin;
    bind[0].buffer_length = 12;
    bind[0].is_null= 0;
    bind[0].length= &len;

在所有情况下,我都会得到 o_errno = -1002

如何传递二进制值????

先感谢您。

4

1 回答 1

1

将我的评论变成答案。

不应使用引号作为输出参数的占位符。相反,为每个输出参数提供一个用户变量,就像您在命令行版本中所做的那样。然后发出后续SELECT语句来检索这些用户变量的值。您可以将结果值绑定到您的 C 变量。

一旦您只输入参数,您应该能够按照您尝试的方式将它们绑定到您的 C 变量。

于 2012-11-11T22:33:14.347 回答