初学MySQL,记录一下MySQL用c语言编程时遇到的问题。
这是我的源程序:
1 int main( void ) 2 { 3 MYSQL *mysql= NULL; 4 5 6 if ((mysql=mysql_init(mysql))== NULL) 7 { 8 fprintf(stderr, " Cannot initialize MySQL " ); 9 return 1 ; 10 } 11 if (mysql_real_connect(mysql, " localhost " , " kerry " , " beck123 " ,NULL, 0 ,NULL, 0 )== NULL) 12 { 13 fprintf(stderr, " %d:%s \n " ,mysql_errno(mysql),mysql_error(mysql)); 14 return 1 ; 15 } 16 printf( " Succeed!\n " ); 17 return 0 ; 18 }
MySQL的c API有几个重要的数据类型:
-
MYSQL
该结构代表 1 个数据库连接的句柄。几乎所有的 MySQL 函数均使用它。不应尝试拷贝 MYSQL 结构。不保证这类拷贝结果会有用
-
该结构代表返回行的查询结果( SELECT , SHOW , DESCRIBE , EXPLAIN )。在本节的剩余部分,将查询返回的信息称为“结果集”。
-
这是 1 行数据的“类型安全”表示。它目前是按照计数字节字符串的数组实施的。(如果字段值可能包含二进制数据,不能将其当作 由Null 终结的字符串对待,这是因为这类值可能会包含 Null 字节)。行是通过调用 mysql_fetch_row() 获得的。
-
该结构包含关于字段的信息,如字段名、类型和大小。这里详细介绍了其成员。通过重复调用 mysql_fetch_field() ,可为每个字段获得 MYSQL_FIELD 结构。字段值不是该结构的组成部份,它们包含在 MYSQL_ROW 结构中。
-
这是 MySQL 字段列表偏移量的“类型安全”表示(由 mysql_field_seek() 使用 )。偏移量是行内的字段编号,从 0 开始。
声明“MYSQL *mysql=NULL;“,必须为该指针赋值为NULL。如果定义为"MYSQL *mysql;",不为该指针赋值,就会生成野指针,程序运行时会发生“段错误 (核心已转储)“错误。
“野指针”不是NULL指针,是指向“垃圾”内存(不可用内存)的指针。人们一般不会错用NULL指针,因为用if语句很容易判断。但是“野指针”是很危险的,if无法判断一个指针是正常指针还是“野指针”。有个良好的编程习惯是避免“野指针”的唯一方法。
调用mysql_init()函数,该函数会 分配或初始化与 mysql_real_connect() 相适应的 MYSQL 对象。 如果 mysql 是 NULL 指针, 该函数将分配、初始化、并返回新对象。否则,将初始化对象,并返回对象的地址。如果 mysql_init() 分配了新的对象,当调用 mysql_close() 来关闭连接时。将释放该对象。