• QQ
  • nahooten@sina.com
  • 常州市九洲新世界花苑15-2

Android

C/C++ 用MySql数据库的技巧

原创内容,转载请注明原文网址:http://homeqin.cn/a/wenzhangboke/jishutiandi/Android/2019/1014/679.html

 
 
常州平台运营本文对若何应用MySql的API持续MySql数据库,开发环境为VS2008,需求的身边的人可以参考下
 
一、VS2008工程配置事情
 
开始,确立一个windows运用程序的工程,将C/C++->预处分器->预处分器定义下的_WINDOWS改成_CONSOLE,
 
 
 
将持续器->体系->子体系 选定为掌握台。
 
 
 
因为我们要应用Mysql的API,并且我们机子上肯定安置了Mysql数据库,以是我们要将工程的头文件途径指向Mysql安置目次的同文件mysql.h所在的位置,将持续库途径指向libmysql.lib所在的途径,
 
在我的机子上,Mysql 的安置途径为:C:\Program Files\MySQL\MySQL Server 5.1
 
 
 
 
 
我们需求把VS2008的工程中的头文件途径和持续库途径指向上头的两个处所:
 
将x名目属性页的C/C++->通例->附加包含目次指向:C:\Program Files\MySQL\MySQL Server 5.1\include
 
 
 
将名目属性页的链接器->通例->附加库目次指向:C:\Program Files\MySQL\MySQL Server 5.1\lib\opt.
 
 
 
将链接器->输入->附加依附项中增加libmysql.lib。
 
 
 
要是不配置链接器->输入->附加依附项中增加libmysql.lib,辣么会出现如下的错误:
 
1>------ 已启动一切从新生成: 名目: MySql-Connect, 配置: Debug Win32 ------ 
 
1>正在删除名目“MySql-Connect”(配置“Debug|Win32”)的中心文件和输出文件 
 
1>正在编译... 
 
1>MySql_Connect.cpp 
 
1>x:\编程练习\c-c++\c\mysql_connect.cpp(35) : warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 
 
1>    d:\program files\microsoft visual studio 9.0\vc\include\stdio.h(306) : 拜见“scanf”的申明 
 
1>x:\编程练习\c-c++\c\mysql_connect.cpp(72) : warning C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 
 
1>    d:\program files\microsoft visual studio 9.0\vc\include\stdio.h(366) : 拜见“sprintf”的申明 
 
1>x:\编程练习\c-c++\c\mysql_connect.cpp(86) : warning C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 
 
1>    d:\program files\microsoft visual studio 9.0\vc\include\stdio.h(366) : 拜见“sprintf”的申明 
 
1>正在编译常州微信公众平台资源清单... 
 
1>Microsoft (R) Windows (R) Resource Compiler Version 6.1.6723.1 
 
1>Copyright (C) Microsoft Corporation. All rights reserved. 
 
1>正在链接... 
 
1>LINK : 没有找到 d:\我的文档\Visual Studio 2008\Projects\MySql-Connect\Debug\MySql-Connect.exe 或上一个增量链接没有生成它;正在执行彻底链接 
 
1>MySql_Connect.obj : error LNK2019: 无法分析的外部象征 _mysql_close@4,该象征在函数 _main 中被引用 
 
1>MySql_Connect.obj : error LNK2019: 无法分析的外部象征 _mysql_free_result@4,该象征在函数 _main 中被引用 
 
1>MySql_Connect.obj : error LNK2019: 无法分析的外部象征 _mysql_num_fields@4,该象征在函数 _main 中被引用 
 
1>MySql_Connect.obj : error LNK2019: 无法分析的外部象征 _mysql_fetch_row@4,该象征在函数 _main 中被引用 
 
1>MySql_Connect.obj : error LNK2019: 无法分析的外部象征 _mysql_store_result@4,该象征在函数 _main 中被引用 
 
1>MySql_Connect.obj : error LNK2019: 无法分析的外部象征 _mysql_error@4,该象征在函数 _main 中被引用 
 
1>MySql_Connect.obj : error LNK2019: 无法分析的外部象征 _mysql_real_query@12,该象征在函数 _main 中被引用 
 
1>MySql_Connect.obj : error LNK2019: 无法分析的外部象征 _mysql_select_db@8,该象征在函数 _main 中被引用 
 
1>MySql_Connect.obj : error LNK2019: 无法分析的外部象征 _mysql_real_connect@32,该象征在函数 _main 中被引用 
 
1>MySql_Connect.obj : error LNK2019: 无法分析的外部象征 _mysql_init@4,该象征在函数 _main 中被引用 
 
1>d:\我的文档\Visual Studio 2008\Projects\MySql-Connect\Debug\MySql-Connect.exe : fatal error LNK1120: 10 个无法分析的外部号令 
 
1>生成日记留存在“file://d:\我的文档\Visual Studio 2008\Projects\MySql-Connect\MySql-Connect\Debug\BuildLog.htm” 
 
1>MySql-Connect - 11 个错误,3 个警告 
 
========== 一切从新生成: 胜利 0 个,失利 1 个,跳过 0 个 ==========
 
二、持续Mysql和从MySql中取出数据的API分析
 
2.1 mysql_real_connect()
 
2.1.1 函数原型:
 
MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned int client_flag)
 
2.1.2 参数分析:
 
• 第一个参数应该是一个现存MYSQL布局的地点。在挪用mysql_real_connect()以前,你必需挪用mysql_init()初始化MYSQL布局。见下面的例子。
 
• host值可以是一个主机名或一个IP地点。要是host是NULL或字符串"localhost",假设是到内陆主机的一个持续。要是OS支持套接字(Unix)或定名管道(Win32),应用他们而不是TCP/IP与服务器持续。
 
• user参数包含用户的MySQL登录ID。要是user是NULL,假设是目前用户。在Unix下,它是目前登录名。在Windows ODBC下,必需明白地指定目前用户名字。见16.4 怎样填写ODBC经管程序中种种域。
 
• passwd参数为user包含口令。要是passwd是NULL,惟有在user表中对于有一个空缺口令字段的用户的条款将被搜检一个般配。这容许数据库主管配置MySQL权限,应用户获得差别的口令,取决于他们是否曾经指定一个口令。留意:不要试图在挪用mysql_real_connect()前加密口令;口令加密自动被客户API处分。
 
• db是数据库名。要是db不是NULL,持续将缺省数据库配置为这个值。
 
• 要是port不是0,值对于TCP/IP持续将用作端标语。留意host参数决意持续的范例。
 
• 要是unix_socket不是NULL,字符串指定套接字或应该被应用的定名管道。留意host参数决意持续的范例。
 
• client_flag值通常是0,不过在很分外的环境下可以被配置为下列标志的组合:
 
标志名字 意味着的标志
 
CLIENT_FOUND_ROWS 回笼找到的(般配的)行数,不是受到影响的行数。
 
CLIENT_NO_SCHEMA 不容许db_name.tbl_name.col_name语法。这是为了ODBC;要是你应用该语法,造成语法分析器产生一个错误,它是为在少许ODBC程序捕获错误是有效的。
 
CLIENT_COMPRESS 应用压缩和谈。
 
CLIENT_ODBC 客户是一个ODBC客户。这使mysqld变得对ODBC更友爱。
 
2.1.3 回笼值
 
要是持续胜利,一个 MYSQL*持续句柄。要是持续失利,NULL。对一个胜利的持续,回笼值与第一个参数值相像,除非你传递常州微信小程序开发NULL给该参数。
 
2.1.4 错误
 
CR_CONN_HOST_ERROR
 
不行持续MySQL服务器。
 
CR_CONNECTION_ERROR
 
不行持续内陆MySQL服务器。
 
CR_IPSOCK_ERROR
 
不行建立一个IP套接字。
 
CR_OUT_OF_MEMORY
 
内存溢出。
 
CR_SOCKET_CREATE_ERROR
 
不行建立一个Unix套接字。
 
CR_UNKNOWN_HOST
 
不行找到主机名的IP地点。
 
CR_VERSION_ERROR
 
因为试图应用一个差别和谈版本的一个客户库与一个服务器持续造成的一个和谈失配。要是你应用一个最老的客户库持续一个没有应用--old-protocol选项启动的新服务器,这就能产生。
 
