基于ODBC的MFC与sql_server2008r2连接教程和错误解决方法
基于ODBC的MFC与sql_server2008r2连接教程和错误解决方法
应用环境:
编译平台:vs2013
数据库:Mysql Server2008r2
桥接软件: ODBC(微软提供的开放数据库连接器)
用MFC读写数据库的内容之前,需要分别对数据库server2008,ODBC,vs2013进行配置。
本文主要分为五大部分。第一部分介绍数据库server2008的配置;第二部分介绍ODBC的配置;第三部分介绍vs2013的配置;第四部分介绍MFC读写server2008数据库的一个简单实例;第五部分介绍一些常见的错误类型和解决方案。
注意:数据库安装教程请参考【数据库安装】文章
文章标题:MYSQLServer2008R2详细的图文安装教程
网址:http://blog.****.net/naibozhuan3744/article/details/78562769
一、数据库server2008的配置
1.1对sql server配置管理器进行配置,操作如下:
【开始菜单】-【Microsoft SQL Server2008 R2】-【配置工具】-【SQL Server配置管理器】
1.2将协议名称【Named Pipes】的状态,改为已启用状态(初始状态为已禁用),修改后的状态如下图所示:(修改方法:在图标右击-启动)
1.3启动sql server数据库登录界面
【开始菜单】–【Microsoft SQL Server 2008 R2】–【SQL Server Management Studio】
在【身份验证(A)】处,选择【SQL Server 身份验证】,然后将之前安装数据库时,设置的登录名和密码填写。比如我的登录名和密码如下:
登录名:sa
密码:sa
1.4在登录界面上,创建一个新的数据库,之后的c++程序将在这个数据库中读写数据。比如我新创建了一个Student数据库,在表里面添加了如下内容。
1.5在【安全性】-【登录名】-【sa】-【属性】(对图片sa单击右键,弹出属性对话框)界面,填写新的sa账号和密码。(不建议修改,如果之前安装的时候没有账号密码,可以在这里重新设置一个用于登录的账号密码)
并且确保选择页的【状态】是如下图所示:
1.6确保【数据库(根目录)】-【属性】(单击右键弹出属性对话框)-【安全性】的配置如下图所示:
二、 ODBC的配置
2.1打开ODBC
【开始菜单】-【运行框】输入ODBC,搜索出如下结果,然后选择第一个【数据源(ODBC)】,弹出如下界面。
我已经创建了一个SQL Server,接下来将重新创建一个。
2.2在【用户DSN】一栏下面的【添加】按钮,单击添加。在弹出的对话框中选择SQL Server,然后点击【完成】按钮。如下图所示:
弹出如下对话框:
【名称】:填写之前创建的sa账号
【服务器】:填写安装数据库时选择的(local)
单击【下一步】,弹出如下对话框:
选择用ID和密码登录验证
【登录ID】:sa
【登录密码】:sa
单击【下一步】,将【更改默认的数据库为】下面的组合框选择Student(之前用sql server数据库新创建的数据库,之后的程序将对这个Student数据库进行读写)
单击【下一步】选择默认的
然后单击【完成】,测试成功,表明之前配置正确。
三、 vs2013的配置
3.1新建一个MFC空白工程,如下图所示。
3.2创建好一个新的工程后,修改工程属性
将【字符集】改为【使用多字节字符集】
3.3此时,只要在函数中实例一个数据库对象,就可以调用数据库中的函数,对数据库进行读写操作,实例一个数据库对象代码如下:
CDatabase m_db;
四、 MFC读写server2008数据库的几个简单实例
4.1示例程序1:
//函数功能:动态及方式打开记录集,循环读数据库第一行数据,第二行数据,直到最后一行
CDatabase m_pdatabase;
CString str1, strSql, str2, str3, str4, str5, str6;
int count =0;
int a2 =m_pdatabase.Open(NULL,FALSE,FALSE,"ODBC;DSN=sa;UID=sa;PWD=sa");
CRecordset Sample(&m_pdatabase);
CString a10 =Sample.GetDefaultConnect();
int a3 =Sample.Open(CRecordset::dynaset,_T("Select*from [dbo].[boss]"));
int a4 =Sample.IsOpen();
Sample.MoveFirst();
while(!Sample.IsEOF())
{
Sample.GetFieldValue("姓名", str2);
Sample.GetFieldValue("公司", str3);
Sample.GetFieldValue("年龄", str4);
Sample.GetFieldValue("婚姻状况", str5);
Sample.GetFieldValue("学历", str6);
if(Sample.m_strFilter = "[年龄] = 49")
Sample.m_strFilter= "[年龄]";
Sample.MoveNext();
}
Sample.m_strFilter= "[年龄] = 49";
Sample.m_strSort ="[年龄]";
int a80 =Sample.Requery();
Sample.m_strSort ="[年龄]";
strSql =Sample.GetSQL();
Sample.Requery();
4.2示例程序2:
//函数功能:只读方式打开记录集,先将数据从数据库读到记录集缓冲区,然后按照年龄进行排序,读到设置的CString变量中
CDatabase m_pdatabase;
CString str1, strSql, str2, str3, str4, str5, str6, sSql;
int a2 =m_pdatabase.Open(NULL,FALSE,FALSE,"ODBC;DSN=sa;UID=sa;PWD=sa");
CRecordset Sample(&m_pdatabase);
sSql = "SELECT name, age "
"FROM [dbo].[boss] "
"ORDER BY age ";
int a3 =Sample.Open(CRecordset::forwardOnly, sSql,CRecordset::readOnly);//只读语句
while(!Sample.IsEOF())
{
Sample.GetFieldValue("name", str2);//从数据库中读出数据,读表头为"姓名"下面的第一数据
Sample.MoveNext();
}
Sample.Close();
4.3示例程序3:删除,插入,修改数据库中的数据
CDatabase m_pdatabase;
CString str1, strSql;
int count =0;
int a2 =m_pdatabase.Open(NULL,FALSE,FALSE,"ODBC;DSN=sa;UID=sa;PWD=sa");//打开数据库
CRecordset Sample(&m_pdatabase);//CRecordset
int a3 =Sample.Open(CRecordset::dynaset,_T("Select*from [dbo].[boss]"));//打开记录集
int a4 =Sample.IsOpen();
CString sSql;
sSql.Empty();//删除一组记录集
sSql = "DELETE FROM [Student].[dbo].[boss]WHERE name='媛媛' AND公司='健坤' AND婚姻状况='未婚'";//"徐景周",
m_pdatabase.ExecuteSQL(sSql);// m_pdatabase
sSql.Empty();//插入一组记录集
sSql = "INSERT INTO[Student].[dbo].[boss](name,公司,age,婚姻状况,学历,***) VALUES ('媛媛','健坤',26,'未婚','本科',NULL)";//"徐景周",
m_pdatabase.ExecuteSQL(sSql);// m_pdatabase
sSql.Empty();//修改张三的***,从1变为10 ORDER BY age DESC
sSql = "UPDATE [Student].[dbo].[boss] SET***=5 WHERE name='媛媛'";//"徐景周",
m_pdatabase.ExecuteSQL(sSql);// m_pdatabase
Sample.Close();
五、 MFC的视图类自动生成的类,编译出现典型错误
5.1错误代码:
CString Cboss::GetDefaultConnect()
{
CString str = "DSN=sa;Description=\x5b89\x88c5mysql\x521b\x5efa\x7684\x6570\x636e\x670d\x52a1\x5668;UID=sa;PWD=sa;APP=Microsoft\x00aeVisual Studio\x00ae 2013;WSID=TJQ-PC;DATABASE=Student";
return _T(str);
}
5.2错误提示:
error C2022: “23433”: 对字符来说太大 e:\1tjq\vs2013\project1\mysqltest2\mysqltest2\boss.cpp 31 1 MySqlTest2
5.3解决办法
将字符串里面的反斜杠”\”,全部改为双斜杠“\\”,修改后的正确代码如下:
CString Cboss::GetDefaultConnect()
{
CString str = "DSN=sa;Description=\\x5b89\\x88c5mysql\\x521b\\x5efa\\x7684\\x6570\\x636e\\x670d\\x52a1\\x5668;UID=sa;PWD=sa;APP=Microsoft\\x00aeVisual Studio\\x00ae 2013;WSID=TJQ-PC;DATABASE=Student";
return _T(str);
}
参考内容:
http://blog.****.net/circlesquare/article/details/6929777
http://www.vckbase.com/module/articleContent.php?id=231
http://doc.orz520.com/a/doc/2014/0511/1994197.html?from=haosou
http://www.php.cn/mysql-tutorials-126613.html
http://www.cnblogs.com/good90/archive/2012/03/04/2379371.html
http://blog.****.net/u013719984/article/details/51108816
http://blog.****.net/mytt_10566/article/details/56277697
http://blog.163.com/yulihu123456%40126/blog/static/3732428220101222134117/