预处理语句使用几种数据结构:
要获得语句处理程序,请传递
MYSQL
连接处理程序到mysql_stmt_init ()
,该函数返回指向对象的指针MYSQL_STMT
数据结构。该结构用于语句的进一步操作。参数来指定要准备的语句MYSQL_STMT
指针和语句字符串指向mysql_stmt_prepare ()
.若要为预处理语句提供输入参数,请设置
MYSQL_BIND
结构并将它们传递给mysql_stmt_bind_param ()
.要接收输出列值,请设置MYSQL_BIND
结构并将它们传递给mysql_stmt_bind_result ()
.MYSQL_BIND
结构也用于mysql_bind_param ()
,它允许定义应用于发送到服务器的下一个查询的属性。的
MYSQL_TIME
结构用于双向传输时间数据。
下面的讨论详细描述预准备语句数据类型。有关显示如何使用它们的示例,请参见第6.4.10节,“mysql_stmt_execute()”,第6.4.11节,“mysql_stmt_fetch()”.
此结构是预处理语句的处理程序。通过调用来创建处理程序
mysql_stmt_init ()
,该函数返回指向对象的指针MYSQL_STMT
.该处理程序用于该语句的所有后续操作,直到用mysql_stmt_close ()
,此时处理程序将变得无效,不应再使用。的
MYSQL_STMT
结构没有用于应用程序使用的成员。应用程序不应试图复制MYSQL_STMT
结构。不能保证这样的副本将是可用的。多个语句处理程序可以与单个连接相关联。处理程序数量的限制取决于可用的系统资源。
这个结构既用于语句输入(发送到服务器的数据值),也用于输出(从服务器返回的结果值):
对于输入,使用
MYSQL_BIND
结构与mysql_bind_param ()
为查询定义属性。(在接下来的讨论中,对于预备语句的语句参数的任何提及也适用于查询属性。)对于输出,使用
MYSQL_BIND
结构与mysql_stmt_bind_result ()
将缓冲区绑定到结果集列,以用于取行mysql_stmt_fetch ()
.
使用
MYSQL_BIND
结构,将其内容归零以初始化它,然后适当地设置其成员。例如,声明并初始化一个包含3的数组MYSQL_BIND
结构,使用下面的代码:MYSQL_BIND绑定[3];Memset (bind, 0, sizeof(bind));
的
MYSQL_BIND
结构包含以下成员供应用程序使用。对于一些成员,使用方式取决于该结构是用于输入还是用于输出。Enum enum_field_types buffer_type
缓冲区的类型。此成员指示绑定到语句形参或结果集列的C语言变量的数据类型。为输入,
buffer_type
指示包含要发送到服务器的值的变量的类型。对于输出,它指示应从服务器接收到的值存储到的变量类型。为允许的buffer_type
值,请参阅章节6.2.1,“C API预制语句类型代码”.void *缓冲
指向用于数据传输的缓冲区的指针。这是一个C语言变量的地址。
为输入,
缓冲
指向用于存储语句参数的数据值的变量的指针。当你打电话时mysql_stmt_execute ()
, MySQL使用存储在变量中的值代替语句中对应的参数标记(用吗?
在语句字符串中)。为输出,
缓冲
指向要在其中返回结果集列值的变量的指针。当你打电话时mysql_stmt_fetch ()
, MySQL将结果集的当前行中的列值存储在这个变量中。您可以在调用返回时访问该值。为了尽量减少MySQL在客户端C语言值和服务器端SQL值之间执行类型转换的需要,请使用与相应SQL值类型相似的C变量:
对于数值数据类型,
缓冲
应该指向适当的数字C类型的变量。对于整型变量(可以是字符
对于单字节值或较大值的整数类型),还应指明变量是否具有无符号
属性,以设置is_unsigned
成员,稍后描述。对于字符(非二进制)和二进制字符串数据类型,
缓冲
应该指向一个字符缓冲区。对于日期和时间数据类型,
缓冲
应该指向MYSQL_TIME
结构。
有关C类型和SQL类型之间映射的指导方针和类型转换的注意事项,请参见章节6.2.1,“C API预制语句类型代码”,第6.2.2节,“C API预处理语句类型转换”.
Unsigned long buffer_length
的实际尺寸
*缓冲
在字节。这表示缓冲区中可以存储的最大数据量。对于字符和二进制C数据,使用buffer_length
Value指定的长度*缓冲
与连用时mysql_stmt_bind_param ()
指定输入值,或在使用时可提取到缓冲区的输出数据字节的最大数目mysql_stmt_bind_result ()
.Unsigned long *长度
指向
无符号长
变量,该变量指示存储在其中的数据的实际字节数*缓冲
.长度
用于字符或二进制C数据。对于输入参数数据绑定,请设置
*长度
来指示存储在中的参数值的实际长度*缓冲
.这是由mysql_stmt_execute ()
.对于输出值绑定,MySQL设置
*长度
当你打电话时mysql_stmt_fetch ()
.的mysql_stmt_fetch ()
返回值决定如何解释长度:如果返回值为0,
*长度
参数值的实际长度。如果返回值为
MYSQL_DATA_TRUNCATED
,*长度
参数值的不截断长度。在这种情况下,最小值*长度
而且buffer_length
值的实际长度。
长度
对于数值和时态数据类型被忽略,因为buffer_type
Value决定了数据值的长度。如果必须在获取返回值之前确定其长度,请参见第6.4.11节,“mysql_stmt_fetch()”,了解一些策略。
bool * is_null
这个元素指向a
保龄球
变量,如果值为,则为真零
如果不是,则为假零
.对于输入,set* is_null
为true表示您正在传递零
值作为语句参数。is_null
是一个指针到布尔标量,而不是布尔标量,以提供指定方式的灵活性零
价值观:如果你的数据值总是
零
,使用MYSQL_TYPE_NULL
随着buffer_type
值。另一个MYSQL_BIND
成员,其中包括is_null
,不重要。如果你的数据值总是
非空
,设置Is_null = (bool*) 0
,并为要绑定的变量适当地设置其他成员。在所有其他情况下,适当地设置其他成员并设置
is_null
a的地址保龄球
变量。在执行之间适当地将该变量的值设置为true或false,以指示对应的数据值是否为零
或非空
,分别。
对于输出,当您获取一行时,MySQL将设置by所指向的值
is_null
根据语句返回的结果集列值是否为true或false零
.bool is_unsigned
此成员应用于数据类型为的C变量
无符号
(字符
,短整型
,int
,Long Long int
).集is_unsigned
如果变量指向by,则为true缓冲
是无符号
否则为假。例如,如果你绑定一个签署了字符
变量来缓冲
,指定类型代码为MYSQL_TYPE_TINY
并设置is_unsigned
为假。如果你绑定无符号字符
相反,类型代码是相同的,但是is_unsigned
应该是真的。(字符
,没有定义它是有符号的还是无符号的,所以最好通过使用显式地说明有符号性签署了字符
或无符号字符
.)is_unsigned
仅适用于客户端的C语言变量。它没有表明服务器端对应SQL值的符号性。例如,如果你使用anint
变量为对象提供一个值长整型数字无符号
列,is_unsigned
应该是假的,因为int
是有符号类型。如果你使用无符号整型
变量为对象提供一个值长整型数字
列,is_unsigned
应该是真的,因为无符号整型
是无符号类型。MySQL在两个方向上执行有符号值和无符号值之间的正确转换,尽管如果导致截断会出现警告。bool *误差
对于输出,将该成员设置为指向a
保龄球
变量将在行获取操作之后存储参数的截断信息。当截断报告启用时,mysql_stmt_fetch ()
返回MYSQL_DATA_TRUNCATED
而且*误差
是正确的MYSQL_BIND
发生截断的参数的结构。截断表示丢失符号或有效数字,或者字符串太长,无法放入列中。截断报告在默认情况下是启用的,但可以通过调用控制mysql_options ()
与MYSQL_REPORT_DATA_TRUNCATION
选择。
此结构用于发送和接收
日期
,时间
,DATETIME
,时间戳
数据直接进出服务器。设置缓冲
指向a的成员MYSQL_TIME
结构,并设置buffer_type
的成员MYSQL_BIND
结构转换为其中一个时态类型(MYSQL_TYPE_TIME
,MYSQL_TYPE_DATE
,MYSQL_TYPE_DATETIME
,MYSQL_TYPE_TIMESTAMP
).的
MYSQL_TIME
结构包含下表中列出的成员。成员 描述 未签名int年
今年 Unsigned int month
一年中的月份 当日未签名
每月的第一天 Unsigned int hour
一天中的时刻 无符号int分
分秒必争 Unsigned int秒
第二分钟 bool底片
一个布尔标志,指示时间是否为负 Unsigned long second_part
秒:以微秒为单位的秒的小数部分 只有那些部分
MYSQL_TIME
结构,用于应用于给定类型的时态值。的一年
,月
,一天
元素用于日期
,DATETIME
,时间戳
值。的小时
,一分钟
,第二个
元素用于时间
,DATETIME
,时间戳
值。看到第3.6.3节“日期和时间值的预报表处理”.