Heim  >  Artikel  >  Datenbank  >  linux 下的mysql

linux 下的mysql

WBOY
WBOYOriginal
2016-06-07 15:47:161041Durchsuche

gcc myapp.c -o myapp -L/usr/local/lib/mysql -lmysqlclient 如果glibc小于2.3.0的还需要-lz,不然提示找不到compress之类的 MYSQL : 该结构代表 1 个数据库连接的句柄。几乎所有的 MySQL 函数均使用它。不应尝试拷贝 MYSQL 结构。不保证这类拷贝结果会有

gcc myapp.c -o myapp -L/usr/local/lib/mysql -lmysqlclient

如果glibc小于2.3.0的还需要-lz,不然提示找不到compress之类的
     

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开始。

 

预处理语句主要使用MYSQL_STMTMYSQL_BIND数据结构。第3种结构MYSQL_TIME用于传输暂时性数据。

1.MYSQL_STMT

该结构表示预处理语句。通过调用mysql_stmt_init()创建语句,返回语句句柄,即指向MYSQL_STMT的指针。该句柄用户所有后续的与语句有关的函数,直至使用mysql_stmt_close()关闭了它为止。

MYSQL_STMT结构没有供应用程序使用的参数。此外,不应尝试复制MYSQL_STMT结构。不保证这类复制物会有用。

多个语句句柄能够与单个连接关联起来。对句柄数目的限制取决于系统资源。

2. 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成员,指明变量是signedunsigned类型,详情请参见本节后面的介绍)。对于日期和时间列类型,缓冲应指向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变量的地址,并在各次执行之间恰当地更改变量的值,以指明数据值是NULLNOT NULL

o        my_bool is_unsigned

该成员用于整数类型。(对应于MYSQL_TYPE_TINYMYSQL_TYPE_SHORTMYSQL_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));

3. MYSQL_TIME

该结构用于将DATETIMEDATETIMETIMESTAMP数据直接发送到服务器,或从服务器直接接收这类数据。将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结构的部分:用于DATEDATETIMETIMESTAMP的年、月、日部分。用于TIMEDATETIMETIMESTAMP值的小时、分钟、秒部分。

 

MYSQL_TIME  recdate;

MYSQL_BIND  *m_param;

MYSQL_STMT  *m_stmt;

MYSQL m_pDB;

CDatabase *m_pdb //

m_stmt = mysql_stmt_init(&(m_pdb->m_pDB))

MYSQL_STMT * mysql_stmt_init()初始化函数返回的MYSQL_STMT语句处理程序数据结构。注意返回类型。

mysql_stmt_prepare()为执行操作准备SQL字符串。

mysql_stmt_param_count()返回预处理SQL语句中的参数数目。

mysql_stmt_bind_param()将应用程序数据缓冲与预处理SQL语句中的参数标记符关联起来。

mysql_stmt_error()返回上次语句执行的错误消息。

mysql_stmt_execute() 执行预处理语句。

mysql_stmt_close()释放预处理语句使用的内存。

调用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_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客户端/服务器协议将执行下述动作:

·         服务器解析语句,并通过赋值语句IDOK状态发回客户端。此外,如果它是面向结果集的语句,还将发送总的参数数目,列计数和元数据。在此调用过程中,服务器将检查语句的所有语法和语义。

·         客户端采用该语句ID用于进一步操作,以便服务器能从其语句池中识别语句。

调用mysql_stmt_execute()时,MySQL客户端/服务器协议将执行下述动作:

·         客户端使用语句句柄,并将参数数据发送到服务器。

·         服务器使用由客户端提供的ID来识别语句,用新提供的数据替换参数标记符,并执行语句。如果语句生成了结果集,服务器将数据发回客户端。否则,服务器会将发送OK状态,以及总的变更、删除和插入行数。

调用mysql_stmt_fetch()时,MySQL客户端/服务器协议将执行下述动作:

·         客户端按行从信息包读取数据,并通过执行必要的转换操作将其放入应用程序数据缓冲中。如果应用程序的缓冲类型与服务器返回的字段类型相同,转换十分简明。

如果出现了错误,可分别使用mysql_stmt_errno()mysql_stmt_error()mysql_stmt_sqlstate()获取语句错误代码、错误消息和SQLSTATE值。

 

 

很好的网站:

http://dev.mysql.com/doc/refman/5.1/zh/apis.html 

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn