为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

认证考试(个人整理)Mysql C API

2018-04-30 23页 doc 54KB 9阅读

用户头像

is_496339

暂无简介

举报
认证考试(个人整理)Mysql C API认证考试(个人整理)Mysql C API 25.2.1. C API数据类型 , MYSQL 该结构代表1个数据库连接的句柄。几乎所有的MySQL函数均使用它。不应尝试拷贝MYSQL 结构。不保证这类拷贝结果会有用。 , MYSQL_RES 该结构代表返回行的查询结果(SELECT, SHOW, DESCRIBE, EXPLAIN)。在本节的剩余部分, 将查询返回的信息称为“结果集”。 , MYSQL_ROW 这是1行数据的“类型安全”表示。它目前是按照计数字节字符串的数组实施的。(如果字 段值可能包含二进制数据...
认证考试(个人整理)Mysql C API
认证考试(个人整理)Mysql C API 25.2.1. C API数据类型 , MYSQL 该结构代1个数据库连接的句柄。几乎所有的MySQL函数均使用它。不应尝试拷贝MYSQL 结构。不保证这类拷贝结果会有用。 , MYSQL_RES 该结构代表返回行的查询结果(SELECT, SHOW, DESCRIBE, EXPLAIN)。在本节的剩余部分, 将查询返回的信息称为“结果集”。 , MYSQL_ROW 这是1行数据的“类型安全”表示。它目前是按照计数字节字符串的数组实施的。(如果字 段值可能包含二进制数据,不能将其当作由Null终结的字符串对待,这是因为这类值可能 会包含Null字节)。行是通过调用mysql_fetch_row()获得的。 , MYSQL_FIELD 该结构包含关于字段的信息,如字段名、类型和大小。这里详细介绍了其成员。通过重复调 用mysql_fetch_field(),可为每个字段获得MYSQL_FIELD结构。字段值不是该结构的组成 部份,它们包含在MYSQL_ROW结构中。 , MYSQL_FIELD_OFFSET 这是MySQL字段列表偏移量的“类型安全”表示(由mysql_field_seek()使用)。偏移量 是行内的字段编号,从0开始。 , my_ulonglong 用于行数以及mysql_affected_rows()、mysql_num_rows()和mysql_insert_id()的类型。 该类型提供的范围为0,1.84e19。 在某些系统上,不能打印类型my_ulonglong的值。要想打印这类值,请将其转换为无符号 长整数类型并使用%lu打印格式,例如: printf ("Number of rows: %lu\n", (unsigned long) mysql_num_rows(result)); 下面列出了MYSQL_FIELD结构包含的成员: ? char * name 字段名称,由Null终结的字符串。如果用AS子句为该字段指定了别名,名称的值也是别名。 ? char * org_name 段名称,由Null终结的字符串。忽略别名。 ? char * table 包含该字段的表的名称,如果该字段不是计算出的字段的话。对于计算出的字段,表值为空的字符串。如果用AS子句为该表指定了别名,表的值也是别名。 char * org_table ? 表的名称,由Null终结的字符串。忽略别名。 ? char * db 字段源自的数据的名称,由Null终结的字符串。如果该字段是计算出的字段,db为空的字符串。 ? char * catalog catalog名称。该值总是"def"。 ? char * def 该字段的默认值,由Null终结的字符串。仅当使用mysql_list_fields()时才设置它。 ? unsigned long length 字段的宽度,如表定义中所指定的那样。 ? unsigned long max_length 用于结果集的字段的最大宽度(对于实际位于结果集中的行,最长字段值的长度)。如果使用mysql_store_result()或mysql_list_fields(),它将包含字段的最大长度。如果使用mysql_use_result(),该变量的值为0。 ? unsigned int name_length 名称的长度。 ? unsigned int org_name_length org_name的长度。 ? unsigned int table_length 表的长度。 ? unsigned int org_table_length org_table的长度。 ? unsigned int db_length db的长度。 ? unsigned int catalog_length catalog的长度。 ? unsigned int def_length def的长度。 ? unsigned int flags 用于字段的不同“位标志”。标志的值可以有0个或多个下述位集合: 标志值 标志描述 NOT_NULL_FLAG 字段不能为NULL PRI_KEY_FLAG 字段是主键的组成部分 UNIQUE_KEY_FLAG 字段是唯一键的组成部分 MULTIPLE_KEY_FLAG 字段是非唯一键的组成部分 UNSIGNED_FLAG 字段具有UNSIGNED属性 ZEROFILL_FLAG 字段具有ZEROFILL属性 BINARY_FLAG 字段具有BINARY属性 AUTO_INCREMENT_FLAG 字段具有AUTO_INCREMENT属性 ENUM_FLAG 字段是ENUM(不再重视) SET_FLAG 字段是 SET(不再重视) BLOB_FLAG 字段是BLOB或TEXT(不再重视) TIMESTAMP_FLAG 字段是TIMESTAMP(不再重视) 不再重视BLOB_FLAG、ENUM_FLAG、SET_FLAG和TIMESTAMP_FLAG标志,原因在于,它们指出了字段 的类型,而不是类型的属性。更可取的方式是使用MYSQL_TYPE_BLOB、MYSQL_TYPE_ENUM、 MYSQL_TYPE_SET或MYSQL_TYPE_TIMESTAMP测试field->type。 在下面的示例中,介绍了标志值的典型用法: if (field->flags & NOT_NULL_FLAG) printf("Field can't be null\n"); 可以使用下述方面的宏来定义标志值的布尔状态: 标志状态 描述 IS_NOT_NULL(flags) 如果该字段定义为NOT NULL,为“真”。 IS_PRI_KEY(flags) 如果该字段是主键,为“真”。 如果该字段是BLOB或TEXT,为“真”(不再重视,用测试field->type取IS_BLOB(flags) 而代之)。 ? unsigned int decimals 用于数值字段的十进制数数目。 unsigned int charset_nr ? 用于字段的字符集编号。 ? enum enum_field_types type 字段的类型。类型值可以是下标所列的MYSQL_TYPE_符号之一: 类型值 类型描述 MYSQL_TYPE_TINY TINYINT字段 MYSQL_TYPE_SHORT SMALLINT字段 MYSQL_TYPE_LONG INTEGER字段 MYSQL_TYPE_INT24 MEDIUMINT字段 MYSQL_TYPE_LONGLONG BIGINT字段 MYSQL_TYPE_DECIMAL DECIMAL或NUMERIC字段 MYSQL_TYPE_NEWDECIMAL 精度数学DECIMAL或NUMERIC MYSQL_TYPE_FLOAT FLOAT字段 MYSQL_TYPE_DOUBLE DOUBLE或REAL字段 MYSQL_TYPE_BIT BIT字段 MYSQL_TYPE_TIMESTAMP TIMESTAMP字段 MYSQL_TYPE_DATE DATE字段 MYSQL_TYPE_TIME TIME字段 MYSQL_TYPE_DATETIME DATETIME字段 MYSQL_TYPE_YEAR YEAR字段 MYSQL_TYPE_STRING CHAR字段 MYSQL_TYPE_VAR_STRING VARCHAR字段 MYSQL_TYPE_BLOB BLOB或TEXT字段(使用max_length来确定最大长度) MYSQL_TYPE_SET SET字段 MYSQL_TYPE_ENUM ENUM字段 MYSQL_TYPE_GEOMETRY Spatial字段 MYSQL_TYPE_NULL NULL-type字段 MYSQL_TYPE_CHAR 不再重视,用MYSQL_TYPE_TINY取代 可以使用IS_NUM()宏来测试字段是否具有数值类型。将类型值传递给IS_NUM(),如果字段为数值 类型,会将其评估为“真”: if (IS_NUM(field->type)) printf("Field is numeric\n"); 25.2.2. C API函数概述 这里归纳了C API可使用的函数,并在下一节详细介绍了它们。请参见25.2.3节,“C API函数 描述”。 函数 描述 mysql_affected_rows() 返回上次UPDATE、DELETE或INSERT查询更改,删除,插入的行数。 mysql_autocommit() 切换 autocommit模式,ON/OFF mysql_change_user() 更改打开连接上的用户和数据库。 mysql_charset_name() 返回用于连接的默认字符集的名称。 mysql_close() 关闭服务器连接。 mysql_commit() 提交事务。 连接到MySQL服务器。该函数已不再被重视,使用mysql_connect() mysql_real_connect()取代。 创建数据库。该函数已不再被重视,使用SQL语句CREATE DATABASEmysql_create_db() 取而代之。 mysql_data_seek() 在查询结果集中查找属性行编号。 mysql_debug() 用给定的字符串执行DBUG_PUSH。 mysql_drop_db() 撤销数据库。该函数已不再被重视,使用SQL语句DROP DATABASE 取而代之。 mysql_dump_debug_info() 让服务器将调试信息写入日志。 确定是否读取了结果集的最后一行。该函数已不再被重视,可以使mysql_eof() 用mysql_errno()或mysql_error()取而代之。 mysql_errno() 返回上次调用的MySQL函数的错误编号。 mysql_error() 返回上次调用的MySQL函数的错误消息。 mysql_escape_string() 为了用在SQL语句中,对特殊字符进行转义处理。 mysql_fetch_field() 返回下一个表字段的类型。 mysql_fetch_field_direct() 给定字段编号,返回表字段的类型。 mysql_fetch_fields() 返回所有字段结构的数组。 mysql_fetch_lengths() 返回当前行中所有列的长度。 mysql_fetch_row() 从结果集中获取下一行 mysql_field_seek() 将列光标置于指定的列。 mysql_field_count() 返回上次执行语句的结果列的数目。 mysql_field_tell() 返回上次mysql_fetch_field()所使用字段光标的位置。 mysql_free_result() 释放结果集使用的内存。 mysql_get_client_info() 以字符串形式返回客户端版本信息。 mysql_get_client_version() 以整数形式返回客户端版本信息。 mysql_get_host_info() 返回描述连接的字符串。 mysql_get_server_version() 以整数形式返回服务器的版本号。 mysql_get_proto_info() 返回连接所使用的版本。 mysql_get_server_info() 返回服务器的版本号。 mysql_info() 返回关于最近所执行查询的信息。 mysql_init() 获取或初始化MYSQL结构。 mysql_insert_id() 返回上一个查询为AUTO_INCREMENT列生成的ID。 mysql_kill() 杀死给定的线程。 mysql_library_end() 最终确定MySQL C API库。 mysql_library_init() 初始化MySQL C API库。 mysql_list_dbs() 返回与简单正则表达式匹配的数据库名称。 mysql_list_fields() 返回与简单正则表达式匹配的字段名称。 mysql_list_processes() 返回当前服务器线程的列表。 mysql_list_tables() 返回与简单正则表达式匹配的表名。 mysql_more_results() 检查是否还存在其他结果。 mysql_next_result() 在多语句执行过程中返回/初始化下一个结果。 mysql_num_fields() 返回结果集中的列数。 mysql_num_rows() 返回结果集中的行数。 mysql_options() 为mysql_connect()设置连接选项。 mysql_ping() 检查与服务器的连接是否工作,如有必要重新连接。 mysql_query() 执行指定为“以Null终结的字符串”的SQL查询。 mysql_real_connect() 连接到MySQL服务器。 考虑到连接的当前字符集,为了在SQL语句中使用,对字符串中的mysql_real_escape_string() 特殊字符进行转义处理。 mysql_real_query() 执行指定为计数字符串的SQL查询。 mysql_refresh() 刷新或复位表和高速缓冲。 mysql_reload() 通知服务器再次加载授权表。 mysql_rollback() 回滚事务。 mysql_row_seek() 使用从mysql_row_tell()返回的值,查找结果集中的行偏移。 mysql_row_tell() 返回行光标位置。 mysql_select_db() 选择数据库。 mysql_server_end() 最终确定嵌入式服务器库。 mysql_server_init() 初始化嵌入式服务器库。 mysql_set_server_option() 为连接设置选项(如多语句)。 mysql_sqlstate() 返回关于上一个错误的SQLSTATE错误代码。 mysql_shutdown() 关闭数据库服务器。 mysql_stat() 以字符串形式返回服务器状态。 mysql_store_result() 检索完整的结果集至客户端。 mysql_thread_id() 返回当前线程ID。 mysql_thread_safe() 如果客户端已编译为线程安全的,返回1。 mysql_use_result() 初始化逐行的结果集检索。 mysql_warning_count() 返回上一个SQL语句的告警数。 与MySQL交互时,应用程序应使用该一般性原则: 1. 通过调用mysql_library_init(),初始化MySQL库。库可以是mysqlclient C客户端库,或mysqld嵌入式服务器库,具体情况取决于应用程序是否与“-libmysqlclient”或“-libmysqld”标志链接。 2. 通过调用mysql_init()初始化连接处理程序,并通过调用mysql_real_connect()连接到服务器。 3. 发出SQL语句并处理其结果。(在下面的讨论中,详细介绍了使用它的方法)。 4. 通过调用mysql_close(),关闭与MySQL服务器的连接。 5. 通过调用mysql_library_end(),结束MySQL库的使用。 调用mysql_library_init()和mysql_library_end()的目的在于,为MySQL库提供恰当的初始化和结束处理。对于与客户端库链接的应用程序,它们提供了改进的内存管理功能。如果不调用mysql_library_end(),内存块仍将保持分配状态(这不会增加应用程序使用的内存量,但某些内存泄漏器将抗议它)。对于与嵌入式服务器链接的应用程序,这些调用会启动并停止服务器。 mysql_library_init()和mysql_library_end()实际上是#define符号,这类符号使得它们等效于mysql_server_init()和mysql_server_end(),但其名称更清楚地指明,无论应用程序使用的是mysqlclient或mysqld库,启动或结束MySQL库时,应调用它们。对于早期的MySQL版本,可调用mysql_server_init()和mysql_server_end()取而代之。 如果愿意,可省略对mysql_library_init()的调用,这是因为,必要时,mysql_init()会自动调用它。 要想连接到服务器,可调用mysql_init()来初始化连接处理程序,然后用该处理程序(以及其他信息,如主机名、用户名和密码)调用mysql_real_connect()。建立连接后,在低于5.0.3版的API中,mysql_real_connect()会将再连接标志(MYSQL结构的一部分)设置为1,或在较新的版本中,将其设置为0。对于该标志,值“1”指明,如果因连接丢失而无法执行语句,放弃之前,会尝试再次连接到服务器。从MySQL 5.0.13开始,可以在mysql_options()上使用MYSQL_OPT_RECONNECT选项,以控制再连接行为。完成连接后,调用mysql_close()中止它。 当连接处于活动状态时,客户端或许会使用mysql_query()或mysql_real_query()向服务器发出SQL查询。两者的差别在于,mysql_query()预期的查询为指定的、由Null终结的字符串,而mysql_real_query()预期的是计数字符串。如果字符串包含二进制数据(其中可能包含Null字节),就必须使用mysql_real_query()。 对于每个非SELECT查询(例如INSERT、UPDATE、DELETE),通过调用mysql_affected_rows(),可发现有多少行已被改变(影响)。 对于SELECT查询,能够检索作为结果集的行。注意,某些语句因其返回行,类似与SELECT。包括SHOW、DESCRIBE和EXPLAIN。应按照对待SELECT语句的方式处理它们。 客户端处理结果集的方式有两种。一种方式是,通过调用mysql_store_result(),一次性地检索整个结果集。该函数能从服务器获得查询返回的所有行,并将它们保存在客户端。第二种方式是针对客户端的,通过调用mysql_use_result(),对“按行”结果集检索进行初始化处理。该函数能初始化检索结果,但不能从服务器获得任何实际行。 在这两种情况下,均能通过调用mysql_fetch_row()访问行。通过mysql_store_result(),mysql_fetch_row()能够访问以前从服务器获得的行。通过mysql_use_result(),mysql_fetch_row()能够实际地检索来自服务器的行。通过调用mysql_fetch_lengths(),能获得关于各行中数据大小的信息。 完成结果集操作后,请调用mysql_free_result()释放结果集使用的内存。 这两种检索机制是互补的。客户端程序应选择最能满足其要求的方法。实际上,客户端最常使用的是mysql_store_result()。 mysql_store_result()的1个优点在于,由于将行全部提取到了客户端上,你不仅能连续访问行,还能使用mysql_data_seek()或mysql_row_seek()在结果集中向前或向后移动,以更改结果集内当前行的位置。通过调用mysql_num_rows(),还能发现有多少行。另一方面,对于大的结果集,mysql_store_result()所需的内存可能会很大,你很可能遇到内存溢出状况。 mysql_use_result()的1个优点在于,客户端所需的用于结果集的内存较少,原因在于,一次它仅维护一行(由于分配开销较低,mysql_use_result()能更快)。它的缺点在于,你必须快速处理每一行以避免妨碍服务器,你不能随机访问结果集中的行(只能连续访问行),你不知道结果集中有多少行,直至全部检索了它们为止。不仅如此,即使在检索过程中你判定已找到所寻找的信息,也必须检索所有的行。 通过API,客户端能够恰当地对查询作出响应(仅在必要时检索行),而无需知道查询是否是SELECT查询。可以在每次mysql_query()或mysql_real_query()后,通过调用mysql_store_result()完成该操作。如果结果集调用成功,查询为SELECT,而且能够读取行。如果结果集调用失败,可调用mysql_field_count()来判断结果是否的确是所预期的。如果mysql_field_count()返回0,查询不返回数据(表明它是INSERT、UPDATE、DELETE等),而且不返回行。如果mysql_field_count() 是非0值,查询应返回行,但没有返回行。这表明查询是失败了的SELECT。关于如何实现该操作的示例,请参见关于mysql_field_count()的介绍。 无论是mysql_store_result()还是mysql_use_result(),均允许你获取关于构成结果集的字段的信息(字段数目,它们的名称和类型等)。通过重复调用mysql_fetch_field(),可以按顺序访问行内的字段信息,或者,通过调用mysql_fetch_field_direct(),能够在行内按字段编号访问字段信息。通过调用mysql_field_seek(),可以改变当前字段的光标位置。对字段光标的设置将影响后续的mysql_fetch_field()调用。此外,你也能通过调用mysql_fetch_fields(),一次性地获得关于字段的所有信息。 为了检测和通报错误,MySQL提供了使用mysql_errno()和mysql_error()函数访问错误信息的机制。它们能返回关于最近调用的函数的错误代码或错误消息,最近调用的函数可能成功也可能失败,这样,你就能判断错误是在何时出现的,以及错误是什么。 25.2.4. C API预处理语句 MySQL客户端,服务器协议提供了预处理语句。该功能采用了由mysql_stmt_init()初始化函数返回的MYSQL_STMT语句处理程序数据结构。对于多次执行的语句,预处理执行是一种有效的方式。首先对语句进行解析,为执行作好准备。接下来,在以后使用初始化函数返回的语句句柄执行一次或多次。 对于多次执行的语句,预处理执行比直接执行快,主要原因在于,仅对查询执行一次解析操作。在直接执行的情况下,每次执行语句时,均将进行查询。此外,由于每次执行预处理语句时仅需发送参数的数据,从而减少了网络通信量。 预处理语句的另一个优点是,它采用了二进制协议,从而使得客户端和服务器之间的数据传输更有效率。 下述语句可用作预处理语句:CREATE TABLE、DELETE、DO、INSERT、REPLACE、SELECT、SET、UPDATE、以及大多数SHOW语句。在MySQL 5.1中,不支持其他语句。 25.2.5. C API预处理语句的数据类型 预处理语句主要使用MYSQL_STMT和MYSQL_BIND数据结构。第3种结构MYSQL_TIME用于传输暂时性数据。 ? MYSQL_STMT 该结构表示预处理语句。通过调用mysql_stmt_init()创建语句,返回语句句柄,即指向MYSQL_STMT的指针。该句柄用户所有后续的与语句有关的函数,直至使用mysql_stmt_close()关闭了它为止。 MYSQL_STMT结构没有供应用程序使用的参数。此外,不应尝试复制MYSQL_STMT结构。不保证这类复制物会有用。 多个语句句柄能够与单个连接关联起来。对句柄数目的限制取决于系统资源。 ? MYSQL_BIND 该结构用于语句输入(发送给服务器的数据值)和输出(从服务器返回的结果值)。对于输入,它与mysql_stmt_bind_param()一起使用,用于将参数数据值绑定到缓冲区上,以供mysql_stmt_execute()使用。对于输出,它与mysql_stmt_bind_result()一起使用,用于绑定结果缓冲区,以便用于with mysql_stmt_fetch()以获取行。 MYSQL_BIND结构包含下述供应用程序使用的成员。每个成员用于输入和输出,但在某些时候,也能用于不同的目的,具体情况取决于数据传输的方向。 o enum enum_field_types buffer_type 缓冲的类型。在本节后面列出了允许的buffer_type值。对于输入,buffer_type指明了与语句参数捆绑的值类型。对于输出,它指明了你希望从结果缓冲收到的值类型。 o void *buffer 对于输入,这是指向存储语句参数数据值的缓冲的指针。对于输出,它是指向返回结果集列值的缓冲的指针。对于数值列类型,缓冲应指向恰当的C类型变量(如果将该变量与具有UNSIGNED属性的列关联起来,变量unsigned C类型。通过使用is_unsigned成员,指明变量是signed或unsigned类型,详情请参见本节后面的介绍)。对于日期和时间列类型,缓冲应指向MYSQL_TIME结构。对于字符和二进制字符串列类型,缓冲应指向字符缓冲区。 o unsigned long buffer_length *buffer的实际大小,单位为字节。它指明了可保存在缓冲区内的最大数据。对于字符和二进制C数据,buffer_length值指定了与mysql_stmt_bind_param()一起使用时的*buffer长度,或与mysql_stmt_bind_result()一起使用时能够提取到缓冲区内的最大数据。 o unsigned long *length 指向unsigned long变量的指针,该变量指明了存储在*buffer中数据的实际字节数。“length”用于字符或二进制C数据。对于输入参数数据绑定,“length”指向unsigned long变量,该变量指明了存储在*buffer中参数值的长度,供mysql_stmt_execute()使用。对于输出值绑定,mysql_stmt_fetch()会将返回的列值保存到“length”指向的变量中。 对于数值和临时数据类型,“length”将被忽略,原因在于,数据值的长度是由buffer_type值决定的。 o my_bool *is_null 该成员指向my_bool变量,如果值为NULL,该变量为“真”,如果值为非Null,该变量为“假”。对于输入,将*is_null设置为“真”,指明以语句参数的形式传递NULL值。对于输出,如果从语句返回的结果集列值为NULL,当获取了行后,该值将被设为“真”。 “is_null”是指向布尔类型的指针,而不是布尔标量,以便能以下述方式使用它: ? 如果数据值总是NULL,使用MYSQL_TYPE_NULL绑定列。 ? 如果数据值总是NOT NULL,设置is_null = (my_bool*) 0。 ? 在所有其他情况下,应将is_null设置为my_bool变量的地址,并在各次执行之间恰当地更改变量的值,以指明数据值是NULL或NOT NULL。 o my_bool is_unsigned 该成员用于整数类型。(对应于MYSQL_TYPE_TINY、MYSQL_TYPE_SHORT、MYSQL_TYPE_LONG、以及MYSQL_TYPE_LONGLONG类型的代码)。对于无符号类型,应将“is_unsigned”设置为“真”,对于带符号类型,应将其设置为“假”。 o my_bool error 对于输出,该成员用于通报数据截短错误。必须通过调用带有MYSQL_REPORT_DATA_TRUNCATION选项的mysql_options(),启用截短通报功能。允许该功能后,mysql_stmt_fetch()返回MYSQL_DATA_TRUNCATED,而且对于出现截短情况的参数,在MYSQL_BIND结构中,错误标志为“真”。截短指明丢失了符号或有效位数,或字符串过长以至于无法容纳在1列中。 要想使用MYSQL_BIND结构,应将其内容置为0以便初始化它,然后对其进行设置,恰当地描述它。例如,要想声明并初始化三个MYSQL_BIND结构的数组,可使用下述代码: MYSQL_BIND bind[3]; memset(bind, 0, sizeof(bind)); ? MYSQL_TIME 该结构用于将DATE、TIME、DATETIME和TIMESTAMP数据直接发送到服务器,或从服务器直接接收这类数据。将MYSQL_BIND结构的buffer_type成员设置为临时值之一,并将buffer成员设置为指向MYSQL_TIME结构,即可实现该点。 MYSQL_TIME结构包含下述成员: o unsigned int year 年份 o unsigned int month 月份 o unsigned int day 天 o unsigned int hour 小时 o unsigned int minute 分钟 o unsigned int second 秒 o my_bool neg 布尔标志,用于指明时间是否为负数。 o unsigned long second_part 秒的分数部分。该成员目前不使用。 仅使用施加在给定临时类型值上的MYSQL_TIME结构的部分:用于DATE、DATETIME和TIMESTAMP 的年、月、日部分。用于TIME、DATETIME和TIMESTAMP值的小时、分钟、秒部分。请参见25.2.10 节,“日期和时间值的C API处理”。 在下面的表格中,给出了可在MYSQL_BIND结构的buffer_type成员中指定的允许值。在该表中, 还给出了与每个buffer_type值最接近的对应SQL类型,对于数值和临时类型,给出了对应的C 类型。 buffer_type值 SQL类型 C类型 MYSQL_TYPE_TINY TINYINT char MYSQL_TYPE_SHORT SMALLINT short int MYSQL_TYPE_LONG INT int MYSQL_TYPE_LONGLONG BIGINT long long int MYSQL_TYPE_FLOAT FLOAT float MYSQL_TYPE_DOUBLE DOUBLE double MYSQL_TYPE_TIME TIME MYSQL_TIME MYSQL_TYPE_DATE DATE MYSQL_TIME MYSQL_TYPE_DATETIME DATETIME MYSQL_TIME MYSQL_TYPE_TIMESTAMP TIMESTAMP MYSQL_TIME MYSQL_TYPE_STRING CHAR MYSQL_TYPE_VAR_STRING VARCHAR MYSQL_TYPE_TINY_BLOB TINYBLOB/TINYTEXT MYSQL_TYPE_BLOB BLOB/TEXT MYSQL_TYPE_MEDIUM_BLOB MEDIUMBLOB/MEDIUMTEXT MYSQL_TYPE_LONG_BLOB LONGBLOB/LONGTEXT 隐式类型转换可沿两个方向执行。 25.2.6. C API预处理语句函数概述 在此归纳了预处理语句处理功能可使用的函数,并在后面的章节中详细介绍了它。请参见25.2.7 节,“C API预处理语句函数描述”。 函数 描述 返回由预处理语句UPDATE、DELETE或INSERT变更、删除或插入mysql_stmt_affected_rows() 的行数目。 mysql_stmt_attr_get() 获取预处理语句属性的值。 mysql_stmt_attr_set() 设置预处理语句的属性。 将应用程序数据缓冲与预处理SQL语句中的参数标记符关联起mysql_stmt_bind_param() 来。 mysql_stmt_bind_result() 将应用程序数据缓冲与结果集中的列关联起来。 mysql_stmt_close() 释放预处理语句使用的内存。 mysql_stmt_data_seek() 寻找语句结果集中的任意行编号。 mysql_stmt_errno() 返回上次语句执行的错误编号。 mysql_stmt_error() 返回上次语句执行的错误消息。 mysql_stmt_execute() 执行预处理语句。 mysql_stmt_fetch() 从结果集获取数据的下一行,并返回所有绑定列的数据。 mysql_stmt_fetch_column() 获取结果集当前行中某列的数据。 mysql_stmt_field_count() 对于最近的语句,返回结果行的数目。 mysql_stmt_free_result() 释放分配给语句句柄的资源。 mysql_stmt_init() 为MYSQL_STMT结构分配内存并初始化它。 mysql_stmt_insert_id() 对于预处理语句的AUTO_INCREMENT列,返回生成的ID。 mysql_stmt_num_rows() 从语句缓冲结果集返回总行数。 mysql_stmt_param_count() 返回预处理SQL语句中的参数数目。 mysql_stmt_param_metadata() 返回结果集的参数元数据。 mysql_stmt_prepare() 为执行操作准备SQL字符串。 mysql_stmt_reset() 复位服务器中的语句缓冲区。 mysql_stmt_result_metadata() 以结果集形式返回预处理语句元数据。 使用从mysql_stmt_row_tell()返回的值,查找语句结果集中的mysql_stmt_row_seek() 行偏移。 mysql_stmt_row_tell() 返回语句行光标位置。 mysql_stmt_send_long_data() 将程序块中的长数据发送到服务器。 mysql_stmt_sqlstate() 返回关于上次语句执行的SQLSTATE错误代码。 mysql_stmt_store_result() 将完整的结果集检索到客户端。 调用mysql_stmt_init()以创建语句句柄,然后调用mysql_stmt_prepare准备语句,调用mysql_stmt_bind_param()提供参数数据,并调用mysql_stmt_execute()执行语句。通过更改mysql_stmt_bind_param()提供的相应缓冲区中的参数值,可重复执行mysql_stmt_execute()。 如果语句是SELECT或任何其他能生成结果集的语句,mysql_stmt_prepare()也会通过mysql_stmt_result_metadata()以MYSQL_RES结果集的形式返回结果集元数据信息。 你可以使用mysql_stmt_bind_result()提供结果缓冲,以便mysql_stmt_fetch()能自动将数据返回给这些缓冲。这是一种按行获取方式。 此外,你也能使用mysql_stmt_send_long_data()将程序块中的文本或二进制数据发送到服务器。请参见25.2.7.25节,“mysql_stmt_send_long_data()”。 完成语句执行后,必须使用mysql_stmt_close()关闭语句句柄,以便与之相关的所有资源均能被释放。 如果通过调用mysql_stmt_result_metadata()获得了SELECT语句的结果集元数据,也应使用mysql_free_result()释放元数据。 执行步骤 要想准备和执行语句,应用程序必须采取下述步骤: 1. 用msyql_stmt_init()创建预处理语句句柄。要想在服务器上准备预处理语句,可调用mysql_stmt_prepare(),并为其传递包含SQL语句的字符串。 2. 如果语句生成了结果集,调用mysql_stmt_result_metadata()以获得结果集元数据。虽然与包含查询返回列的结果集不同,该元数据本身也采用了结果集的形式。元数据结果集指明了结果中包含多少列,并包含每一列的信息。 3. 使用mysql_stmt_bind_param()设置任何参数的值。必须设置所有参数。否则,语句执行将返回错误,或生成无法预料的结果。 4. 调用mysql_stmt_execute()执行语句。 5. 如果语句生成了结果集,捆绑数据缓冲,通过调用mysql_stmt_bind_result(),检索行值。 6. 通过重复调用mysql_stmt_fetch(),按行将数据提取到缓冲区,直至未发现更多行为止。 7. 通过更改参数值并再次执行语句,重复步骤3到步骤6。 调用mysql_stmt_prepare()时,MySQL客户端,服务器协议将执行下述动作: ? 服务器解析语句,并通过赋值语句ID将OK状态发回客户端。此外,如果它是面向结果集的语句,还将发送总的参数数目,列计数和元数据。在此调用过程中,服务器将检查语句的所有语法和语义。 客户端采用该语句ID用于进一步操作,以便服务器能从其语句池中识别语句。? 调用mysql_stmt_execute()时,MySQL客户端,服务器协议将执行下述动作: ? 客户端使用语句句柄,并将参数数据发送到服务器。 ? 服务器使用由客户端提供的ID来识别语句,用新提供的数据替换参数标记符,并执行语句。如果语句生成了结果集,服务器将数据发回客户端。否则,服务器会将发送OK状态,以及总的变更、删除和插入行数。 调用mysql_stmt_fetch()时,MySQL客户端,服务器协议将执行下述动作: ? 客户端按行从信息包读取数据,并通过执行必要的转换操作将其放入应用程序数据缓冲中。如果应用程序的缓冲类型与服务器返回的字段类型相同,转换十分简明。 如果出现了错误,可分别使用mysql_stmt_errno()、mysql_stmt_error()和mysql_stmt_sqlstate() 获取语句错误代码、错误消息和SQLSTATE值。 预处理语句日志功能 对于与mysql_stmt_prepare()和mysql_stmt_execute() C API函数一起执行的预处理语句,服务器会将“准备”和“执行”行写入一般查询日志,以便你能了解语句是在何时准备和执行的。 假定按下述方式准备和执行了语句: 1. 调用mysql_stmt_prepare()以准备语句字符串"SELECT ?"。 2. 调用mysql_stmt_bind_param()将值“3”绑定到预处理语句中的参数。 3. 调用mysql_stmt_execute(),执行预处理语句。 上述调用的结果是,服务器将下述行写入一般查询日志: Prepare [1] SELECT ? Execute [1] SELECT 3 日志中的每个“准备”和“执行”行均具有[n]语句ID标识,这样,你就能跟踪已记录的预处理语句。N是正整数。对于客户端,如果同时有多个活动的预处理语句,n可能会大于1。替换了“?”参数的数据值后,每个“执行”行将显示一条预处理语句。 版本说明:在MySQL 4.1.10之前,显示的“准备”行无[n]标识。在MySQL 4.1.10之前,不显示“执行”行。 25.2.10. 日期和时间值的C API处理 二进制协议允许你使用MYSQL_TIME结构发送和接受日期和时间值(DATE、TIME、DATETIME和TIMESTAMP)。在25.2.5节,“C API预处理语句的数据类型”中,介绍了该结构的成员。 要想发送临时数据值,可使用mysql_stmt_prepare()创建预处理语句。然后,在调用mysql_stmt_execute()执行语句之前,可采用下述步骤设置每个临时参数: 1. 在与数据值相关的MYSQL_BIND结构中,将buffer_type成员设置为相应的类型,该类型指明了发送的临时值类型。对于DATE、TIME、DATETIME或TIMESTAMP值,将buffer_type分别设置为MYSQL_TYPE_DATE、MYSQL_TYPE_TIME、MYSQL_TYPE_DATETIME或MYSQL_TYPE_TIMESTAMP。 2. 将MYSQL_BIND结构的缓冲成员设置为用于传递临时值的MYSQL_TIME结构的地址。 3. 填充MYSQL_TIME结构的成员,使之与打算传递的临时支的类型相符。 使用mysql_stmt_bind_param()将参数数据绑定到语句。然后可调用mysql_stmt_execute()。 要想检索临时值,可采用类似的步骤,但应将buffer_type成员设置为打算接受的值的类型,并将缓冲成员设为应将返回值置于其中的MYSQL_TIME结构的地址。调用mysql_stmt_execute()之后,并在获取结果之前,使用mysql_bind_results()将缓冲绑定到语句上。 下面给出了一个插入DATE、TIME和TIMESTAMP数据的简单示例。假定mysql变量具有有效的连接句柄。 MYSQL_TIME ts; MYSQL_BIND bind[3]; MYSQL_STMT *stmt; strmov(query, "INSERT INTO test_table(date_field, time_field, timestamp_field) VALUES(?,?,?"); stmt = mysql_stmt_init(mysql); if (!stmt) { fprintf(stderr, " mysql_stmt_init(), out of memory\n"); exit(0); } if (mysql_stmt_prepare(mysql, query, strlen(query))) { fprintf(stderr, "\n mysql_stmt_prepare(), INSERT failed"); fprintf(stderr, "\n %s", mysql_stmt_error(stmt)); exit(0); } /* set up input buffers for all 3 parameters */ bind[0].buffer_type= MYSQL_TYPE_DATE; bind[0].buffer= (char *)&ts; bind[0].is_null= 0; bind[0].length= 0; ... bind[1]= bind[2]= bind[0]; ... mysql_stmt_bind_param(stmt, bind); /* supply the data to be sent in the ts structure */ ts.year= 2002; ts.month= 02; ts.day= 03; ts.hour= 10; ts.minute= 45; ts.second= 20; mysql_stmt_execute(stmt); ..
/
本文档为【认证考试(个人整理)Mysql C API】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索