CR_NAMEDPIPEOPEN_ERROR;
 
不行在 Win32 上建立一个定名管道。
 
CR_NAMEDPIPEWAIT_ERROR;
 
不行在 Win32 高等待一个定名管道。
 
CR_NAMEDPIPESETSTATE_ERROR;
 
不行在 Win32 上获得一个管道处分器。
 
2.2 mysql_select_db()
 
2.2.1 函数原型
 
int mysql_select_db(MYSQL *mysql, const char *db)
 
2.2.2 参数分析
 
使得由db指定的数据库成为 在由mysql指定的持续上的缺省(目前)数据库。在随后的盘问中,这个数据库对于不包含一个显式的数据库指定符的表的引用是缺省数据库。
 
除非持续的用户能被认证容许应用数据库,否则mysql_select_db()失利。
 
2.2.3 回笼值
 
胜利,零。要是产生一个错误,非零。
 
2.2.4 错误
 
CR_COMMANDS_OUT_OF_SYNC
 
号令以一个不得当的序次被执行。
 
CR_SERVER_GONE_ERROR
 
MySQL服务器关闭了。
 
CR_SERVER_LOST
 
对服务器的持续在盘问期间落空。
 
CR_UNKNOWN_ERROR
 
产生一个未知的错误。
 
2.3 mysql_real_query
 
2.3.1 函数原型
 
int mysql_real_query(MYSQL *mysql, const char *query, unsigned int length)
 
2.3.2 参数分析
 
执行由query指向的SQL盘问,它应该是一个length个字节的字符串。盘问必需由一个单个的SQL语句组成。你不应该在语句后增加一个停止的分号(“;”)或\g。
 
对于包含二进制数据的盘问,你必需应用mysql_real_query()而不是mysql_query(),因为二进制代码数据可能包含“\0”字符,并且,mysql_real_query()比mysql_query()更快,因为它对盘问字符串挪用strlen()。
 
2.3.3 回笼值
 
要是盘问胜利,零。要是产生一个错误,非零。
 
2.3.4 错误
 
CR_COMMANDS_OUT_OF_SYNC
 
号令以一个不得当的序次被执行。
 
CR_SERVER_GONE_ERROR
 
MySQL服务器关闭了。
 
CR_SERVER_LOST
 
对服务器的持续在盘问期间落空。
 
CR_UNKNOWN_ERROR
 
产生一个未知的错误。
 
2.4 mysql_store_result
 
2.4.1 函数原型
 
MYSQL_RES *mysql_store_result(MYSQL *mysql)
 
2.4.2 回笼值
 
A MYSQL_RES result structure with the results. NULL (0) if an error occurred.
 
2.5 mysql_fetch_row()
 
Description
 
Retrieves the next row of a result set. When used after mysql_store_result(), mysql_fetch_row() returns NULL when there are no more rows to retrieve. When used after mysql_use_result(), mysql_fetch_row() returns NULL when there are no more rows to retrieve or if an error occurred.
 
The number of values in the row is given by mysql_num_fields(result). If row holds the return value from a call tomysql_fetch_row(), pointers to the values are accessed as row[0] to row[mysql_num_fields(result)-1]. NULL values in the row are indicated by NULL pointers.
 
The lengths of the field values in the row may be obtained by calling mysql_fetch_lengths(). Empty fields and fields containing NULL both have length 0; you can distinguish these by checking the pointer for the field value. If the pointer is NULL, the field is NULL; otherwise, the field is empty.
 
Return Values
 
A MYSQL_ROW structure for the next row. NULL if there are no more rows to retrieve or if an error occurred.
 
Errors
 
Note that error is not reset between calls to mysql_fetch_row()
 
CR_SERVER_LOST
 
The connection to the server was lost during the query.
 
CR_UNKNOWN_ERROR
 
An unknown error occurred.
 
参考资料:http://dev.mysql.com/doc/refman/5.6/en/index.html
 
