??xml version="1.0" encoding="utf-8" standalone="yes"?> VC的MySQL~程 1?找來MySQL(Win32)安裝目录下的include文g夾, 其d到VC头文件目录列表中Q?/p> QVC6 -> Options -> Directories -> 加入此目录) QVC2005 -> 工具 -> 选项 -> 目和解決方?-> VC++目录 -> 昄以下内容的目?-> 包含文g -> 加入此目录) 2、找到MySQL(Win32)安裝?录下的lib文g夹, 其d到VC库文件目录列表中Q?/p> QVC6 -> Options -> Directories -> 加入此目录) QVC2005 -> 工具 -> 选项 -> 目和解x?-> VC++目录 -> 昄以下内容的目?-> 库文?-> 加入此目录,注意是lib/debug或lib/optQ?/p> 3、新Z个工E,参考如下代码; // mysql.cpp : Defines the entry point for the console application. #include "stdafx.h" #pragma comment(lib, "libmysql.lib") printf("Start... "); ssock = (MYSQL *)malloc(sizeof(MYSQL)); //q接指定数据?br />ssock = mysql_real_connect(ssock, IPAddress, UserName, Password, NULL, Port, NULL, 0); //memcpy(eee, mysql_error(ssock), 20); //printf("%c ", eee); if(mysql_select_db(ssock, DBName) != 0) printf("version=%d ", mysql_get_server_version(ssock)); printf("End... "); usidc5 2010-07-19 00:19 C++操作mysql数据库文章资料汇?/h1>
在你的程式中使用数据库是个不做的注意。如果已l有可用的MySQL服务 器,在VC中可以按照如下方法实C数据库的q接?/p>
//
#include <stdio.h>
#include <winsock.h>
#include <mysql.h>
#include <windows.h>
int main(int argc, char* argv[])
...{
unsigned short Port = 3306;
char *IPAddress = "192.168.31.56";
char *UserName = "root";
char *Password = "";
char *DBName = "SAS_1_2_0";
MYSQL *ssock;
//char execsql[500];
// 在某些版本中Q不需要该初始化工作,可观看mysql.H以及readme
mysql_init(ssock);
if(ssock == NULL)
...{
printf("EROR: MySQL ssock init error. ");
return FALSE;
}
if(!ssock)
...{
printf("conn fail... ");
//fprintf(stderr, "Failed to connect to database: Error: %s ", mysql_error(ssock));
unsigned int mtint = mysql_errno(ssock);
//printf("%d ");
return FALSE;
}
...{
printf("select db error. ");
return FALSE;
}
//exec my execsql string
//sprintf(execsql,"create table girls (name char(10),age int)");
//mysql_real_query(ssock,execsql,strlen(execsql));
mysql_close(ssock);
return TRUE;
}
4、编译连接,q行卛_?/p>usidc5 2010-07-19 00:21 q里归纳了C API可用的函数Qƈ在下一节详l介l了它们?br />
函数
描述
mysql_affected_rows()
q?回上ơUPDATE、DELETE或INSERT查询更改Q删除/插入的行数?br />
mysql_autocommit()
切换 autocommit模式QON/OFF
mysql_change_user()
更改打开q接上的用户和数据库?br />
mysql_charset_name()
q?回用于连接的默认字符集的名称?br />
mysql_close()
关闭服务器连接?br />
mysql_commit()
?交事务?br />
mysql_connect()
q接到MySQL服务器。该函数已不再被重视Q?mysql_real_connect()取代?br />
mysql_create_db()
创徏数据库。该函数已不再被重视Q?SQL语句CREATE DATABASE取而代之?br />
mysql_data_seek()
在查询结果集中查扑ֱ性行~号?br />
mysql_debug()
?l定的字W串执行DBUG_PUSH?br />
mysql_drop_db()
撤销数据库。该函数已不再被重视Q用SQL语句DROP DATABASE取而代之?br />
mysql_dump_debug_info()
让服务器调试信息写入日志?br />
mysql_eof()
?定是否读取了l果集的最后一行。该函数已不再被重视Q可以用mysql_errno()或mysql_error()取而代之?br />
mysql_errno()
q?回上ơ调用的MySQL函数的错误编受?br />
mysql_error()
q回上次调用的MySQL函数的错误消息?br />
mysql_escape_string()
?了用在SQL语句中,对特D字W进行{义处理?br />
mysql_fetch_field()
q回下一个表字段的类型?br />
mysql_fetch_field_direct()
l?定字D늼Pq回表字D늚cd?br />
mysql_fetch_fields()
q回所有字D늻构的数组?br />
mysql_fetch_lengths()
q?回当前行中所有列的长度?br />
mysql_fetch_row()
从结果集中获取下一?br />
mysql_field_seek()
?列光标置于指定的列?br />
mysql_field_count()
q回上次执行语句的结果列的数目?br />
mysql_field_tell()
q?回上ơmysql_fetch_field()所使用字段光标的位|?br />
mysql_free_result()
释放l果集用的 内存?br />mysql_get_client_info()
以字W串形式q回客户端版本信息?br />
mysql_get_client_version()
?整数形式q回客户端版本信息?br />
mysql_get_host_info()
q回描述q接的字W串?br />
mysql_get_server_version()
?整数形式q回服务器的版本受?br />
mysql_get_proto_info()
q回q接所使用的协议版本?br />
mysql_get_server_info()
q?回服务器的版本号?br />
mysql_info()
q回关于最q所执行查询的信息?br />
mysql_init()
?取或初始化MYSQLl构?br />
mysql_insert_id()
q回上一个查询ؓAUTO_INCREMENT列生成的ID?br />
mysql_kill()
杀 ȝ定的U程?br />
mysql_library_end()
最l确定MySQL C API库?br />
mysql_library_init()
?始化MySQL C API库?br />
mysql_list_dbs()
q回与简单正则表辑ּ匚w的数据库名称?br />
mysql_list_fields()
q?回与单正则表辑ּ匚w的字D名U?br />
mysql_list_processes()
q回当前服务器线E的列表?br />
mysql_list_tables()
q?回与单正则表辑ּ匚w的表名?br />
mysql_more_results()
查是否还存在其他l果?br />
mysql_next_result()
?多语句执行过E中q回/初始化下一个结果?br />
mysql_num_fields()
q回l果集中的列数?br />
mysql_num_rows()
q?回结果集中的行数?br />
mysql_options()
为mysql_connect()讄q接选项?br />
mysql_ping()
查与服务器的q接是否工作Q如有必要重新连接?br />
mysql_query()
执行指定?#8220;以Nulll结的字W串”的SQL查询?br />
mysql_real_connect()
q?接到MySQL服务器?br />
mysql_real_escape_string()
考虑到连接的当前字符集,Z在SQL语句中 用,对字W串中的Ҏ(gu)字符q行转义处理?br />
mysql_real_query()
执行指定数字W串的SQL查询?br />
mysql_refresh()
?新或复位表和高速缓册Ӏ?br />
mysql_reload()
通知服务器再ơ加载授权表?br />mysql_rollback()
?滚事务?br />
mysql_row_seek()
使用从mysql_row_tell()q回的|查找l果集中的行偏移?br />
mysql_row_tell()
q?回行光标位置?br />
mysql_select_db()
选择数据库?br />
mysql_server_end()
最 l确定嵌入式服务器库?br />
mysql_server_init()
初始化嵌入式服务器库?br />
mysql_set_server_option()
?q接讄选项Q如多语句)?br />
mysql_sqlstate()
q回关于上一个错误的SQLSTATE错误代码?br />
mysql_shutdown()
?闭数据库服务器?br />
mysql_stat()
以字W串形式q回服务器状态?br />
mysql_store_result()
索完整的l果集至客户端?br />
mysql_thread_id()
q回当前U程ID?br />
mysql_thread_safe()
?果客L已编译ؓU程安全的,q回1?br />
mysql_use_result()
初始化逐行的结果集索?br />
mysql_warning_count()
q?回上一个SQL语句的告警数?br />
转自Q?a >http://blog.csdn.net/ghost1236/article/details/5746905usidc5 2010-07-19 00:22
]]>
]]>
]]>
要介l后Q是不是发现它和Oracle的database link(数据库链?非常怼Q它所实现的功能和db linkcMQ要在MySQL下找寻db link替代品的Qfederated存储引擎是不二的选择?/span>
1. 查看当前支持的存储引?/span>
SQL>show engines;
- +------------+---------+------------------------------------------------------------+--------------+------+------------+
- | Engine | Support | Comment | Transactions | XA | Savepoints |
- +------------+---------+------------------------------------------------------------+--------------+------+------------+
- | CSV | YES | CSV storage engine | NO | NO | NO |
- | MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
- | MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
- | InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
- | MyISAM | YES | Default engine as of MySQL 3.23 with great performance | NO | NO | NO |
- +------------+---------+------------------------------------------------------------+--------------+------+------------+
- 5 rows in set (0.00 sec)
发现安装MySQL时没有编译进来,只能现安装了?/span>
2. 安装f(xi)ederated存储引擎
׃~译时没有选择federatedQ所以打通过INSTALL PLUGIN的方式安装,正常情况下,federated是支持动态安装的Q?/span>
=== Federated Storage Engine ===
Plugin Name: federated
Description: Connects to tables on remote MySQL servers
Supports build: static and dynamic
Configurations: max, max-no-ndb
可是执行以下命o时报错:
SQL>install plugin federated soname 'ha_federated.so';
ERROR 1126 (HY000): Can't open shared library '/usr/local/mysql/lib/mysql/plugin/ha_federated.so' (errno: 2 undefined symbol: dynstr_append_mem)
搜了一下,发现是个老问题,竟然到现在都没解冻I可见MySQL团队的效率和理的乱?a rel="nofollow" style="text-decoration: none; color: #0c4468;">http://bugs.mysql.com/bug.php?id=40942
没有办法了,只有重新~译MySQL源码? 加上--with-plugins=federated。从5.1.26开始,默认MySQL不启用federated存储引擎Q所以需要在my.cnf中加入federated选项或是在命令行?/span>--federated选项启动mysqld。编译后的结果如下:
SQL>show engines;
转自Q?a >http://blog.163.com/ji_1006/blog/static/106123412011116265531/
- +------------+---------+----------------------------------------------------------------------------+--------------+------+------------+
- | Engine | Support | Comment | Transactions | XA | Savepoints |
- +------------+---------+----------------------------------------------------------------------------+--------------+------+------------+
- | CSV | YES | CSV storage engine | NO | NO | NO |
- | MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
- | FEDERATED | YES | Federated MySQL storage engine | NO | NO | NO |
- | MyISAM | YES | Default engine as of MySQL 3.23 with great performance | NO | NO | NO |
- | InnoDB | DEFAULT | Percona-XtraDB, Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
- | MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
- +------------+---------+----------------------------------------------------------------------------+--------------+------+------------+
SQL Error (1130): Host '192.168.1.100' is not allowed to connect to this MySQL server
说明所q接的用户帐h有远E连接的权限Q只能在本机(localhost)d?br style="word-break: break-all; line-height: normal !important;" />
需更改 mysql 数据?/strong>里的 user表里?host?br style="word-break: break-all; line-height: normal !important;" />把localhost改称%
首先按下面的步骤dMysql服务?br style="word-break: break-all; line-height: normal !important;" />
dmysql需要切换到dos下的mysql的bin目录Q进行如下操作:
mysql>use mysql;
mysql>update user set host = '%' where user ='root';
mysql>flush privileges;
mysql>select 'host','user' from user where user='root';
mysql>quit
OK。远E连接成功!
转自Q?a >http://space.itpub.net/8183550/viewspace-680756查看pȝ的字W集和排序方式的讑֮可以通过下面的两条命令:
mysql> SHOW VARIABLES LIKE 'character_set_%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
7 rows in set (0.00 sec)mysql> SHOW VARIABLES LIKE 'collation_%';
+----------------------+-------------------+
| Variable_name | Value |
+----------------------+-------------------+
| collation_connection | latin1_swedish_ci |
| collation_database | latin1_swedish_ci |
| collation_server | latin1_swedish_ci |
+----------------------+-------------------+
3 rows in set (0.00 sec)
上面列出的值就是系l的默认倹{?br style="clear: both; " />
一般就设|了表的默认字符集ؓutf8q且通过UTF-8~码发送查询,你会发现存入数据库的仍然是ؕ码。问题就出在q个connectionq接层上。解x法是在发送查询前执行一下下面这句:SET NAMES 'utf8';
它相当于下面的三句指令:
http://www.blogjava.net/bonix/articles/159291.html
SET character_set_client = utf8;
SET character_set_results = utf8;
SET character_set_connection = utf8;
而MySQL数据库的4.1是一个分水岭Q?.1直接支持UnicodeQ它以下版本支持的不好;
MySQL JDBC Driver?.0.16也是一个分水岭Q?.0.16版本会取数据库本w的~码Q然后按照该~码转换Q这U方式和Oracle的JDBC Driver是一L。例如你的数据库是GBK~码的话QJDBC Driver׃把数据库里面的取出来的字W串按照GBK往unicode转换Q送给JVM。因此正的讄数据库本w的~码尤为重要?nbsp;
MySQL JDBC Driver3.0.16以下的版本则不然Q它不会那么的根据数据库~码来确定如何{换,它L默认使用ISO8859-1Q因此你必须使用 characterEncoding=GBK来强制他把数据库中取出来的字W串按照GBK来往unicode转换?nbsp;
因此Q用什么数据库版本Q不是3.xQ还?.0.xq是4.1.xQ其实对我们来说不重要,重要的有二:
1) 正确的设定数据库~码QMySQL4.0以下版本的字W集L默认ISO8859-1QMySQL4.1在安装的时候会让你选择。如果你准备使用UTF- 8Q那么在创徏数据库的时候就要指定好UTF-8(创徏好以后也可以改,4.1以上版本q可以单独指定表的字W集)
2) 使用3.0.16以上版本的JDBC DriverQ那么你׃需要再写什么characterEncoding=UTF-8
转自Q?/strong>
安装Q?/strong>
?Linux ?Windows q_的二q制包下载,解开直接使用卛_?br />
主要命o行选项Q?br />--help-all — 昄所有帮助选项?nbsp;
--proxy-backend-addresses=host:port — 要连接的 MySQL 服务器地址和端口,可以接多个服务器Q请求会以轮询的方式q行转发?br />--proxy-lua-script=file 要蝲入的 lua 脚本文g?br />
CZ:
F:\mysql-proxy-0.8.0-win32-x86\bin\mysql-proxy --proxy-backend-addresses=192.168.128.131:3306 --proxy-lua-script=F:/mysql-proxy-0.8.0-win32-x86/share/doc/mysql-proxy/tutorial-query-time.lua
注:自带的这个示例脚本可以显C收到的 SQL 操作h和执行时_也可以自q写脚?br />
客户端连?br />跟^常连服务器一P只是默认端口?4040Q连接后可以进?SQL 操作了,相应命o会显C在 Proxy 上?/p>
各种版本官网下蝲地址Q?a style="color: #999999 !important; border-bottom-color: #f8f8f8 !important; border-bottom-width: 2px !important; border-bottom-style: solid !important; text-decoration: none; ">http://dev.mysql.com/downloads/mysql-proxy/
转自Q?a >http://hi.baidu.com/bkitty/blog/item/e627b938cbd03aced56225f2.html
一、在你的E序中用数据库是不错的注意。如果已l有可用的MySQL服务器,在VC中可以按照如下方法实C数据库的q接?br />1、找来MySQL(Win32)安装目录下的include文g夹,其d到VC头文件目录列表中Q?br />QVC6 -> Options -> Directories -> 加入此目录)
QVC2005 -> 工具 -> 选择 ->目和解x?-> VC++目录 -> 昄以下內容的目?-> 包含文g -> 加入此目录)2、找来MySQL(Win32)安装目录下的lib文g夹,?nbsp;其添加到VC库文件目录列表中Q?br />QVC6 -> Options -> Directories -> 加入此目录)
QVC2005 -> 工具 ->选择 -> 目和解決方?-> VC++目录 -> 昄以下內容的目?-> 库文?-> 加入此目录,注意是lib/debug或lib/optQ?br />3、新Z个工E,参考如下代码:
// mysql.cpp : Defines the entry point for the console application.
#include "stdafx.h"
#include <stdio.h>
#include <winsock.h>
#include <mysql.h>
#include <windows.h>
#pragma comment(lib, "libmysql.lib")
int main(int argc, char* argv[])
{
unsigned short Port = 3306;
char *IPAddress = "192.168.31.56";
char *UserName = "root";
char *Password = "";
char *DBName = "SAS_1_2_0";
printf("Start... ");
MYSQL *ssock;
//char execsql[500];
ssock = (MYSQL *)malloc(sizeof(MYSQL));
//在某些版本中Q不需要该初始化工作,可观看mysql.H以及readme
mysql_init(ssock);
if(ssock == NULL)
{
printf("EROR: MySQL ssock init error. ");
return FALSE;
}
//q接到指定的数据?br /> ssock = mysql_real_connect(ssock, IPAddress, UserName, Password, NULL, Port, NULL, 0);
if(!ssock)
{
printf("conn fail... ");
//memcpy(eee, mysql_error(ssock), 20);
//fprintf(stderr, "Failed to connect to database: Error: %s ", mysql_error(ssock));
//printf("%c ", eee);
unsigned int mtint = mysql_errno(ssock);
//printf("%d ");
return FALSE;
}
if(mysql_select_db(ssock, DBName) != 0)
{
printf("select db error. ");
return FALSE;
}
printf("version=%d ", mysql_get_server_version(ssock));
//exec my execsql string
//sprintf(execsql,"create table girls (name char(10),age int)");
//mysql_real_query(ssock,execsql,strlen(execsql));
mysql_close(ssock);
printf("End... ");
return TRUE;
}
二、怎样用c/c++~程q接mysql数据?br /> 执行一个查询有以下几个步骤要做。首先执行一个查询,然后保存l果Q?nbsp;
得到的是一个子集。这里是一个小例子Q?nbsp;
#include <stdio.h>
#include
#include <mysql.h>
MYSQL mysql;
MYSQL_RES *res;
MYSQL_ROW row;
void exiterr(int exitcode)
{
fprintf( stderr, "%s/n", mysql_error(&mysql) );
exit( exitcode );
}
int main()
{
uint i = 0;
if (!(mysql_connect(&mysql,"host","username","password")))
exiterr(1);
if (mysql_select_db(&mysql,"payroll"))
exiterr(2);
if (mysql_query(&mysql,"SELECT name,rate FROM emp_master"))
exiterr(3);
if (!(res = mysql_store_result(&mysql)))
exiterr(4);
while((row = mysql_fetch_row(res))) {
for (i=0 ; i < mysql_num_fields(res); i++)
printf("%s/n",row[i]);
}
mysql_free_result(res);
mysql_close(&mysql);
}
mysql_query 函数把查询送给服务器,如果查询成功Q调用mysql_store_result 函数分配一个MYSQL_RES l构q且重新从服务器获得一个结果集?br /> 你可以用mysql_fetch_row 函数来查看数据。这样做你将获得一?nbsp; MYSQL_ROW 指针指向数据中的一行?nbsp; MYSQL_ROW 指针是一单的字符串数l。所有的数据cd被{换成字符串送到客户端?nbsp;
mysql_num_fields函数告诉你q回的列数。你可以l箋调用mysql_fetch_row直到它返回一个空指针以得到查询中的每一行?nbsp;
注意在这个例子里Q我们没有检查有I指针的列。如果你不用非I列的表Q那么你必须查一个特D行的列是否为空。一旦你使用完毕一个结果集Q你必须释放它。这通过 mysql_free_result 来完成?nbsp;
最后调用mysql_close来关闭你和数据库之间的连接?nbsp;
查看l果集你可以不用调用mysql_fetch_row查回的l果集共有多行。这?br /> int mysql_num_rows(MYSQL_RES *result)来完成?nbsp;
改变到被下一?nbsp; mysql_fetch_row 调用q回的行Q你可以用void mysql_data_seek(MYSQL_RES *res, uint offset) 改变CQ意一行?nbsp; 获得更多的信?你可以用这几个额外的函数来扑և关于一个查询的更多的信息,q从服务器获得这些信息?nbsp;
如果你执行一个UPDATEQ?nbsp; INSERT 或?nbsp; DELETE 查询Q你可以用int mysql_affected_rows 来查出共有多行数据被你影响到?nbsp;
如果在你的数据库里有二进制数据,那么得知数据的长度将是有用的。unsigned int *mysql_fetch_lengths(MYSQL_RES *mysql) 返回一指出了结果集中每一?的长度的整型数组?nbsp;
当你插入一个带?nbsp; AUTO_INCREMENT 列的表的时候,你可以用int mysql_insert_id(MYSQL *mysql) 来查出生成的那一行的ID?nbsp;
======================
int main()
{
MYSQL mysql;
MYSQL_RES * res ;
MYSQL_FIELD * fd ;
MYSQL_ROW row ;
int id[10000];
double result[10000][8];
vector<string> v;
if(mysql_init(&mysql) == NULL)
{
std::cout<<"init mysql data status fail"<<std::endl;
return false;
}
else
{
std::cout<<"init mysql data status success"<<std::endl;
}
if(NULL == mysql_real_connect(&mysql,"localhost","root","","wsnss",MYSQL_PORT,NULL,0))
{
std::cout<<"connect database fail"<<std::endl<<mysql_error(&mysql)<<std::endl;;
return false;
}
else{
std::cout<<"connect database success"<<std::endl;
}
char szSqlText[500]="";
int j = 0;
sprintf(szSqlText,"%s","select * from data_receive ");
if (mysql_query( &mysql, szSqlText))
//q行数据?nbsp;
{
//执行SQL语句出错
cout<<"query error"<<endl;
mysql_close( &mysql ) ;
return FALSE ;
}
else
{
res = mysql_store_result( &mysql ) ;
int i;
while((row = mysql_fetch_row(res))) {
id[j] = atoi(row[0]);
for (i = 1; i < mysql_num_fields(res); i++)
{
result[j][i-1] = atof(row[i]);
}
j++;
}
}
for(int i = 0 ; i < 10000; i++)
{
if(i>=j)
break;
char str[10000];
stringstream ss;
ss<<"insert into data_receive(ID,data1,data2,data3, data4,data5,data6,data7,data8)values('"<<id[i]<<"','"<<
result[i][0]<<"','"<<result[i][1]<<"','"<<result[i][2]<<"','"<<
result[i][3]<<"','"<<result[i][4]<<"','"<<result[i][5]<<"','"<<
result[i][6]<<"','"<<result[i][7]<<"');";
string s = ss.str();
v.push_back(s);
}
for(vector<string>::iterator iter = v.begin(); iter != v.end(); ++iter)
{
if(mysql_query(&mysql,(*iter).c_str())!=0)
{
std::cout<<"execute insert syntax fail"<<
std::endl<<mysql_error(&mysql)<<endl;
mysql_close(&mysql);
return 1;
}
}
mysql_free_result(res);
mysql_close(&mysql);
return 0;
}