由於短學期作業需要在之前程序的服務器中加入數據庫,就簡單學習了下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