vs2010 win32程序中 sqlserver 2008 express的簡單使用 (C++)


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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM