由于短学期作业需要在之前程序的服务器中加入数据库,就简单学习了下vs2010中自带的数据库sqlsever2008,学习的过程并不是很顺利,在网上没有找到特别完整的教程,现在课程结束了,特地来写一个,以方便后面的孩纸们,由于本人也是学的半懂不懂的,如果有什么不对的地方还请大家指正!
一、从零开始,建立一个数据库
(1)打开VS2010,工具->连接到数据库,然后在弹出的对话中框选择“Microsoft SQL Server”,单击“继续”
(2)在下图所示对话框“服务器名”中输入“自己的计算机名\SQLEXPRESS”,如“Disturbance-PC\SQLEXPRESS”,单击“确定”。也可以先单击“测试连接”按钮进行测试,会弹出对话框提示。
(3)之前用VS2010的时候大家应该都有看到个叫“服务器资源管理器"的东西吧,反正我是注意到了,但是不知道它是干嘛的,现在才知道是管理数据库用的。执行过上面的操作后应该已经连接到了默认的master数据库,可以单击鼠标右键来添加表或其它东西,这里就不多说了吧。
(4) 如果你没有成功,可能是在安装Visual Studio时没有安装SQL Server组件。此时只需要重新运行Visual Studio的安装程序,选择“更改或移除Microsoft Visual Studio 2010”,单击下一步,再单击“添加或删除功能”,确保勾选“Microsoft SQL Server 2008 Express Studio”。
(5)此时SQL Server的服务默认已经启动。如果是你不小心手动将其停止的话,可以运行Sql Server 配置管理器将其启动(开始菜单中可以找到)。
二、完成了数据库的创建之后,我们首先想到的就是怎么在程序中去连接它了,这里我们用ADO的方法来连接。
(1)ADO使用步骤方法:
1. 初始化COM库,引入ADO库定义文件
2. 用Connection对象连接数据库
3. 利用建立好的连接,通过Connection、Command对象执行SQL命令,或利用Recordset对象取得结果记录集进行查询、处理
4. 使用完毕后关闭连接释放对象
(2)具体操作:
1.添加头文件CADO.h,其中import的路径要根据自己电脑的系统来确定,反正找到msado15.dll就可以了。
1 #pragma once 2 #import "C:\Program Files (x86)\Common Files\System\ado\msado15.dll" no_namespace rename("EOF", "adoEOF") 3 #include <icrsint.h> 4 class CADO 5 { 6 public: 7 CADO(void); 8 ~CADO(void); 9 _ConnectionPtr m_pConnection; 10 _RecordsetPtr m_pRecordset; 11 void Connect(void); 12 void ExitConnect(void); 13 _RecordsetPtr& GetRecordset(_bstr_t SQL); 14 };
2.添加CADO.cpp,其中m_pConnection->ConnectionString后面的连接串的确定要根据自己电脑来确定,后面会讲到怎么得到连接串,我一开始就是因为找不到正确的连接串,浪费了好多时间。
1 #include "ADO.h" 2 #include<iostream> 3 using namespace std; 4 5 CADO::CADO(void) 6 { 7 } 8 9 10 CADO::~CADO(void) 11 { 12 } 13 14 void CADO::Connect(void) 15 { 16 try{ 17 CoInitialize(NULL); //初始化COM环境 18 m_pConnection.CreateInstance("ADODB.Connection"); //创建连接对象 19 m_pConnection->ConnectionString="Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;User ID=test;Initial Catalog=UserInfo1;Data Source=Disturbance-PC\\SQLEXPRESS"; 20 HRESULT hr=m_pConnection->Open("", "", "", adModeUnknown); 21 if(hr!=S_OK) 22 cout<<"Can not connect to the specified database!"<<endl; 23 } 24 catch(_com_error e){ 25 cout<<e.Description()<<endl; 26 } 27 } 28 void CADO::ExitConnect(void) 29 { 30 if(m_pRecordset!=NULL){ 31 m_pRecordset->Close(); 32 m_pConnection->Close(); 33 } 34 ::CoUninitialize(); //释放环境 35 } 36 37 _RecordsetPtr& CADO::GetRecordset(_bstr_t SQL) 38 { 39 m_pRecordset=NULL; 40 CADO link; 41 try{ 42 if(m_pConnection==NULL) 43 Connect(); 44 m_pRecordset.CreateInstance(__uuidof(Recordset)); 45 m_pRecordset->Open((_bstr_t)SQL, m_pConnection.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText); 46 } 47 catch(_com_error e){ 48 cout<<e.Description()<<endl; 49 m_pRecordset=NULL; 50 return m_pRecordset; 51 } 52 return m_pRecordset; 53 }
3.在main函数中进行数据库操作,有几个注意事项
(1).对m_pRecordset=record.GetRecordset(bstr_t);这句话,一直不知道返回值是个什么,之后才发现可以把它理解为一个指针,指向你所查找的满足条件的数据的第一行,我们只需要配合m_pRecordset->MoveNext();往下移一行就可以遍历整个表,而m_pRecordset->PutCollect和m_pRecordset->GetCollect可以分别对当前行特定列的数据进行存取,知道了这些,你就可以完成一些数据库的基本操作了,如果需要更多的功能,请自行百度ADO操作的函数。
(2).m_pRecordset->GetCollect返回的类型是_variant_t,对于字符串类型的数据项,要用CString()强制转换,我尝试了网上的很多方法来转char*都没有成功,这个问题也浪费了好多的时间,如果大家有什么方法的话一定要分享一下哈。
1 #include<afxwin.h> 2 #include <iostream> 3 #include "ADO.h" 4 #include<string> 5 using namespace std; 6 7 void main() 8 { 9 10 string sql; 11 CADO record; 12 record.Connect(); 13 _RecordsetPtr m_pRecordset; 14 sql="select * from UserInfo";//这句话代表找到数据库中表UserInfo的位置 15 _bstr_t bstr_t(sql.c_str()); 16 m_pRecordset=record.GetRecordset(bstr_t);//返回的可以假设是一个指针,它指向该表的第一行 17 18 //m_pRecordset->MoveFirst(); //移到首条记录 19 while(!m_pRecordset->adoEOF){ 20 m_pRecordset->Delete(adAffectCurrent); //删除当前记录 21 m_pRecordset->MoveNext();//移动到下一行 22 } 23 24 _variant_t vUsername,vBirthday,vID,vOld; 25 for(int i=0;i<3;i++) //添加三条新记录并赋值 26 { 27 m_pRecordset->AddNew(); //添加新记录 28 m_pRecordset->PutCollect("学号",_variant_t((int)(i+10))); 29 m_pRecordset->PutCollect("姓名",_variant_t("ADASA")); 30 m_pRecordset->PutCollect("年龄",_variant_t((int)21)); 31 m_pRecordset->PutCollect("生日",_variant_t("1930-3-15")); 32 } 33 m_pRecordset->Update(); //保存到库中,和AddNew对应 34 35 m_pRecordset=record.GetRecordset(bstr_t);//再次获得第一行的指针 36 while(!m_pRecordset->adoEOF) 37 { 38 vID = m_pRecordset->GetCollect(_variant_t((long)0));//取得第1列的值,从0开始计数,你也可以直接给出列的名称,如下一行 39 vUsername = m_pRecordset->GetCollect("姓名");//取得姓名字段的值 40 vOld = m_pRecordset->GetCollect("年龄"); 41 vBirthday = m_pRecordset->GetCollect("生日"); 42 printf("id:%d,姓名:%s,年龄:%d,生日:%s\r\n", 43 vID.lVal, 44 CString(vUsername.bstrVal), 45 vOld.lVal, 46 CString(vBirthday.bstrVal)); //在DEBUG方式下的OUTPUT窗口输出记录集中的记录 47 m_pRecordset->MoveNext(); //移到下一条记录 48 } 49 record.ExitConnect(); 50 }
三、连接字符串的获取
别小看这个字符串,要是没有正确的方法,还真的那它没辙啊!!这里直接复制网上找到的方法了:
任意新建一个txt文件,重命名为.x.udl。然后双击此文件,将出现“数据库连接属性”窗口。第一个标签页“提供程序”列出了所有数据库引擎,Access, SQL Server, Oracle等,选择后点下一步跳至第二个标签页“连接”,选择服务器名称栏可以填上服务器的IP地址,本机则可不填或填点号(我这里填了“自己的计算机名\SQLEXPRESS”才连上);填上数据库用户名和密码后就可以选择数据库了。点“测试连接”按钮,成功。确定。用记事本打开x.udl。将会看到它生成的连接字符串。如下:
"Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;User ID=test;Initial Catalog=UserInfo1;Data Source=Disturbance-PC\\SQLEXPRESS";
此连接串中,Persist Security Info属性为True时表示在建立连接后仍然保存密码,一般取False即可。ID和Password属性只有在上述数据库属性对话框中勾选“允许保存密码”时才会有。自己可以手工添加。Cfdata是我的数据库名。
PS:如果连接串里面有‘\’符号的话,要写成‘\\‘,不然会因为转义出问题。
至此就大功搞成了,步骤好少哇。
整个教程引用了很多别人的代码和教程,希望能帮助到大家把^^
转发请注明出处哦:http://www.cnblogs.com/SolarWings/
参考的链接:
1.使用VS2010内部的数据库sqlserver2008
http://bbs.cfan.com.cn/thread-1530883-1-1.html
2.在win32程序中连接数据库
http://www.cnblogs.com/littlex/archive/2012/07/03/2574782.html
3.上个步骤中的连接字符串会出问题,正确方法参见
http://blog.csdn.net/asanscape/article/details/6084600
vs2010 win32程序中 sqlserver 2008 express的简单使用 (C++)