C语言连接MySQL数据库(转)
c++连接MySQL有两种方式,1是原始的方法,2是用 Connector c++ 。Connector c++ 只是一种封装,使之更加方便。
1、原始方法
| 函数 | 描述 | 
| mysql_affected_rows() | 返回上次UPDATE、DELETE或INSERT查询更改/删除/插入的行数。 | 
| mysql_autocommit() | 切换 autocommit模式,ON/OFF | 
| mysql_change_user() | 更改打开连接上的用户和数据库。 | 
| mysql_charset_name() | 返回用于连接的默认字符集的名称。 | 
| mysql_close() | 关闭服务器连接。 | 
| mysql_commit() | 提交事务。 | 
| mysql_connect() | 连接到MySQL服务器。该函数已不再被重视,使用mysql_real_connect()取代。 | 
| mysql_create_db() | 创建数据库。该函数已不再被重视,使用SQL语句CREATE DATABASE取而代之。 | 
| 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服务器。 | 
| mysql_real_escape_string() | 考虑到连接的当前字符集,为了在SQL语句中使用,对字符串中的特殊字符进行转义处理。 | 
| 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()函数访问错误信息的机制。它们能返回关于最近调用的函数的错误代码或错误消息,最近调用的函数可能成功也可能失败,这样,你就能判断错误是在何时出现的,以及错误是什么。
- MYSQL
- 这个结构表示对一个数据库连接的句柄,它被用于几乎所有的MySQL 函数。
- MYSQL_RES
- 这个结构代表返回行的一个查询的(SELECT,SHOW,DESCRIBE,EXPLAIN)的结果。从查询返回的信息在本章下文称为结果集合 。
- MYSQL_ROW
- 这是一个行数据的类型安全(type-safe)的表示。当前它实现为一个计数字节的字符串数组。(如果字段值可能包含二进制数据,你不能将这些视为空终止串,因为这样的值可以在内部包含空字节) 行通过调用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的值将不工作。为了打印出这样的值,将它变换到unsigned long并且使用一个%lu打印格式。例如:printf (Number of rows: %lu/n", (unsigned long) mysql_num_rows(result)); 
MYSQL_FIELD结构包含列在下面的成员:
- char * name
- 字段名,是一个空结尾的字符串。
- char * table
- 包含该字段的表的名字,如果它不是可计算的字段。对可计算的字段,table值是一个空字符串。
- char * def
- 这字段的缺省值,是一个空结尾的字符串。只要你使用,只有你使用mysql_list_fields()才可设置它。
- enum enum_field_types type
- 字段类型。type值可以是下列之一:类型值 类型含义 FIELD_TYPE_TINYTINYINT字段FIELD_TYPE_SHORTSMALLINT字段FIELD_TYPE_LONGINTEGER字段FIELD_TYPE_INT24MEDIUMINT字段FIELD_TYPE_LONGLONGBIGINT字段FIELD_TYPE_DECIMALDECIMAL或NUMERIC字段FIELD_TYPE_FLOATFLOAT字段FIELD_TYPE_DOUBLEDOUBLE或REAL字段FIELD_TYPE_TIMESTAMPTIMESTAMP字段FIELD_TYPE_DATEDATE字段FIELD_TYPE_TIMETIME字段FIELD_TYPE_DATETIMEDATETIME字段FIELD_TYPE_YEARYEAR字段FIELD_TYPE_STRING字符串( CHAR或VARCHAR)字段FIELD_TYPE_BLOBBLOB或TEXT字段(使用max_length决定最大长度)FIELD_TYPE_SETSET字段FIELD_TYPE_ENUMENUM字段FIELD_TYPE_NULLNULL- 类型字段FIELD_TYPE_CHAR不推荐;使用 FIELD_TYPE_TINY代替你可以使用 IS_NUM()宏来测试字段是否有一种数字类型。将type值传给IS_NUM()并且如果字段是数字的,它将计算为TRUE:if (IS_NUM(field->type)) 
 printf("Field is numeric/n");
- unsigned int length
- 字段宽度,在表定义中指定。
- unsigned int max_length
- 对结果集合的字段的最大宽度(对实际在结果集合中的行的最长字段值的长度)。如果你使用mysql_store_result()或mysql_list_fields(),这包含字段最大长度。如果你使用mysql_use_result(),这个变量的值是零。
- unsigned int flags
- 字段的不同位标志。flags值可以是零个或多个下列位设置:标志值 标志含义 NOT_NULL_FLAG字段不能是 NULLPRI_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(不推荐)BLOB_FLAG字段是一个 BLOB或TEXT(不推荐)TIMESTAMP_FLAG字段是一个 TIMESTAMP(不推荐)BLOB_FLAG、ENUM_FLAG和TIMESTAMP_FLAG标志的使用是不推荐的,因为他们指出字段的类型而非它的类型属性。对FIELD_TYPE_BLOB、FIELD_TYPE_ENUM或FIELD_TYPE_TIMESTAMP,最好是测试field->type。下面例子演示了一个典型的flags值用法:if (field->flags & NOT_NULL_FLAG) 
 printf("Field can't be null/n");你可以使用下列方便的宏决来确定 flags值的布尔状态:IS_NOT_NULL(flags)真,如果该字段被定义为 NOT NULLIS_PRI_KEY(flags)真,如果该字段是一个主键 IS_BLOB(flags)真,如果该字段是一个 BLOB或TEXT(不推荐;相反测试field->type)
- unsigned int decimals
- 对数字字段的小数位数。
mysql_fetch_field ()
MYSQL_FIELD *mysql_fetch_field (MYSQL_RES *result)1 说明
返回作为一个MYSQL_FIELD 结构的一个结果集合的一个列的定义。重复调用这个函数在结果集合中检索所有关于列的信息。当没有剩下更多的字段时,mysql_fetch_field () 返回NULL 。
在每次你执行一个新的SELECT 查询,mysql_fetch_field () 被重置(reset)以返回有关第一列的信息。由mysql_fetch_field () 返回的字段也受调用mysql_field_seek() 的影响。
如果你调用mysql_query() 在一张表上执行一个SELECT ,但是没调用mysql_store_result() ,如果你调用mysql_fetch_field () 询问一个BLOB 字段的长度,MySQL 返回缺省BLOB长度(8K字节)。(选择8K的长度是因为MySQL 不知道BLOB 的最大长度。这应该在某个时候是它可配置) 一旦你已经检索了结果集合,field->max_length 包含了在特定查询中对于该列最大值的长度。
2 返回值
当前列的MYSQL_FIELD 结构。如果没有列剩下,NULL 。
3 错误
无。
4 范例
MYSQL_FIELD *field; while((field = mysql_fetch_field
(result)))
{
printf("field name %s/n", field->name);
}
mysql_fetch_fields()
MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *result) 
1 说明
返回一个结果集合的所有MYSQL_FIELD 结构的数组。每个结构提供结果结合中一列的字段定义。 
2 返回值
一个结果集合的所有MYSQL_FIELD 结构的一个数组。
3 错误
无。 
4 范例
unsigned int num_fields;
unsigned int i;
MYSQL_FIELD *fields; num_fields = mysql_num_fields(result);
fields = mysql_fetch_fields(result);
for(i = 0; i < num_fields; i++)
{
printf("Field %u is %s/n", i, fields[i].name);
}
示例2
不想用ODBC什么的连接数据库,想直接用MySQL提供的接口连接数据库。我用的是VS2005。
网上的一些介绍都是修改项目属性等的设置,我不喜欢那样。首先 我们需要的文件有mysql.h   my_alloc.h   my_list.h   mysql_com.h   mysql_time.h   mysql_version.h   typelib.h  以及libmysql.lib和libmysql.dll全拷到项目文件夹下。 以上提到的文件都在MySQL安装目录下,比如我的是:C:\Program Files\MySQL\MySQL Server 5.5。.h文件在include目录下;  .lib和.dll文件在lib目录下。
准备好后,首先包含头文件和链接MySQL库,这里要注意不要忘记包含winsock.h,这是连接数据库必须的,从WorkBench连接数据库时弹出的对话框可以看出是通过TCP连接的。
 
