mysql常识总结.docx
《mysql常识总结.docx》由会员分享,可在线阅读,更多相关《mysql常识总结.docx(19页珍藏版)》请在冰豆网上搜索。
mysql常识总结
环境:
VS2005,MySQL5
安装MySQL时要选择全部安装而不是典型安装,典型安装不会安装DeveloperComponents,而写C++连接数据库的程序中需要包含lib库和include头文件就是在DeveloperComponents中。
程序
程序中要包含mysql.h这个头文件以及WinSock头文件,mysql.h定义了所有的mysql数据库操作函数以及其他的头文件,而WinSock是在连接数据库时用到。
这里注意,winsock一定要在mysql.h之前,因为编译mysql.h的时候要用到winsock.h,如果反了,编译mysql系列头文件的时候就会报错。
#include
#include"include/mysql.h"
编译连接
linux下的gcc-lxxxx.so实际上是添加的动态库,在VS2005下,添加lib库的方法是工程->工程属性->Linker->CommandLine,在这里添加MySQL的库文件libmysql.lib,一般是在安装目录下的lib目录下。
至此,VS2005下的mysql编程基础已经打好,剩下的就是在程序中进行简单的数据库操作了。
Mysql数据库连接:
MYSQL*conn_ptr;
conn_ptr=mysql_init(NULL);
if(!
conn_ptr)
{
fprintf(stderr,"mysqlinitfailed/n");
returnEXIT_FAILURE;
}
conn_ptr=mysql_real_connect(conn_ptr,"172.20.97.228","root","qwertyuiop","mysql",3306,
NULL,0)
if(conn_ptr)
{
printf("Connectionsuccess/n");
}
Else
{
printf("Connectionfailed/n");
}
mysql_close(conn_ptr);
(2)工程->连接->对象/模块中加入libmysql.lib
(3)将Mysql目录下的lib\debug下的libmysql.dll复制到程序编译后的debug文件夹里
一、在你的程序中使用数据库是不错的注意。
如果已经有可用的MySQL服务器,在VC中可以按照如下方法实现与数据库的连接。
1、找来MySQL(Win32)安装目录下的include文件夹,将其添加到VC头文件目录列表中;
(VC6->Options->Directories->加入此目录)
(VC2005->工具->选择->项目和解决方案->VC++目录->显示以下內容的目录->包含文件->加入此目录)
2、找来MySQL(Win32)安装目录下的lib文件夹,将其添加到VC库文件目录列表中;
(VC6->Options->Directories->加入此目录)
(VC2005->工具->选择->项目和解決方案->VC++目录->显示以下內容的目录->库文件->加入此目录,注意是lib\debug或lib\opt)
3、新建一个工程,参考如下代码:
//mysql.cpp:
Definestheentrypointfortheconsoleapplication.
#include"stdafx.h"
#include
#include
#include
#include
#pragmacomment(lib,"libmysql.lib")
intmain(intargc,char*argv[])
{
unsignedshortPort=3306;
char*IPAddress="192.168.31.56";
char*UserName="root";
char*Password="";
char*DBName="SAS_1_2_0";
printf("Start...");
MYSQL*ssock;
charexecsql[500];
ssock=(MYSQL*)malloc(sizeof(MYSQL));
//在某些版本中,不需要该初始化工作,可观看mysql.H以及readme
mysql_init(ssock);
if(ssock==NULL)
{
printf("EROR:
MySQLssockiniterror.");
returnFALSE;
}
ssock=mysql_real_connect(ssock,IPAddress,UserName,Password,NULL,Port,NULL,0);//连接到指定的数据库
if(!
ssock)
{
printf("connfail...");
//memcpy(eee,mysql_error(ssock),20);
//fprintf(stderr,"Failedtoconnecttodatabase:
Error:
%s",//mysql_error(ssock));
//printf("%c",eee);
unsignedintmtint=mysql_errno(ssock);
//printf("%d");
returnFALSE;
}
if(mysql_select_db(ssock,DBName)!
=0)
{
printf("selectdberror.");
returnFALSE;
}
printf("version=%d",mysql_get_server_version(ssock));
//execmyexecsqlstring
//sprintf(execsql,"createtablegirls(namechar(10),ageint)");
//mysql_real_query(ssock,execsql,strlen(execsql));
mysql_close(ssock);
printf("End...");
returnTRUE;
}
二、怎样用c/c++编程连接mysql数据库
执行一个查询有以下几个步骤要做。
首先执行一个查询,然后保存结果,
得到的是一个子集。
这里是一个小例子:
#include
#include
#include
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 函数将把查询送给服务器,如果查询成功,调用mysql_store_result函数将分配一个MYSQL_RES 结构并且重新从服务器获得一个结果集。
你可以用mysql_fetch_row 函数来查看数据。
这样做你将获得一个MYSQL_ROW 指针指向数据中的一行。
MYSQL_ROW 指针是一简单的字符串数组。
所有的数据类型被转换成字符串送到客户端。
mysql_num_fields函数将告诉你返回的列数。
你可以继续调用mysql_fetch_row直到它返回一个空指针以得到查询中的每一行。
注意在这个例子里,我们没有检查有空指针的列。
如果你不使用非空列的表,那么你必须检查一个特殊行的列是否为空。
一旦你使用完毕一个结果集,你必须释放它。
这通过 mysql_free_result 来完成。
最后调用mysql_close来关闭你和数据库之间的连接。
查看结果集你可以不用调用mysql_fetch_row就查出返回的结果集共有多少行。
这由int mysql_num_rows(MYSQL_RES *result)来完成。
改变到被下一个mysql_fetch_row 调用返回的行,你可以void mysql_data_seek(MYSQL_RES *res, uint offset) 改变到任意一行。
获得更多的信息你可以使用这几个额外的函数来找出关于一个查询的更多的信息,并从服务器获得这些信息。
如果你执行一个UPDATE, INSERT 或者 DELETE 查询,你可以用int mysql_affected_rows 来查出共有多少行数据被你影响到。
如果在你的数据库里有二进制数据,那么得知数据的长度将是有用的。
unsigned int *mysql_fetch_lengths(MYSQL_RES *mysql) 将返回一指出了结果集中每一列的长度的整型数组。
当你插入一个带有 AUTO_INCREMENT 列的表的时候,你可以用int mysql_insert_id(MYSQL*mysql) 来查出生成的那一行的ID。
=============================================================================
intmain()
{
MYSQLmysql;
MYSQL_RES*res;
MYSQL_FIELD*fd;
MYSQL_ROWrow;
intid[10000];
doubleresult[10000][8];
vectorv;
if(mysql_init(&mysql)==NULL)
{
std:
:
cout<<"initmysqldatastatusfail"<:
endl;
returnfalse;
}
else
{
std:
:
cout<<"initmysqldatastatussuccess"<:
endl;
}
if(NULL==mysql_real_connect(&mysql,"localhost","root","","wsnss",MYSQL_PORT,NULL,0))
{
std:
:
cout<<"connectdatabasfail"<:
endl<:
endl;;
returnfalse;
}
else{
std:
:
cout<<"connectdatabasesuccess"<:
endl;
}
char szSqlText[500]="";
intj=0;
sprintf(szSqlText,"%s","select*fromdata_receive");
if(mysql_query(&mysql,szSqlText))
//进行数据检索
{
//执行SQL语句出错
cout<<"queryerror"< mysql_close(&mysql);
returnFALSE;
}
else{
res=mysql_store_result(&mysql);
inti;
while((row = mysql_fetch_row(res))) {
id[j]=atoi(row[0]);
for (i=1;i {
result[j][i-1]=atof(row[i]);
}
j++;
}
}
for(inti=0;i<10000;i++)
{
if(i>=j)
break;
charstr[10000];
stringstreamss;
ss<<"insertintodata_receive(ID,data1,data2,data3,data4,data5,data6,data7,data8)values('"< result[i][0]<<"','"< result[i][3]<<"','"< result[i][6]<<"','"< strings=ss.str();
v.push_back(s);
}
for(vector:
:
iteratoriter=v.begin();iter!
=v.end();++iter)
{
if(mysql_query(&mysql,(*iter).c_str())!
=0)
{
std:
:
cout<<"executeinsertsyntaxfail"<<
std:
:
endl< mysql_close(&mysql);
return1;
}
}
mysql_free_result(res);
mysql_close(&mysql);
return0;
}
看过很多C或是C++操作MySQL数据库的文章,大部分太吃力了,甚至有一部分根本没有很好的组织文字,初学者比较难以接受,即使是C++或是C高手也是比较难看懂。
写这篇文章的目的不是别的,就一个,告诉您用MySQL的CAPI直接操作MySQL数据,并做了比较高效的封装,可以帮助开发人员大幅度提高采用MySQL的CAPI操作MySQL数据库的效率。
直接进入主题:
1、 准备工作
MySQL数据库安装之后在\MySQLServer5.0\lib\opt目录下有所需要的各种文件,我们需要的只是以下几个:
libmysql.lib
libmysql.dll
同时需要\MySQLServer5.0\include目录下的几个文件:
mysql_version.h
my_list.h
mysql_com.h
mysql_time.h
mysql.h
my_alloc.h
typelib.h
准备Socket的基本文件
在VC的安装目录MicrosoftVisualStudio\VC98\Lib下找到:
WS2_32.LIB
把这些文件先准备好
2、 使用VC的AppWizard建立一个Win32ConsoleApplication,其实可以是Dialog工程或是其他类型工程,比如工程取名CMySQL
3、 把刚才准备好的文件拷贝你的工程目录下,和普通的CPP文件在同一个目录即可
4、建立之后,在VC的菜单栏点击Project(项目)->Settings(设置),弹出对话框,选择Link标签进入Link设置,在Object/librarymodules的框里面加入
libmysql.lib[有个空格]WS2_32.LIB
5、 在工程建立添加以下两个文件:
第一个文件头文件:
VspdCTOMySQL.h
/****************************MYSQLINC*******************************/
/*************************2007-03-07*******************************/
/*************************李克喜**************************************/
#include
#include
#include
#include"mysql.h"
using namespace std;
classVspdCToMySQL
{
public:
//变量
MYSQLmysql;
/*
构造函数和稀构函数
*/
VspdCToMySQL();
~VspdCToMySQL();
/*
主要的功能:
初始化数据库
连接数据库
设置字符集
入口参数:
host:
MYSQL服务器IP
port:
数据库端口
Db:
数据库名称
user:
数据库用户
passwd:
数据库用户的密码
charset:
希望使用的字符集
Msg:
返回的消息,包括错误消息
出口参数:
int:
0表示成功;1表示失败
*/
intConnMySQL(char*host,char*port,char*Db,char*user,char*passwd,char*charset,char*Msg);
/*
主要的功能:
查询数据
入口参数:
SQL:
查询的SQL语句
Cnum:
查询的列数
Msg:
返回的消息,包括错误消息
出口参数:
string准备放置返回的数据,多条记录则用0x06隔开,多个栏位用0x05隔开
如果返回的长度=0,责表示舞结果
*/
stringSelectData(char*SQL,intCnum,char*Msg);
/*
主要功能:
插入数据
入口参数
SQL:
查询的SQL语句
Msg:
返回的消息,包括错误消息
出口参数:
int:
0表示成功;1表示失败
*/
intInsertData(char*SQL,char*Msg);
/*
主要功能:
修改数据
入口参数
SQL:
查询的SQL语句
Msg:
返回的消息,包括错误消息
出口参数:
int:
0表示成功;1表示失败
*/
intUpdateData(char*SQL,char*Msg);
/*
主要功能:
删除数据
入口参数
SQL:
查询的SQL语句
Msg:
返回的消息,包括错误消息
出口参数:
int:
0表示成功;1表示失败
*/
intDeleteData(char*SQL,char*Msg);
/*
主要功能:
关闭数据库连接
*/
voidCloseMySQLConn();
};
第二个文件实现文件:
VspdCTOMySQL.cpp
/****************************MYSQLINC*******************************/
/*************************2007-03-07*******************************/
/*************************李克喜**************************************/
#inclu