三、行使常州网站开发建设Mysql库提供的API编写持续Mysql和从Mysql中取出数据的代码
 
 #include <windows.h>
 
 #include "stdio.h"
 
 #include "winsock.h" 
 
 #include "mysql.h" 
 
  
 
  
 
 int main()
 
 {
 
  
 
 MYSQL * con; //= mysql_init((MYSQL*) 0); 
 
 MYSQL_RES *res;
 
 MYSQL_ROW row;
 
  
 
  
 
 char tmp[400];
 
  
 
 //database configuartion
 
 char dbuser[30]="root"; 
 
 char dbpasswd[30]="apple";
 
 char dbip[30]="localhost";
 
 char dbname[50]="excel";
 
 char tablename[50]="test";
 
 char *query=NULL;
 
  
 
  
 
 int x;
 
 int y;
 
 int rt;//return value
 
 unsigned int t;
 
  
 
 int count = 0;
 
  
 
  
 
 printf("input x,y\r");
 
 scanf("%d,%d",&x,&y);
 
 fflush(stdin);
 
 printf("input over\r");
 
 con = mysql_init((MYSQL*) 0); 
 
  
 
  
 
 if ( con !=NULL && mysql_real_connect(con,dbip,dbuser,dbpasswd,dbname,3306/*TCP IP端口*/,NULL/*Unix Socket 持续范例*/,0/*运转成ODBC数据库标志*/) ) 
 
 { 
 
   if (!mysql_select_db(con,dbname)) 
 
   { 
 
     printf("Select successfully the database!\r"); 
 
     
 
     con ->reconnect = 1; 
 
  
 
     query = "set names \'GBK\'";
 
     //mysql_query(con,"set names \'GBK\'"); 
 
     
 
     rt=mysql_real_query(con,query,strlen(query));
 
     if (rt)
 
     {
 
       printf("Error making query: %s !!!\r",mysql_error(con));
 
     }
 
     else
 
     {
 
       printf("query %s succeed!\r",query);
 
     }
 
     
 
   }
 
 }
 
  
 
 else
 
 {
 
   MessageBoxA(NULL,"Unable to connect the database,check your configuration!","",NULL);
 
  
 
 }
 
  
 
   //sprintf(tmp,"update %s set 商品=\'%s\',卖出=%d,成交=%d,涨跌=%d,买进=%d,总量=%d,涨幅=%f,光阴=\'%s\' where %s",tablename,goods,sold,deal,fluctuate,buy,total,delta,time,UpdateCon);
 
   sprintf(tmp,"insert into %s values(%s,%d,%d)",tablename,"null",x,y); //留意若何向具备自增字段的数据库中插入记录
 
   //MessageBoxA(NULL,tmp,tmp,MB_OK);
 
   //mysql_query(con,tmp);
 
  
 
   rt=mysql_real_query(con,tmp,strlen(tmp));
 
   if (rt)
 
   {
 
     printf("Error making query: %s !!!\r",mysql_error(con));
 
   }
 
   else
 
   {
 
     printf("%s executed!!!\r",tmp);
 
   }
 
   
 
   sprintf(tmp,"select * from %s",tablename);
 
   
 
   rt=mysql_real_query(con,tmp,strlen(tmp));
 
   if (rt)
 
   {
 
     printf("Error making query: %s !!!\r",mysql_error(con));
 
   } 
 
   else
 
   {
 
     printf("%s executed!!!\r",tmp);
 
   }
 
   
 
   res = mysql_store_result(con);//将后果留存在res布局体中
 
  
 
   while(row = mysql_fetch_row(res)) 
 
   { 
 
     /** 
 
     * MYSQL_ROW STDCALL mysql_fetch_row(MYSQL_RES *result); 
 
      * 检索行 
 
     */ 
 
  
 
     for(t=0;t<mysql_num_fields(res);t++) 
 
     { 
 
       printf("%s ",row[t]); 
 
     } 
 
     printf(".............\r"); 
 
     count ++;
 
   } 
 
   printf("number of rows %d\r",count);
 
   printf("mysql_free_result...\r"); 
 
   mysql_free_result(res); 
 
  
 
   mysql_close(con);
 
   return 0;
 
  
 
 }
 
四、运转后果
 
 
 
五、数据库剧本
 
