数据库 数据库编程一
连接到数据库 mysql_init(MYSQL *pmysql); MYSQL *mysql_real_connect(MYSQL * pmysql,const char * hostname,const char *usename,const char *passwd,const char *dbname,0,0,0); 连接到MySQL必须先调用mysql_init初始化 之后调用mysql_real_connect连接到数据库 mysql_real_connect成功返回指向MySQL连接的指针,失败返回NULL;
执行SQL语句 int mysql_query(MYSQL *pmysql,const char *sql); 参数pmysql是连接到mySQL的指针。 参数sql是要执行的SQL语句。 成功返回0,失败返回非0。
Linux下,printf函数必须以'\n'结尾才可以输出到屏幕,如果没有'\n'直到输出缓冲区满了以后才会打印到屏幕上(敲击换行也算),这里可以使用write函数代替。
//数据库编程 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include "mysql/mysql.h" #define GTC_DEBUG #ifdef GTC_DEBUG #define GTC_LOG(format,...) fprintf(stderr, format, ##__VA_ARGS__); fprintf(stderr, "\n") #else #define GTC_LOG(format,...) #endif /* * mysql编程步骤 * 第一步:头文件 #include "mysql/mysql.h" * 第二步:makefile文件链接时添加动态库-lmysqlclient * * * 数据库client与server之间也是采用TCP/IP协议 * 1.初始化client * 2.建立连接 * 3.client向server发送SQL语句,server将执行SQL语句的结果返回client * 4.断开连接 * */ int test() { int errCode = 0; MYSQL *handler = NULL; /* 知识补充: 在一个非多线程的环境中,调用mysql_library_init()可能可以省略,因为 mysql_init()将在必要的时候自动调用它。 然而mysql_library_init()在多线程环境中并不是安全的,mysql_init()自动调用mysql_library_init()时也同样不安全。 因此,要么你在增加任何线程之前调用mysql_library_init(),要么使用mutex来保护这个调用(不管是直接调用mysql_library_init()
还是间接通过调用mysql_init()调用)。 这个步骤必须在任何其他客户端库调用之前完成。 */ //1.全局初始化 mysql_library_init(0, NULL, NULL); do { /* 知识补充: 配或初始化与mysql_real_connect()相适应的MYSQL对象 如果mysql是NULL指针,该函数将分配、初始化、并返回新对象(即系统分配内存) 否则,将初始化对象,并返回对象的地址(即用户自己分配了内存) 如果mysql_init()是由系统分配内存,当调用mysql_close()来关闭连接时。将释放该内存 注意:如果是用户分配了内存,返回的对象就是用户定义变量的地址 */ //2.初始化句柄 handler = mysql_init(NULL); if (NULL == handler) { errCode = -1; GTC_LOG("fail: mysql_init"); break; } /* 知识补充: 如果连接成功,返回MYSQL*连接句柄。如果连接失败,返回NULL。 对于成功的连接,返回值与第1个参数的值相同。 */ //3.连接数据库 if (NULL == mysql_real_connect(handler, "192.168.88.120", "root", "ynt#123456", "transaction", 3306, NULL, 0)) { errCode = -1; GTC_LOG("mysql: %s", mysql_error(handler)); break; } { // 4.设置自动重连 my_bool reconnect = 1; mysql_options(handler, MYSQL_OPT_RECONNECT, &reconnect); } //5.设置数据库连接(重要,如果不执行这个SQL语句,mysql不知道需要访问的数据库) mysql_select_db(handler, "transaction"); //6.字符集设置(重要,如果不执行这个SQL语句,数据库不能识别用户输入的sql语句中的中文) mysql_set_character_set(handler, "utf8mb4"); //7.数据库操作 } while (0); //资源释放 if (handler) { mysql_close(handler); handler = NULL; } //全局资源释放(重要,如果不执行mysql_library_end(),将会有部分资源不会被释放) mysql_library_end(); return errCode; } int main(int arg, char *args[]) { test(); printf("------ok-----\n"); return 0; }
mysql C语音API进行远程数据查询时,对sql语句的长度有限制,会报的错误经常是语法错误 例如 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right
syntax to use near 'DROP TABLE default_gh11_1;DROP TABLE default_gh11_10;DROP TABLE d
执行SELECT语句得到查询结果 MYSQL_RES *mysql_store_result(MYSQL *pmysql); 成功返回一个查询结果指针,查询无结果或者错误返回NULL。 mysql_free_result(MYSQL_RES *res) 调用完mysql_store_result,一定要用mysql_free_result释放相关的资源。
查看查询结果 MYSQL_ROW mysql_fetch_row(MYSQL_RES *result); 例子 while(row=mysql_fetch_row(result)!=NULL) { printf("name:%s,sec:%s,age:%s,class:%s\n",row[0],row[1],row[2],row[3]); } 尽管在表中age是数字,但是Mysql返回的只不过是以NULL结尾的字符串
//数据库编程 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <mysql/mysql.h> int main(int arg, char *args[]) { MYSQL mysql, *connection; mysql_init(&mysql); connection = mysql_real_connect(&mysql, "localhost", "dbuser1", "123456", "db1", 0, 0, 0); if (connection == NULL) { /*mysql_error()打印错误原因*/ printf("mysql_real_connect() failed ! error message:%s \n", mysql_error(&mysql)); return -1; } /*执行任何mysql都必须设置字符集*/ if (mysql_query(connection, "SET NAMES utf8") != 0) { printf("SET NAMES failed! \n"); } /*mysql_query函数只适合更新操作,因为mysql_query()无法返回数据集,所以需要更多的处理*/ if (mysql_query(connection, "SELECT * FROM table1") != 0) { printf("SELECT failed! \n"); } /* * 调用mysql_store_result()获取查询结果,结果放到结构MYSQL_RES中 * */ MYSQL_RES *result = mysql_store_result(connection); if(result==NULL) { printf("mysql_store_result() failed! \n"); } MYSQL_ROW row ; while(1) { row= mysql_fetch_row(result); if(row==NULL) break; printf("name:%s;sex:%s;age:%s;class:%s\n", row[0], row[1], row[2], row[3]); } //释放相关资源 mysql_free_result(result); mysql_close(connection); return 0; }
查看查询结果中的字段信息 MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result); 例子 while(sqlfield=mysql_fetch_field(result)!=NULL) { printf("%s\n",sqlfield->name); }
//数据库编程 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <mysql/mysql.h> int main(int arg, char *args[]) { MYSQL mysql, *connection; mysql_init(&mysql); connection = mysql_real_connect(&mysql, "localhost", "dbuser1", "123456", "db1", 0, 0, 0); if (connection == NULL) { /*mysql_error()打印错误原因*/ printf("mysql_real_connect() failed ! error message:%s \n", mysql_error(&mysql)); return -1; } /*执行任何mysql都必须设置字符集*/ if (mysql_query(connection, "SET NAMES utf8") != 0) { printf("SET NAMES failed! \n"); } /*mysql_query函数只适合更新操作,因为mysql_query()无法返回数据集,所以需要更多的处理*/ if (mysql_query(connection, "SELECT * FROM table1") != 0) { printf("SELECT failed! \n"); } /* * 调用mysql_store_result()获取查询结果,结果放到结构MYSQL_RES中 * */ MYSQL_RES *result = mysql_store_result(connection); if(result==NULL) { printf("mysql_store_result() failed! \n"); } /*这里的列是指SELECT查询结果的列,并非是指表所对应的列*/ MYSQL_FIELD *field ; while(1) { field= mysql_fetch_field(result); if(field==NULL) break; printf("name=%s\n",field->name); } //释放相关资源 mysql_free_result(result); mysql_close(connection); return 0; }