Press CTRL+C to copybool mysql_bind_param(MYSQL *mysql, unsigned n_params, MYSQL_BIND *bind, const char **name)
mysql_bind_param()
,从 MySQL 8.0.23 开始可用,允许定义应用于发送到服务器的下一个查询的属性。有关查询属性的目的和用法的讨论,请参阅查询属性。
使用 mysql_bind_param()
定义的属性适用于使用 mysql_real_query()
或 mysql_query()
以阻塞方式执行的非预处理语句,或者使用 mysql_real_query_nonblocking()
以非阻塞方式执行的语句。属性不适用于使用 mysql_stmt_execute()
执行的预处理语句。
如果在查询执行之前发生多次 mysql_bind_param()
调用,则仅最后一次调用适用。
使用 mysql_bind_param()
定义的属性仅适用于执行的下一个查询,并在之后清除。 mysql_reset_connection()
和 mysql_change_user()
函数也会清除任何当前定义的属性。
mysql_bind_param()
向后兼容。对于连接到不支持查询属性的旧服务器,不会发送任何属性。
参数
mysql
:从mysql_init()
返回的连接句柄。n_params
:由bind
和name
参数定义的属性数量。bind
:指向MYSQL_BIND
结构数组的地址。该数组应包含n_params
个元素,每个元素对应一个属性。name
:指向字符指针数组的地址,每个指针指向一个以空字符结尾的字符串,定义一个属性名称。该数组应包含n_params
个元素,每个元素对应一个属性。查询属性名称使用character_set_client
系统变量指示的字符集传输。
每个属性都有一个名称、一个值和一个数据类型。 name
参数定义属性名称,bind
参数定义其值和类型。有关用于 bind
参数的 MYSQL_BIND
数据结构成员的描述,请参阅 第 6.2 节,“C API 预处理语句数据结构”。
每个属性类型必须是 表 6.1,“MYSQL_BIND 结构的允许输入数据类型” 中列出的 MYSQL_TYPE_
类型之一,但 xxx
MYSQL_TYPE_BLOB
和 MYSQL_TYPE_TEXT
不受支持。如果为属性指定了不支持的类型,则会发生 CR_UNSUPPORTED_PARAM_TYPE
错误。
-
属性数据类型不受支持。
此示例使用 mysql_bind_param()
定义字符串和整数查询属性,然后使用 mysql_query_attribute_string()
用户定义函数按名称检索和显示其值。
Press CTRL+C to copyMYSQL_BIND bind[2]; const char *name[2] = { "name1", "name2" }; char *char_data = "char value"; int int_data = 3; unsigned long length[2] = { 10, sizeof(int) }; int status; /* clear and initialize attribute butffers */ memset(bind, 0, sizeof (bind)); bind[0].buffer_type = MYSQL_TYPE_STRING; bind[0].buffer = char_data; bind[0].length = &length[0]; bind[0].is_null = 0; bind[1].buffer_type = MYSQL_TYPE_LONG; bind[1].buffer = (char *) &int_data; bind[1].length = &length[1]; bind[1].is_null = 0; /* bind attributes */ status = mysql_bind_param(&mysql, 2, bind, name); test_error(&mysql, status); const char *query = "SELECT mysql_query_attribute_string('name1')," " mysql_query_attribute_string('name2')"; status = mysql_real_query(&mysql, query, strlen(query)); test_error(&mysql, status); MYSQL_RES *result = mysql_store_result(&mysql); MYSQL_ROW row = mysql_fetch_row(result); unsigned long *lengths = mysql_fetch_lengths(result); for(int i = 0; i < 2; i++) { printf("attribute %d: [%.*s]\n", i+1, (int) lengths[i], row[i] ? row[i] : "NULL"); } mysql_free_result(result);
执行时,代码产生以下结果
Press CTRL+C to copyattribute 1: [char value] attribute 2: [3]