
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)
1.数据库连接:在config文件中的形式<connectionStrings>
<add name="dbConnection" connectionString="Data Source=192.168.1.100Initial Catalog=NanFangMgrUser ID=saPassWord=sa" providerName="System.Data.SqlClient"/>
</connectionStrings>
2.在C#中调用:
System.Configuration.ConfigurationManager.ConnectionStrings["dbConnection"].ConnectionString
3.将上述连接串保存到文本文件中
private string FILE_NAME = Application.StartupPath + "\\mytxtFile.txt"
private void WriteFile(string str)
{
StreamWriter sr
if (File.Exists(FILE_NAME)) //如果文件存在,则创建File.AppendText对象
{
sr = File.AppendText(FILE_NAME)
}
else//如果文件不存在,则创建File.CreateText对象
{
sr = File.CreateText(FILE_NAME)
}
sr.WriteLine(str)
sr.Close()
}
4.从文本文件中去内容
private String ReadTxtFile()
{
if (File.Exists(FILE_NAME)) //如果文件存在
{
String[] strs = System.IO.File.ReadAllLines(FILE_NAME)
return strs[strs.Length - 1]
}
return String.Empty
}
5.数据库连接,并 *** 作
5.1 查询
String ConnectionString=System.Configuration.ConfigurationManager.ConnectionStrings["dbConnection"].ConnectionString
public DataTable Query(String where)
{
String sql = String.Format("select * from mytable Where {0}", where.ToLower().Replace("update", "").Replace("delete", "").Replace("insert", "").Replace("", "").Replace("--", "").Replace("exec", ""))
try
{
SqlDataAdapter da = new SqlDataAdapter(sql, new SqlConnection(ConnectionString))
DataTable dt = new DataTable()
da.Fill(dt)
return dt
}
catch
{
return null
}
}
5.2 新增
public int New(Entities.mytable obj)
{
String sql = "insert into mytable(pkid,a,b,c) values(@pkid,@a,@b,@c)"
SqlConnection cn = new SqlConnection(ConnectionString)
SqlCommand cmd = new SqlCommand(sql, cn)
cmd.Parameters.AddWithValue("@a", obj.a)
cmd.Parameters.AddWithValue("@b", obj.b)
cmd.Parameters.AddWithValue("@c", obj.c)
cmd.Parameters.AddWithValue("@pkid",
String.Empty.Equals(obj.pkid) ? System.Guid.NewGuid().ToString() : obj.pkid)
try
{
if (cn.State != ConnectionState.Open)
cn.Open()
return cmd.ExecuteNonQuery()
}
catch
{
return -1
}
finally
{
if (cn.State != ConnectionState.Closed)
cn.Close()
}
}
5.3 编辑
public int Update(Entities.mytable obj)
{
String sql = "Update mytable Set a=@a,b=@b,c=@c Where pkid=@ObjectID"
SqlConnection cn = new SqlConnection(ConnectionString)
SqlCommand cmd = new SqlCommand(sql, cn)
cmd.Parameters.AddWithValue("@a", obj.a)
cmd.Parameters.AddWithValue("@b", obj.b)
cmd.Parameters.AddWithValue("@c", obj.c)
cmd.Parameters.AddWithValue("@pkid", obj.pkid)
try
{
if (cn.State != ConnectionState.Open)
cn.Open()
return cmd.ExecuteNonQuery()
}
catch
{
return -1
}
finally
{
if (cn.State != ConnectionState.Closed)
cn.Close()
}
}
5.4 删除
public int Del(String where)
{
String sql = String.Format("delete from mytable Where {0}", where.ToLower().Replace("update", "").Replace("delete", ""))
SqlConnection cn = new SqlConnection(ConnectionString)
SqlCommand cmd = new SqlCommand(sql, cn)
try
{
if (cn.State != ConnectionState.Open)
cn.Open()
return cmd.ExecuteNonQuery()
}
catch
{
return -1
}
finally
{
if (cn.State != ConnectionState.Closed)
cn.Close()
}
}
C++连接SQL数据库第一步 系统配置1.设置SQLSERVER服务器为SQL登录方式,并且系统安全性中的sa用户要设置登录功能为“启用”,还有必须要有密码。
2.需要在ODBC中进行数据源配置,数据源选\”SQL SERVER”,登录方式使用“使用输入用户登录ID和密码的SQL SERVER验证”,并填写登录名(sa)和密码,注意一点,密码不能为空,这就意味着你的sa用户必须得有密码。否则无法通过系统本身的安全策略。测试通过就完成了配置。
C++连接SQL数据库第二步 C++与SQL连接初始化
1.在你所建立的C++项目中的stdafx.h头文件中引入ADO
具体代码如下
#import “c:\Program Files\Common Files\System\ado\msado15.dll”
no_namespace rename(”EOF”, “adoEOF”) rename(”BOF”, “adoBOF”)
2.定义_ConnectionPtr变量后调用Connection对象的Open方法建立与服务器的连接。
数据类型_ConnectionPtr实际上是由类模板_com_ptr_t得到的一个具体的实例类。_ConnectionPtr类封装了Connection对象的Idispatch接口指针及其一些必要的 *** 作。可以通过这个指针 *** 纵Connection对象。
例如连接SQLServer数据库,代码如下:
//连接到MS SQL Server
//初始化指针
_ConnectionPtr pMyConnect = NULL
HRESULT hr = pMyConnect.CreateInstance(__uuidof(Connection))
if (FAILED(hr))
return
//初始化链接参数
_bstr_t strConnect = “Provider=SQLOLEDB
Server=hch
Database=mytest
uid=sapwd=sa”//Database指你系统中的数据库
//执行连接
try
{
// Open方法连接字串必须四BSTR或者_bstr_t类型
pMyConnect->Open(strConnect, “”, “”, NULL)
}
catch(_com_error &e)
{
MessageBox(e.Description(), “警告”, MB_OK|MB_ICONINFORMATION)
}//发生链接错误
C++连接SQL数据库第三步 简单的数据连接
//定义_RecordsetPtr变量,调用它Recordset对象的Open,即可打开一个数据集
//初始化过程 以下是个实例
_RecordsetPtr pRecordset
if (FAILED(pRecordset.CreateInstance(__uuidof(Recordset))))
{
return
}
//执行 *** 作
try
{
pRecordset->Open(_variant_t(”userinfo”),
_variant_t((IDispatch*)pMyConnect),
adOpenKeyset, adLockOptimistic, adCmdTable)
}
catch (_com_error &e)
{
MessageBox(”无法打开userinfo表\”, “系统提示”,
MB_OK|MB_ICONINFORMATION)
}
C++连接SQL数据库第四步 执行SQL语句
这里是关键,我认为只要你懂点SQL语句那么一切都会方便许多比用上面的方法简单,更有效率点。
首先
m_pConnection.CreateInstance(_uuidof(Connection))
//初始化Connection指针
m_pRecordset.CreateInstance(__uuidof(Recordset))
//初始化Recordset指针
CString strSql=”select * from tb_goods”//具体执行的SQL语句
m_pRecordset=m_pConnection->Execute(_bstr_t(strSql),
NULL, adCmdText)//将查询数据导入m_pRecordset数据容器
至此 你的SQL语句已经执行完成了m_pRecordset内的数据就是你执行的结果。
取得记录:
while(!m_pRecordset->adoEOF)//遍历并读取name列的记录并输出
{
CString temp = (TCHAR *)(_bstr_t)m_pRecordset->GetFields()->GetItem
(”name”)->Value
AfxMessageBox(temp)
pRecordset->MoveNext()
}
插入记录
//记得初始化指针再执行以下 *** 作
CString strsql
strsql.Format(”insert into tb_goods(no,name, price)
values(’%d’,'%s’, %d)”,m_intNo,m_strName,m_intPrice)
m_pRecordset=m_pConnection->
Execute(_bstr_t(strsql),NULL,adCmdText)
修改记录
CString strsql
strsql.Format(”update tb_goods set name=’%s’ ,
price=%d where no=%d “,m_strName,m_intPrice,m_intNo)
m_pRecordset=m_pConnection->Execute(_bstr_t(strsql),NULL,adCmdText)
删除记录
CString strsql
strsql.Format(”delete from tb_goodswhere no= ‘%d’ “,m_intNo)
m_pRecordset=m_pConnection->Execute(_bstr_t(strsql),NULL,adCmdText)
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)