#include "mysql.h"
#include <winsock.h>
#pragma comment(lib, "libmysql.lib")
定义两个MYSQL结构体变量
MYSQL mysql, *sock;
下面是初始化连接
mysql_init(&mysql);
主要给结构体内的元素赋初值。
接下来是真正的连接
mysql_real_connect(&mysql, "localhost", "USERNAME", "PASSWORD", "DBNAME", NULL, 0, NULL);
第一个参数不说了;第二个参数是数据库所在的主机地址;第三、四个参数是用户名、密码;第五个参数是要连接的数据库名称;第六个参数是端口号,可以指定也可以赋为0;第七个参数是指定连接的套接字,也不用管;第八个参数一般情况下都是0。
注意函数的返回值和PHP的不一样。连接成功返回0,否则返回非0。出错信息可以调用sql_error(MYSQL* )来查看。
定义sql语句(最后没有分号):
char sqlbuf[100] = "SELECT Device_Route FROM Device";
下面让MySQL执行sql语句:
mysql_query(sock, sqlbuf); 
该函数也是成功(即使没有查询到数据)返回0,失败返回非0。
查询到了数据后就是获取查询结果了,这里还要定义两个结构体:查询结果结构体和记录结构体(保存一条记录)
MYSQL_RES *res;
MYSQL_ROW row;  // 本质上就是二维数组
获取查询结果
res = mysql_store_result(sock);
获取每一条记录
while (row = mysql_fetch_row(res))
{
        // 添加自己的存储查询结果代码
}
释放查询结果:
mysql_free_result(res);
关闭MySQL连接:
mysql_close(sock);
sock = NULL;
如果是INSERT、UPDATE等非查询语句到mysql_query()就可以结束了,因为没有结果可存。
完整的实现如下:
- #include "stdafx.h"
- #include <winsock.h>
- #include "mysql.h"
- #pragma comment(lib, "libmysql.lib")
- void main()
- {
- MYSQL mysql, *sock;
- mysql_init(&mysql);
- if (!(sock = mysql_real_connect(&mysql, "localhost", "root", "123456", "sw_pfc", 0, NULL, 0)))
- {
- printf("Cannot connect to database:%s\n",mysql_error(sock));
- return;
- }
- char sqlbuf[200] = "SELECT * FROM rpc";
- if (mysql_query(sock, sqlbuf))
- {
- printf("Query Failed:%s", mysql_error(sock));
- return;
- }
- MYSQL_RES *result;
- unsigned uLine=0,uField=0;
- MYSQL_ROW row;
- //MYSQL_FIELD **pField;pField = NULL;
- MYSQL_FIELD *pField(NULL);
- unsigned long *lengths;
- if (!(result = mysql_store_result(sock)))
- {
- printf("Failed to store result:%s", mysql_error(sock));
- return;
- }
- //获得行数
- uLine=(unsigned)mysql_num_rows(result);
- //获得字段数
- uField=(unsigned)mysql_num_fields(result);
- //获得字段的相关信息
- //for(int j = 0; j < (int)uField; ++j)
- //{
- // pField[j] =mysql_fetch_field_direct(result, j);
- //}
- pField = mysql_fetch_fields(result);
- //填充结果集
- for(int i=0;i<(int)uLine;i++)
- {
- //获得一行数据
- row=mysql_fetch_row(result);
- lengths = mysql_fetch_lengths(result);
- for(int j=0;j<(int)uField;j++)
- {
- //blob
- MYSQL_FIELD *pTemp = pField+j;
- if(pTemp->type == MYSQL_TYPE_BLOB)
- {
- //列名称
- printf("%s:%d--%d ", pTemp->name, lengths[j], pTemp->max_length);
- for(unsigned long nindex = 0; nindex < lengths[j]; ++nindex)
- {
- printf("%02X", row[j][nindex]);
- }
- }
- else
- {
- //列名称
- printf("%s:%d--%d %s", pTemp->name, lengths[j], pTemp->max_length, row[j]);
- }
- printf("\t");
- }
- printf("\n");
- }
- //if(pField) delete []pField;
- //释放结果集
- mysql_free_result(result);
- // 关闭数据库
- mysql_close(sock);
- }
2、用 Connector c++
首先去MySQL官网下载MySQL connector/C++
http://dev.mysql.com/downloads/connector/cpp/
根据自己系统平台下载相应的版本。文件夹名字太长,将“mysql-connector-c++-noinstall-1.0.5-win32”改为“mysql”。
下面要配置vs2008的环境。 
1. 项目属性页->C/C++->General->Additional Include Directories。将mysql\include目录添加进去。 
2. 项目属性页->Linker->General->Additional Library Directories。将mysql\lib与$MySQL\bin目录添加进去。
3. 项目属性页->Linker->Input->Additional Dependencies。添加这两项mysqlcppconn.lib,mysqlcppconn-static.lib(mysql\lib目录下的两个.lib文件)
4. 将mysql\lib下的mysqlcppconn.dll文件与$MySQL\bin\libmySQL.dll复制到windows\system32文件夹下。
环境配置完毕。
在连接数据库之前,先建立一张表。 (其实这些可以在代码中完成,我这样是为了让测试代码尽可能简练易查错)
打开控制台,输入mysql -u root -p,输入密码。
查看当前已有的数据库。(SQL语句末尾加上';'表示立即执行当前语句。)
mysql> show databases;
创建数据库
mysql> create database test;
使用数据库(这句不能加分号)
mysql> use test
查看已有的表
mysql> show tables;
创建表
mysql> create table testuser ( id INT, name CHAR(20));
插入数据
mysql> insert into testuser(id, name) values(1001, 'google');
mysql> insert into testuser(id, name) values(1002, 'kingsoft');
mysql> insert into testuser(id, name) values(1003, 'firefox');
- 现在在C++中查询这些数据
- 1.#include "stdafx.h"
- 2.#include <mysql_connection.h>
- 3.#include <mysql_driver.h>
- 4.#include <statement.h>
- 5.using namespace sql;
- 6.using namespace std;
- 7.void RunConnectMySQL()
- 8.{
- 9. mysql::MySQL_Driver *driver;
- 10. Connection *con;
- 11. Statement *state;
- 12. ResultSet *result;
- 13. // 初始化驱动
- 14. driver = sql::mysql::get_mysql_driver_instance();
- 15. // 建立链接
- 16. con = driver->connect("tcp://127.0.0.1:3306", "root", "123");
- 17. state = con->createStatement();
- 18. state->execute("use test");
- 19. // 查询
- 20. result = state->executeQuery("select * from testuser where id < 1002");
- 21. // 输出查询
- 22. while(result->next())
- 23. {
- 24. int id = result->getInt("ID");
- 25. string name = result->getString("name");
- 26. cout << id << " : " << name << endl;
- 27. }
- 28. delete state;
- 29. delete con;
- 30.}
- 31.int _tmain(int argc, _TCHAR* argv[])
- 32.{
- 33. RunConnectMySQL();
- 34. getchar();
- 35. return 0;
- 36.}
示例2
想写一个demo 测试一下。
mysql connector c++ 调用 方式 有两种,一种是动态链接库调用 ,一种是静态库调用。静态库试了一整天不行,都是以 get_mysql_driver_instance() 没有链接到而靠终,后来才知道 新版本的connector c++ 如果以静态方式调用的话是不再用这个函数了 可是官方文档中没有说不用get_mysql_driver_instance这个函数是怎么操作数据库的。静态失败了,搞动态吧。
动态库调用方式是若干 .h 文件和一个 mysqlcppconn.lib 链接之后在运行期间会调用mysqlcppconn.dll貌似运行期间还要调用 libmysql.dll 。
下面说步骤
1.首先把把connector c++ include文件夹 加到工程包含目录里
2.其次链接lib 其中分为debug版和 release 版
#ifdef _DEBUG
#pragma comment(lib,"..\\dynamic_lib\\Debug_\\mysqlcppconn.lib")
#else
#pragma comment(lib,"..\\dynamic_lib\\Release_\\mysqlcppconn.lib")
#endif // DEBUG
3.直接调用函数了 ,以下代码测试正确 vs2012 win7 64位
// TestMySql.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include "mysql_connection.h"
#include "mysql_driver.h"
#include "mysql_error.h" #include <cppconn/driver.h>
#include <cppconn/exception.h>
#include <cppconn/resultset.h>
#include <cppconn/statement.h>
#include <cppconn/prepared_statement.h> #include <iostream>
using namespace std; #ifdef _DEBUG
#pragma comment(lib,"..\\dynamic_lib\\Debug_\\mysqlcppconn.lib")
#else
#pragma comment(lib,"..\\dynamic_lib\\Release_\\mysqlcppconn.lib")
#endif // DEBUG int _tmain(int argc, _TCHAR* argv[])
{
sql::mysql::MySQL_Driver *driver = NULL;
sql::Connection *con = NULL;
driver = sql::mysql::get_mysql_driver_instance();
if(driver == NULL)
{
cout<<"driver is null"<<endl;
goto END;
}
con = driver->connect("tcp://localhost:3306", "root", "3342125");
if(con == NULL)
{
cout<<"conn is null"<<endl;
goto END;
} cout<<"连接数据库成功"<<endl; sql::Statement * stmt = NULL;
stmt = con->createStatement();
if(stmt == NULL)
{
cout<<"stmt is null"<<endl;
goto END;
}
stmt->execute("SET CHARSET GB2312");
stmt->execute("USE zhanbao");
sql::ResultSet * resultSet = stmt->executeQuery("这里写查询语句 ");
int i = 0;
while (resultSet->next()) {
cout << ", label = '" << resultSet->getString("ACCOUNT") << "'" << endl;
i++;
} cout<<"共"<<i<<"条"<<endl; con->close();
delete stmt;
delete con; END:
system("pause"); return 0;
}
C语言连接MySQL数据库(转)的更多相关文章
- C语言连接MySql数据库
		C语言连接MySql数据库(CodeBlocks) 操作系统:Windows7(32位)编译软件:Code::Blocks 10.05数 据 库:mysql-5.1.62-win32 数据库内的数据: ... 
- Linux centos 7/ubantu下: 用 C 语言连接 MySQL数据库
		前言:最近用IPC.socket做ATM.聊天项目,考虑到需要用到数据库,所以总结一下centos.ubantu环境下怎么用C语言操作数据库,例如常见的增删改查等! 一.Centos环境安装mysql ... 
- c语言连接mysql数据库的实现方法
		C语言连接mysql数据库,需要相应的头文件和lib文件,如果你安装Mysql数据库,会在安装目录下找到这些库文件,如果没有安装,也可以在网上找到 我这里也有一份网上找到的:/201205/other ... 
- R语言-连接MySQL数据库方法
		版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] R语言连接数据库常用的方法有2种: 1.使用R数据库接口 连接MySQL,使用RMySQL包,使用前RMySQL包要先安 ... 
- C语言连接MySQL数据库(课程设计总结)
		刚结束课程设计,也预示着假期立即就要到来了.本次课程设计并不算难,无非就是让做一个XXX系统,实现用户的注冊.登录.菜单管理.超级用户等等一些功能,到如今为止已经做过好几个了,所以基本流程都熟悉了! ... 
- 通过Java语言连接mysql数据库
		1加载驱动 2创建链接对象 3创建语句传输对象 4接受结果集 5遍历 6关闭资源 
