有好久不写博客记录自己的学习历程了,由于以前只用过JAVA和安卓开发数据库,今天闲来无聊根据网上的一系列相关的教程自学了下C语言MYSQL数据库开发。写篇博客记录下今天学习的收获和感悟,其中包括从MYSQL的安装,环境配置,VS2010连接数据库以及在编程时遇到的一系列问题及我的解决措施。
首先是安装MYSQL,我安装的是MYSQL5.0 下面是下载链接:
我还下载了个SQLYOG用于管理数据库,由于是图形化界面,所以平时管理数据库时候更加方便直观,激活码网上可以百度到。 下面附上下载链接:
http://dx.pc6.com/soft11/pc6-mysql-SQLyog.Ultimatev9.2.0.2.zip
安装MYSQL前面一直很顺利,就是到了配置时候出现无限未响应状态。具体解决措施就是:
1.把MYSQL彻底卸载掉,把C盘和注册表中关于MYSQL的东西都删除掉。
2.打开安装好的MYSQL目录,在BIN文件夹中找到 MySQLInstanceConfig.exe ,右键点开属性,在兼容性中把兼容模式运行和管理员模式运行都选中,然后再点开MySQLInstanceConfig.exe开始安装,应该就没什么问题了。
下一步就是打开VS2010,连接MYSQL数据库了,具体步骤:
1.新建一个WIN32项目。
2。点开项目属性,在VC++目录中、把MYSQL5.0/INCLUDE添加到包含目录,把MYSQL/LIB/DEBUG添加到库目录。
3.在打开链接器 -》输入 的附加依赖项中添加 libmysql.lib.
然后就可以写程序实现对MYSQL数据库的链接了。
下面简单说下MYSQL C API编程,由于我下午才开始学习,理解也不是特别深刻,下面附些我写的代码:
首先说下头文件必须要有
#include <WinSock2.h>
#include <mysql.h>
然后就可以写程序正文了,首先要初始化MYSQL,并且与MYSQL数据库建立连接
MYSQL mydata;
mysql_library_init(0,NULL,NULL);
mysql_init(&mydata);
mysql_options(&mydata,MYSQL_SET_CHARSET_NAME,"gbk");
if(mysql_real_connect(&mydata,"localhost","root","root","test",3306,0,0) != NULL)
{
MessageBox(NULL,TEXT("连接成功!"),TEXT(""),MB_OK);
}
else{
MessageBox(NULL,TEXT("error"),TEXT(""),MB_OK);}
mysql_init()用来初始化MYSQL,如果mysql_real_connect()执行成功了,说明就成功连接到了数据库。
下面简单贴个实现插入和查找功能的代码:
void DBT_INSERT(TCHAR* str,int i,TCHAR *str2)
{
//INSERT语句
TCHAR sql[256];
ZeroMemory(sql,sizeof(sql)/sizeof(TCHAR));
wsprintf(sql,TEXT(" INSERT INTO writers VALUES('%s',%i,'%s')"),str,i,str2);
char sqlch[256];
ZeroMemory(sqlch,sizeof(sqlch)/sizeof(char));
wcstombs(sqlch,sql,sizeof(sql));
WideCharToMultiByte(CP_OEMCP,NULL,sql,-1,sqlch,100,NULL,FALSE);
if(mysql_query(&mydata,sqlch)==NULL)
{
MessageBox(NULL,TEXT("INSERTION SUCCEED!"),TEXT(""),MB_OK);
}
else
{
MessageBox(NULL,TEXT("INSERTION FAILED!"),TEXT(""),MB_OK);
}
}
void DBT_SELECT(HWND hwnd)
{
HWND listbox = GetDlgItem(hwnd,IDC_LIST1);
ListBox_ResetContent(listbox);
char *sql = new char[256];
sql = "SELECT * FROM writers";
mysql_query(&mydata,sql);
MYSQL_RES *result = mysql_store_result(&mydata);
int num_row = mysql_num_rows(result);
int num_field = mysql_num_fields(result);
MYSQL_ROW row;
MYSQL_FIELD *field;
field = mysql_fetch_field(result);
row = mysql_fetch_row(result);
char *a = new char[256];
ZeroMemory(a,sizeof(a)/sizeof(char));
char *b;
TCHAR c[256];
bool isfirst = true;
while(field)
{
b = (char *)field->name;
if(isfirst == true)
{
sprintf(a,"%s%s",a,b);
isfirst = false;
}
else
{
sprintf(a,"%s\t%s",a,b);
}
field = mysql_fetch_field(result);
}
MultiByteToWideChar(CP_ACP,NULL,a,-1,c,256);
ListBox_InsertString(listbox,-1,c);
while(row)
{
isfirst = true;
ZeroMemory(a,sizeof(a)/sizeof(char));
for(int i=0 ; i<num_field ; i++)
{
b = (char*) row[i];
if(isfirst == true)
{
sprintf(a,"%s%s",a,b);
isfirst = false;
}
else
{
sprintf(a,"%s\t%s",a,b);
}
}
MultiByteToWideChar(CP_ACP,0,a,-1,c,256);
ListBox_InsertString(listbox,-1,c);
row = mysql_fetch_row(result);
}
mysql_free_result(result);
}
插入功能没什么好讲究的,主要说下SELECT语句,执行SELECT语句后,结果被保存在了MYSQL_RES 中,要用 row = mysql_fetch_row(result); 将记录一行一行读出来, row = mysql_fetch_row(result);语句执行一遍,row所指向的内容就自动跳到了下一跳记录。MYSQL API C编程的实例网上有许多,我就不再赘述了。以后随着学习深入再慢慢改正补充吧。