6.2 C API预制语句数据结构

预处理语句使用几种数据结构:

  • 要获得语句处理程序,请传递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

    此结构是预处理语句的处理程序。通过调用来创建处理程序mysql_stmt_init (),该函数返回指向对象的指针MYSQL_STMT.该处理程序用于该语句的所有后续操作,直到用mysql_stmt_close (),此时处理程序将变得无效,不应再使用。

    MYSQL_STMT结构没有用于应用程序使用的成员。应用程序不应试图复制MYSQL_STMT结构。不能保证这样的副本将是可用的。

    多个语句处理程序可以与单个连接相关联。处理程序数量的限制取决于可用的系统资源。

  • MYSQL_BIND

    这个结构既用于语句输入(发送到服务器的数据值),也用于输出(从服务器返回的结果值):

    • 对于输入,使用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_lengthValue指定的长度*缓冲与连用时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_typeValue决定了数据值的长度。

      如果必须在获取返回值之前确定其长度,请参见第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_nulla的地址保龄球变量。在执行之间适当地将该变量的值设置为true或false,以指示对应的数据值是否为非空,分别。

      对于输出,当您获取一行时,MySQL将设置by所指向的值is_null根据语句返回的结果集列值是否为true或false

    • bool is_unsigned

      此成员应用于数据类型为的C变量无符号字符短整型intLong 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选择。

  • MYSQL_TIME

    此结构用于发送和接收日期时间DATETIME,时间戳数据直接进出服务器。设置缓冲指向a的成员MYSQL_TIME结构,并设置buffer_type的成员MYSQL_BIND结构转换为其中一个时态类型(MYSQL_TYPE_TIMEMYSQL_TYPE_DATEMYSQL_TYPE_DATETIMEMYSQL_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节“日期和时间值的预报表处理”