1、首先我们要包含mysql的头文件,并链接mysql动态库。即添加以下语句:
#include <WinSock2.h>// 进行网络编程需要winsock2.h
#include <mysql.h>
#pragma comment(lib, “libmysql.lib”)
2、创建MYSQL变量。如:
MYSQL mysql
3、初始化MYSQL变量。
mysql_init(&mysql)
4、调用mysql_real_connect函数连接Mysql数据库。mysql_real_connect函数的原型如下:
MYSQL * STDCALL 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 long clientflag)
参数说明:mysql–前面定义的MYSQL变量;host–MYSQL服务器的地址;user–登录用户名;passwd–登录密码;db–要连接的数据库;port–MYSQL服务器的TCP服务端口;unix_socket–unix连接方式,为NULL时表示不使用socket或管道机制;clientflag–Mysql运行为ODBC数据库的标记,一般取0。连接失败时该函数返回0。
5、调用mysql_real_query函数进行数据库查询。mysql_real_query函数的原型如下:
int STDCALL mysql_real_query(MYSQL *mysql, const char *q, unsigned long length)
参数说明:mysql–前面定义的MYSQL变量;q–SQL查询语句;length–查询语句的长度。
查询成功则该函数返回0。
6、通过调用mysql_store_result或mysql_use_result函数返回的MYSQL_RES变量获取查询结果数据。
两个函数的原型分别为:
MYSQL_RES * STDCALL mysql_store_result(MYSQL *mysql)
MYSQL_RES * STDCALL mysql_use_result(MYSQL *mysql)
这两个函数分别代表了获取查询结果的两种方式。第一种,调用mysql_store_result函数将从Mysql服务器查询的所有数据都存储到客户端,然后读取;第二种,调用mysql_use_result初始化检索,以便于后面一行一行的读取结果集,而它本身并没有从服务器读取任何数据,这种方式较之第一种速度更快且所需内存更少,但它会绑定服务器,阻止其他线程更新任何表,而且必须重复执行mysql_fetch_row读取数据,直至返回NULL,否则未读取的行会在下一次查询时作为结果的一部分返回,故经常我们使用mysql_store_result。
7、调用mysql_fetch_row函数读取结果集数据。
上述两种方式最后都是重复调用mysql_fetch_row函数读取数据。mysql_fetch_row函数的原型如下:
MYSQL_ROW STDCALL mysql_fetch_row(MYSQL_RES *result)
参数result就是mysql_store_result或mysql_use_result的返回值。
该函数返回MYSQL_ROW型的变量,即字符串数组,假设为row,则row〔i〕为第i个字段的值。当到结果集尾部时,此函数返回NULL。
8、结果集用完后,调用mysql_free_result函数释放结果集,以防内存泄露。mysql_free_result函数的原型如下:
void STDCALL mysql_free_result(MYSQL_RES *result)
9、不再查询Mysql数据库时,调用mysql_close函数关闭数据库连接。mysql_close函数的原型为:
void STDCALL mysql_close(MYSQL *sock)
有时为了性能,我们会直接用C语言来开发相关的模块,尤其在我们的web应用中,虽然PHP、JSP等脚本均提供了MySQL的接口,但是显然直接使用C语言具有更好的安全性和性能,Michael以前用PHP开发的多个项目中就使用了C语言编写的这类接口,然后再编译到php里面,供php脚本直接使用,这方面的话题就不多说了,下面主要说一下在Linux下如何用C语言连接MySQL数据库,并且读取里面的数据返回,同时如何进行编译。if defined(_WIN32) || defined(_WIN64)为了支持windows平台上的编译#include<windows.h#endif#include<stdio.h#include<stdlib.h#includemysql.h我的机器上该文件在/usr/local/include/mysql下定义MySQL数据库 *** 作的宏,也可以不定义留着后面直接写进代码defineSELECT_QUERYselectusernamefromtbb_userwhereuserid=%dintmain(intargc,char**argv)char**argv相当于char*argv[]{MYSQL mysql,*sock定义数据库连接的句柄,它被用于几乎所有的MySQL函数MYSQL_RES *res查询结果集,结构类型MYSQL_FIELD *fd 包含字段信息的结构MYSQL_ROW row 存放一行查询结果的字符串数组char qbuf[160]存放查询sql语句字符串if(argc!=2){//检查输入参数fprintf(stderr,usage:mysql_select<userid\n\n)exit(1)}mysql_init(&mysql)if(!(sock=mysql_real_connect(&mysql,localhost,dbuser,dbpwd,9tmd_bbs_utf8,0,NULL,0))){fprintf(stderr,Couldn'tconnecttoengine!\n%s\n\n,mysql_error(&mysql))perror()exit(1)}sprintf(qbuf,SELECT_QUERY,atoi(argv[1]))if(mysql_query(sock,qbuf)){fprintf(stderr,Queryfailed(%s)\n,mysql_error(sock))exit(1)}if(!(res=mysql_store_result(sock))){fprintf(stderr,Couldn'tgetresultfrom%s\n,mysql_error(sock))exit(1)}printf(numberoffieldsreturned:%d\n,mysql_num_fields(res))while(row=mysql_fetch_row(res)){printf(Theruserid#%d'susernameis:%s\n,atoi(argv[1]),(((row[0]==NULL)&&(!strlen(row[0])))?NULL:row[0]))puts(queryok!\n)}mysql_free_result(res)mysql_close(sock)exit(0)return0为了兼容大部分的编译器加入此行}编译的时候,使用下面的命令gcc -o mysql_select ./mysql_select.c -I/usr/local/include/mysql -L/usr/local/lib/mysql -lmysqlclient (-lz) (-lm) 后面两个选项可选,根据您的环境情况运行的时候,执行下面的命令./mysql_select 1将返回如下结果:numberoffieldsreturned:1Theruserid#1'susernameis:Michaelqueryok!上面的代码我想大部分都能看明白,不明白的可以参考一下MySQL提供的有关C语言API部分文档源码天空,各个函数都有详细说明,有时间我整理一份常用的API说明出来。给你一个稍微复杂一点的查询,我设计的
看上图我把第一列标签后面的控件命名有规律,比如计划工厂后面文本框是"计划工厂t",Exapt命名为"计划工厂c",后面还隐藏一个listbox,命名为"计划工厂l"。
计划工厂 这个名称本身就是我要查询的表里面包含的字段。
利用这种界面,我要完成一些复杂点的查询:点文本框里的小图标按钮,d出工具,可以输入多条件,条件可以成立为模糊条件(用*代替不认识部分),也可以成立为否决条件。
选中Exapt全部否定所成立条件;点击执行按钮,有条件的成立条件,无条件的不成立。
所以这种东西贯穿软件我就不能每个都去做,就只能写一个类文件:
public class conditionset{
public void load_condit(Panel p)
{
foreach (Control ctl in p.Controls)
{
if (ctl is SkinTextBox)
{
SkinTextBox sktxt = (SkinTextBox)p.Controls[ctl.Name]
ListBox list = (ListBox)p.Controls[sktxt.Name.Substring(0, sktxt.Name.Length - 1) + "l"]
sktxt.IconClick += (Object sen, EventArgs ed) =>
{
ctl.condition toolform = new ctl.condition()
if (list.Items.Count > 0)
{
sktxt.Text = "┅"
sktxt.ReadOnly = true
}
foreach (var sm in list.Items)
{
toolform.dv.Rows.Add(sm.ToString())
}
toolform.Show()
toolform.cleari += (Object send, EventArgs er) =>
{
sktxt.Text = ""
sktxt.ReadOnly = false
}
toolform.subm += (Object send, EventArgs er) =>
{
list.Items.Clear()
foreach (DataGridViewRow dvr in toolform.dv.Rows)
{
if (Convert.ToString(dvr.Cells[0].Value) != "")
{
list.Items.Add(Convert.ToString(dvr.Cells[0].Value))
}
}
sktxt.Text = "┅"
sktxt.ReadOnly = true
}
}
}
}
}
public string condit(Panel p)
{
string master_condition = ""
foreach (Control ctl in p.Controls)
{
//遍历panel查找条件
#region
string condition = ""
if (ctl is SkinTextBox)
{
//文本框条件组合
#region
SkinTextBox sktxt = (SkinTextBox)p.Controls[ctl.Name]
string ziduan_name = sktxt.Name.Substring(0, sktxt.Name.Length - 1)
SkinCheckBox skck = (SkinCheckBox)p.Controls[ctl.Name.Substring(0, ctl.Name.Length - 1) + "c"]
ListBox list = (ListBox)p.Controls[ctl.Name.Substring(0, ctl.Name.Length - 1) + "l"]
if (sktxt.Text != "")
{
if (sktxt.Text == "┅")
{
string blur_str = "", blur = ""
foreach (var itm in list.Items)
{
if (itm.ToString().Contains("*"))
{
if (skck.Checked == true)
{
blur += " and " + ziduan_name + " not like '" + itm.ToString().Replace("*", "%") + "'"
}
else
{
blur += " or " + ziduan_name + " like '" + itm.ToString().Replace("*", "%") + "'"
}
}
else
{
blur_str += "'" + Convert.ToString(itm) + "',"
}
}
string blur_sql = (blur == "") ? "" : blur.Substring(4, blur.Length - 4).Trim()
string in_condition = "", like_condition = ""
if (skck.Checked == true)
{
in_condition = ziduan_name + " not in "
like_condition = " and "
}
else
{
in_condition = ziduan_name + " in "
like_condition = " or "
}
string contains_sql = (blur_str == "") ? "" : in_condition + "(" + blur_str.Substring(0, blur_str.Length - 1) + ")"
condition = contains_sql + blur_sql
if (blur_sql != "" && contains_sql != "")
{
condition = contains_sql + like_condition + blur_sql
}
else
{
condition = contains_sql + blur_sql
}
}
else
{
if (!sktxt.Text.Contains("*"))
{
if (skck.Checked == true)
{
condition = ziduan_name + "<>'" + sktxt.Text + "'"
}
else
{
condition = ziduan_name + "='" + sktxt.Text + "'"
}
}
else
{
if (skck.Checked == true)
{
condition = ziduan_name + " not like '" + sktxt.Text.Replace("*", "%") + "'"
}
else
{
condition = ziduan_name + " like '" + sktxt.Text.Replace("*", "%") + "'"
}
}
}
}
#endregion
}
if (ctl is SkinDateTimePicker)
{
//日期条件组合
#region
if (ctl.Name.Substring(ctl.Name.Length - 1, 1) != "t")
{
SkinDateTimePicker skdate_sta = (SkinDateTimePicker)p.Controls[ctl.Name]
SkinDateTimePicker skdate_end = (SkinDateTimePicker)p.Controls[ctl.Name + "t"]
if (skdate_sta.text != "")
{
if (skdate_end.text == "")
{
condition = skdate_sta.Name + "='" + skdate_sta.text + "'"
}
else
{
condition = skdate_sta.Name + ">='" + skdate_sta.text + "' and " + skdate_sta.Name + "<='" + skdate_end.text + "'"
}
}
}
#endregion
}
master_condition += (condition == "") ? "" : "(" + condition + ") and "
#endregion //遍历panel查找条件
}
string condition_sql = (master_condition == "") ? "" : master_condition.Substring(0, master_condition.Length - 5)
return condition_sql
}
}
工具用一个窗体代替:
public partial class condition : Form{
public condition()
{
InitializeComponent()
}
public event EventHandler subm
public event EventHandler cleari
private void submit_Click(object sender, EventArgs e)
{
subm(sender, e)
this.Dispose()
}
private void clearit_Click(object sender, EventArgs e)
{
this.Dispose()
dv.Rows.Clear()
cleari(sender, e)
}
}
当我们执行多条件的时候就等于拼接条件
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)