基于ODBC的MFC与sql_server2008r2连接教程和错误解决方法

基于ODBC的MFC与sql_server2008r2连接教程和错误解决方法

应用环境:

编译平台:vs2013

数据库:Mysql Server2008r2

桥接软件: ODBC(微软提供的开放数据库连接器)

 

用MFC读写数据库的内容之前,需要分别对数据库server2008,ODBC,vs2013进行配置。

本文主要分为五大部分。第一部分介绍数据库server2008的配置;第二部分介绍ODBC的配置;第三部分介绍vs2013的配置;第四部分介绍MFC读写server2008数据库的一个简单实例;第五部分介绍一些常见的错误类型和解决方案。

注意:数据库安装教程请参考【数据库安装】文章

文章标题:MYSQLServer2008R2详细的图文安装教程

网址:http://blog.csdn.net/naibozhuan3744/article/details/78562769

 

一、数据库server2008的配置

1.1对sql server配置管理器进行配置,操作如下:

【开始菜单】-【Microsoft SQL Server2008 R2】-【配置工具】-【SQL Server配置管理器】

基于ODBC的MFC与sql_server2008r2连接教程和错误解决方法

 

1.2将协议名称【Named Pipes】的状态,改为已启用状态(初始状态为已禁用),修改后的状态如下图所示:(修改方法:在图标右击-启动)

基于ODBC的MFC与sql_server2008r2连接教程和错误解决方法

 

1.3启动sql server数据库登录界面

【开始菜单】–【Microsoft SQL Server 2008 R2】–【SQL Server Management Studio】

在【身份验证(A)】处,选择【SQL Server 身份验证】,然后将之前安装数据库时,设置的登录名和密码填写。比如我的登录名和密码如下:

登录名:sa

密码:sa

 基于ODBC的MFC与sql_server2008r2连接教程和错误解决方法

1.4在登录界面上,创建一个新的数据库,之后的c++程序将在这个数据库中读写数据。比如我新创建了一个Student数据库,在表里面添加了如下内容。

 基于ODBC的MFC与sql_server2008r2连接教程和错误解决方法

 

1.5在【安全性】-【登录名】-【sa】-【属性】(对图片sa单击右键,弹出属性对话框)界面,填写新的sa账号和密码。(不建议修改,如果之前安装的时候没有账号密码,可以在这里重新设置一个用于登录的账号密码)

 基于ODBC的MFC与sql_server2008r2连接教程和错误解决方法

 

并且确保选择页的【状态】是如下图所示:

 基于ODBC的MFC与sql_server2008r2连接教程和错误解决方法

1.6确保【数据库(根目录)】-【属性】(单击右键弹出属性对话框)-【安全性】的配置如下图所示:

 基于ODBC的MFC与sql_server2008r2连接教程和错误解决方法

二、 ODBC的配置

2.1打开ODBC

【开始菜单】-【运行框】输入ODBC,搜索出如下结果,然后选择第一个【数据源(ODBC)】,弹出如下界面。

基于ODBC的MFC与sql_server2008r2连接教程和错误解决方法

基于ODBC的MFC与sql_server2008r2连接教程和错误解决方法

我已经创建了一个SQL Server,接下来将重新创建一个。

2.2在【用户DSN】一栏下面的【添加】按钮,单击添加。在弹出的对话框中选择SQL Server,然后点击【完成】按钮。如下图所示:

基于ODBC的MFC与sql_server2008r2连接教程和错误解决方法

基于ODBC的MFC与sql_server2008r2连接教程和错误解决方法

弹出如下对话框:

【名称】:填写之前创建的sa账号

【服务器】:填写安装数据库时选择的(local)

基于ODBC的MFC与sql_server2008r2连接教程和错误解决方法

单击【下一步】,弹出如下对话框:

选择用ID和密码登录验证

【登录ID】:sa

【登录密码】:sa

基于ODBC的MFC与sql_server2008r2连接教程和错误解决方法

单击【下一步】,将【更改默认的数据库为】下面的组合框选择Student(之前用sql server数据库新创建的数据库,之后的程序将对这个Student数据库进行读写)

单击【下一步】选择默认的

基于ODBC的MFC与sql_server2008r2连接教程和错误解决方法

然后单击【完成】,测试成功,表明之前配置正确。

基于ODBC的MFC与sql_server2008r2连接教程和错误解决方法

 基于ODBC的MFC与sql_server2008r2连接教程和错误解决方法

三、 vs2013的配置

3.1新建一个MFC空白工程,如下图所示。

基于ODBC的MFC与sql_server2008r2连接教程和错误解决方法

基于ODBC的MFC与sql_server2008r2连接教程和错误解决方法

 

3.2创建好一个新的工程后,修改工程属性

将【字符集】改为【使用多字节字符集】

 基于ODBC的MFC与sql_server2008r2连接教程和错误解决方法

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.csdn.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.csdn.net/u013719984/article/details/51108816

http://blog.csdn.net/mytt_10566/article/details/56277697

http://blog.163.com/yulihu123456%40126/blog/static/3732428220101222134117/