- 用C语言操作MySQL数据库,进行连接、插入、修改、删除等操作
		C/C++ code ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 3 ... 
- Linux下C语言连接MySQL
		本文出自 http://blog.csdn.net/shuangde800 首先保证安装: 1:安装MySQL:sudo apt-get install mysql-server mysql-cl ... 
- C语言连接mysql -insert-update
		C语言连接mysql数据库实现insert语句:数据库:test表:systeminfo CREATE TABLE `systeminfo` ( `id` int(11) NOT NULL AUTO ... 
随机推荐
- MySQL数据复制到其他主机时报错
			问题1: MySQL server has gone away With statement 原因:SQl insert 插入的语句天长导致 问题2:mysql a bulk size specifi ... 
- [Functional Programming + React] Provide a reasonable default value for mapStateToProps in case initial state is undefined
			For example we have a component, it needs to call 'react-redux' connect function. import { compose, ... 
- Mybatis源码分析之Cache二级缓存原理 (五)
			一:Cache类的介绍 讲解缓存之前我们需要先了解一下Cache接口以及实现MyBatis定义了一个org.apache.ibatis.cache.Cache接口作为其Cache提供者的SPI(Ser ... 
- iOS  debug release
			去掉日志 #ifndef __OPTIMIZE__ #define NSLog(...) NSLog(__VA_ARGS__) #else #define NSLog(...){} #endif 打开 ... 
- 使用instantclient_11_2 和PL/SQL Developer工具包连接oracle 11g远程数据库(转)
			1,先到Oracle网站下载Instant Client : http://www.oracle.com/technology/global/cn/software/tech/oci/instantc ... 
- Python3中使用Mysql的用法。
			一.Python2中一般使用MySqldb来调用Mysql,但是在Python3中不支持该包,使用pymysql来代替了,用法一模一样. 二.安装: pip install pymysql 三.例子: ... 
- Vue为什么没有templateUrl
			Why Vue.js doesn't support templateURL Vue.js为什么不支持templateUrl模式 原因 templateUrl使用ajax的方式在运行时加载templa ... 
- [译]AngularJS Services 获取后端数据
			原文:ANGULARJS SERVICES – FETCHING SERVER DATA $http是AngularJS内置的服务,能帮助我们完成从服务端获数据.简单的用法就是在你需要数据的时候,发起 ... 
- cocos2d-js V3.0 V3.1使用DragonBones
			DragonBones是Adobe支持的一个开源项目,用于制作和播放骨骼动画,官网地址是:http://dragonbones.effecthub.com/.DragonBones首先在Flash和S ... 
- Java关闭Socket来终止线程
			Java代码: package Threads; import java.io.BufferedReader; import java.io.IOException; import java.io.I ... 