/*
 
Navicat MySQL Data Transfer
 
Source Server : localhost
 
Source Server Version : 50141
 
Source Host : localhost:3306
 
Source Database : excel
 
Target Server Type : MYSQL
 
Target Server Version : 50141
 
File Encoding : 65001
 
Date: 2011-09-23 10:41:43
 
*/
 
 SET FOREIGN_KEY_CHECKS=0;
 
 -- ----------------------------
 
 -- Table structure for `test`
 
 -- ----------------------------
 
 DROP TABLE IF EXISTS `test`;
 
 CREATE TABLE `test` (
 
  `x` bigint(4) NOT NULL AUTO_INCREMENT,
 
  `y` int(4) DEFAULT NULL,
 
  `z` int(4) DEFAULT NULL,
 
  PRIMARY KEY (`x`)
 
 ) ENGINE=InnoDB AUTO_INCREMENT=118 DEFAULT CHARSET=latin1;
 
  
 
 -- ----------------------------
 
 -- Records of test
 
 -- ----------------------------
 
 INSERT INTO `test` VALUES ('95', '12432', '4334');
 
 INSERT INTO `test` VALUES ('96', '213', '321');
 
 INSERT INTO `test` VALUES ('97', '213', '213');
 
 INSERT INTO `test` VALUES ('98', '123', '231');
 
 INSERT INTO `test` VALUES ('99', '321', '231');
 
 INSERT INTO `test` VALUES ('100', '123', '32132');
 
 INSERT INTO `test` VALUES ('101', '777', '32213');
 
 INSERT INTO `test` VALUES ('102', '123', '213');
 
 INSERT INTO `test` VALUES ('103', '21', '321');
 
 INSERT INTO `test` VALUES ('104', '324', '432');
 
 INSERT INTO `test` VALUES ('105', '132', '231');
 
 INSERT INTO `test` VALUES ('106', '324', '342');
 
 INSERT INTO `test` VALUES ('107', '23', '23');
 
 INSERT INTO `test` VALUES ('108', '12', '21');
 
 INSERT INTO `test` VALUES ('109', '231', '321');
 
 INSERT INTO `test` VALUES ('110', '123', '231');
 
 INSERT INTO `test` VALUES ('111', '123', '231');
 
 INSERT INTO `test` VALUES ('112', '123', '123');
 
 INSERT INTO `test` VALUES ('113', '312', '231');
 
 INSERT INTO `test` VALUES ('114', '312', '321');
 
 INSERT INTO `test` VALUES ('115', '23', '3');
 
 INSERT INTO `test` VALUES ('116', '213', '312');
 
 INSERT INTO `test` VALUES ('117', '2', '3');
 
  
 
 -- ----------------------------
 
 -- Table structure for `xqdata`
 
 -- ----------------------------
 
 DROP TABLE IF EXISTS `xqdata`;
 
 CREATE TABLE `xqdata` (
 
  `代码` varchar(20) NOT NULL DEFAULT '',
 
  `商品` varchar(20) CHARACTER SET utf8 DEFAULT NULL,
 
  `卖出` bigint(20) DEFAULT NULL,
 
  `成交` bigint(20) DEFAULT NULL,
 
  `涨跌` bigint(20) DEFAULT NULL,
 
  `买进` bigint(20) DEFAULT NULL,
 
  `总量` bigint(20) DEFAULT NULL,
 
  `涨幅` double DEFAULT NULL,
 
  `光阴` time DEFAULT NULL,
 
  PRIMARY KEY (`代码`)
 
 ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
 
  
 
 -- ----------------------------
 
 -- Records of xqdata
 
 -- ----------------------------
 
 INSERT INTO `xqdata` VALUES ('FITX*1', '商品', '34', '43', '23', '34', '0', '1.4', '13:23:08');
 
更正楼主一点内容:_WINDOWS改成_CONSOLE,你建立的是对话框等窗口运用程序时不消点窜这些宏,我觉得你建立掌握台程序体系也会自动改成_CONSOLE,这点不消点窜(我用的是VS2012不知VS2008要不要窜改)。
 

上篇:上一篇:明白Scroller
下篇:下一篇:android am号令用法