MFC串連SQL Server資料庫

來源:互聯網
上載者:User

標籤:

C++串連SQL資料庫分步驟進行

我們在進行C++串連SQL資料庫的操作時,首先應該進行相應的系統配置,然後初始化C++與SQL串連,然後再進行資料連線的操作,然後應用SQL執行語言來具體操作。 

C++串連SQL資料庫第一步 系統配置

1.設定SQLSERVER伺服器為SQL登入方式,並且系統安全性中的sa使用者要設定登入功能為“啟用”,還有必須要有密碼。

2.需要在ODBC中進行資料來源配置,資料來源選\”SQL SERVER”,登入方式使用“使用輸入使用者登入ID和密碼的SQL SERVER驗證”,並填寫登入名稱(sa)和密碼,注意一點,密碼不可為空,這就意味著你的sa使用者必須得有密碼。否則無法通過系統本身的安全性原則。測試通過就完成了配置。

C++串連SQL資料庫第二步 C++與SQL串連初始化

1.在你所建立的C++項目中的stdafx.h標頭檔中引入ADO

具體代碼如下

#import “c:\Program Files\Common Files\System\ado\msado15.dll” no_namespace rename(”EOF”, “adoEOF”) rename(”BOF”, “adoBOF”)

2.定義_ConnectionPtr變數後調用Connection對象的Open方法建立與伺服器的串連。

資料類型_ConnectionPtr實際上是由類模板_com_ptr_t得到的一個具體的執行個體類。_ConnectionPtr類封裝了Connection對象的Idispatch介面指標及其一些必要的操作。可以通過這個指標操縱Connection對象。

例如串連SQLServer資料庫,代碼如下:

//串連到MS SQL Server
//初始化指標
_ConnectionPtr pMyConnect = NULL;
HRESULT hr = pMyConnect.CreateInstance(__uuidof(Connection));
if (FAILED(hr))
return;
//初始化連結參數
_bstr_t strConnect = “Provider=SQLOLEDB;
Server=CQH-PC; //伺服器或本機電腦名
Database=mytest; //Database指你系統中的資料庫
uid=sa; //使用者名稱
pwd=psw”; //密碼

//執行串連
try
{
// Open方法串連字串必須四BSTR或者_bstr_t類型
pMyConnect->Open(strConnect, “”, “”, NULL);
}
catch(_com_error &e)
{
MessageBox(e.Description(), “警告”, MB_OK|MB_ICONINFORMATION);
}//發生連結錯誤

C++串連SQL資料庫第三步 簡單的資料連線

//定義_RecordsetPtr變數,調用它Recordset對象的Open,即可開啟一個資料集
//初始化過程 以下是個執行個體
_RecordsetPtr pRecordset;
if (FAILED(pRecordset.CreateInstance(__uuidof(Recordset))))
{
return;
}

//執行操作
try
{
pRecordset->Open(_variant_t(”userinfo”),
_variant_t((IDispatch*)pMyConnect), adOpenKeyset, adLockOptimistic, adCmdTable);
}
catch (_com_error &e)
{
MessageBox(”無法開啟userinfo表\”, “系統提示”, MB_OK|MB_ICONINFORMATION);
}

C++串連SQL資料庫第四步 執行SQL語句

這裡是關鍵,我認為只要你懂點SQL語句那麼一切都會方便許多比用上面的方法簡單,更有效率點。

首先

m_pConnection.CreateInstance(_uuidof(Connection));
//初始化Connection指標
m_pRecordset.CreateInstance(__uuidof(Recordset));
//初始化Recordset指標
CString strSql=”select * from tb_goods”;//具體執行的SQL語句

m_pRecordset=m_pConnection->Execute(_bstr_t(strSql), NULL, adCmdText);//將查詢資料匯入m_pRecordset資料容器

至此 你的SQL語句已經執行完成了m_pRecordset內的資料就是你執行的結果。

取得記錄:

while(!m_pRecordset->adoEOF)//遍曆並讀取name列的記錄並輸出
{
CString temp = (TCHAR *)(_bstr_t)m_pRecordset->GetFields()->GetItem (”name”)->Value; AfxMessageBox(temp);
pRecordset->MoveNext();
}

插入記錄:

//記得初始化指標再執行以下操作
CString strsql;
strsql.Format(”insert into tb_goods(no,name, price) values(’%d’,‘%s’, %d)”,m_intNo,m_strName,m_intPrice);
m_pRecordset=m_pConnection->Execute(_bstr_t(strsql),NULL,adCmdText);

 修改記錄:

CString strsql;
strsql.Format(”update tb_goods set name=’%s’ , price=%d where no=%d “,m_strName,m_intPrice,m_intNo);
m_pRecordset=m_pConnection->Execute(_bstr_t(strsql),NULL,adCmdText);

 刪除記錄:

CString strsql;
strsql.Format(”delete from tb_goodswhere no= ‘%d’ “,m_intNo); m_pRecordset=m_pConnection->Execute(_bstr_t(strsql),NULL,adCmdText);

 

*******************************************************************************************

ADO資料庫開發的基本流程 
(1)初始化COM庫,引入ADO庫定義檔案
(2)用Connection對象串連資料庫
(3)利用建立好的串連,通過Connection、Command對象執行SQL命令,或利用Recordset對象取得結果記錄集進行查詢、處理。
(4)使用完畢後關閉串連釋放對象。

準備工作:
為了大家都能測試本文提供的例子,我們採用Access資料庫,您也可以直接在我們提供的範例程式碼中找到這個test.mdb。
下面我們將詳細介紹上述步驟並給出相關代碼。
【1】COM庫的初始化
我們可以使用AfxOleInit()來初始化COM庫,這項工作通常在CWinApp::InitInstance()的重載函數中完成,請看如下代碼:

BOOL CADOTest1App::InitInstance()
{
AfxOleInit();
......

【2】用#import指令引入ADO類型庫
我們在stdafx.h中加入如下語句:(stdafx.h這個檔案哪裡可以找到?你可以在FileView中的Header Files裡找到)

#import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename("EOF","adoEOF")
這一語句有何作用呢?其最終作用同我們熟悉的#include類似,編譯的時候系統會為我們產生msado15.tlh,ado15.tli兩個C++標頭檔來定義ADO庫。

幾點說明:
(1) 您的環境中msado15.dll不一定在這個目錄下,請按實際情況修改
(2) 在編譯的時候肯能會出現如下警告,對此微軟在MSDN中作了說明,並建議我們不要理會這個警告。
msado15.tlh(405) : warning C4146: unary minus operator applied to unsigned type, result still unsigned

【3】建立Connection對象並串連資料庫
首先我們需要添加一個指向Connection對象的指標:
_ConnectionPtr m_pConnection;
下面的代碼示範了如何建立Connection對象執行個體及如何串連資料庫並進行異常捕捉。

BOOL CADOTest1Dlg::OnInitDialog()
{
CDialog::OnInitDialog();
HRESULT hr;
try
{
hr = m_pConnection.CreateInstance("ADODB.Connection");///建立Connection對象
if(SUCCEEDED(hr))
{
hr = m_pConnection- >Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=test.mdb","","",adModeUnknown);///串連資料庫
///上面一句中串連字串中的Provider是針對ACCESS2000環境的,對於ACCESS97,需要改為:Provider=Microsoft.Jet.OLEDB.3.51;
}
}
catch(_com_error e)///捕捉異常
{
CString errormessage;
errormessage.Format("串連資料庫失敗!\r\n錯誤資訊:%s",e.ErrorMessage());
AfxMessageBox(errormessage);///顯示錯誤資訊
}

在這段代碼中我們是通過Connection對象的Open方法來進行串連資料庫的,下面是該方法的原型
HRESULT Connection15::Open ( _bstr_t ConnectionString, _bstr_t UserID, _bstr_t Password, long Options )
ConnectionString為串連字串,UserID是使用者名稱, Password是登陸密碼,Options是串連選項,用於指定Connection對象對資料的更新許可權,
Options可以是如下幾個常量:
adModeUnknown:預設。當前的許可權未設定
adModeRead:唯讀
adModeWrite:唯寫
adModeReadWrite:可以讀寫
adModeShareDenyRead:阻止其它Connection對象以讀許可權開啟串連
adModeShareDenyWrite:阻止其它Connection對象以寫入權限開啟串連
adModeShareExclusive:阻止其它Connection對象以讀寫權限開啟串連
adModeShareDenyNone:阻止其它Connection對象以任何許可權開啟串連

我們給出一些常用的串連方式供大家參考:
(1)通過JET資料庫引擎對ACCESS2000資料庫的串連

m_pConnection- >Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\test.mdb","","",adModeUnknown);

(2)通過DSN資料來源對任何支援ODBC的資料庫進行串連:

m_pConnection- >Open("Data Source=adotest;UID=sa;PWD=;","","",adModeUnknown);

(3)不通過DSN對SQL SERVER資料庫進行串連:
m_pConnection- >Open("driver={SQL Server};Server=127.0.0.1;DATABASE=vckbase;UID=sa;PWD=139","","",adModeUnknown);

其中Server是SQL伺服器的名稱,DATABASE是庫的名稱

Connection對象除Open方法外還有許多方法,我們先介紹Connection對象中兩個有用的屬性ConnectionTimeOut與State
ConnectionTimeOut用來設定串連的逾時時間,需要在Open之前調用,例如:
m_pConnection- >ConnectionTimeout = 5;///設定逾時時間為5秒
m_pConnection- >Open("Data Source=adotest;","","",adModeUnknown);

State屬性指明當前Connection對象的狀態,0表示關閉,1表示已經開啟,我們可以通過讀取這個屬性來作相應的處理,例如:

if(m_pConnection- >State)
m_pConnection- >Close(); ///如果已經開啟了串連則關閉它

我想把從資料庫中讀出來的記錄放在一個文字框中!

然後在介面上放置了一個edit box

我在類C***Dlg中添加了變數
public:
CBaseEditBox m_list

接下來我在一個按鈕的onOK事件裡串連資料庫並想把得到的記錄放到m_list裡

// 讀入庫中各欄位並加入列表框中
while(!m_pRecordset- >adoEOF)
{
var = m_pRecordset- >GetCollect("UserName");
if(var.vt != VT_NULL)
strName = (LPCSTR)_bstr_t(var);
var = m_pRecordset- >GetCollect("Password");
if(var.vt != VT_NULL)
strAge = (LPCSTR)_bstr_t(var);

m_list.AddString( strName + " -- > "+strAge );

m_pRecordset- >MoveNext();
}

// 預設列表指向第一項,同時移動記錄指標並顯示
m_list.SetCurSel(0); 

添加按鈕事件:
void CADODlg::OnSearch()
{
CoInitialize(NULL); //初始化COM
_ConnectionPtr pConn(__uuidof(Connection));
_RecordsetPtr pRst(__uuidof(Recordset));
CString strSQL="select *from student";
_bstr_t bstrSRC(strSQL);
pConn->ConnectionString="Provider=MSDASQL;driver={SQL Server};Server=127.0.0.1;DATABASE=test;UID=sa;PWD=123";
pConn->Open("","","",-1); /*-1可用adConnectUnspecified代替,表示同步串連.adConnectAsync,表示非同步。 如果是使用第二種串連字則應用 pConn->Open("","","642145",-1); */
pRst=pConn->Execute(bstrSRC,NULL,adCmdText);

while(!pRst->rsEOF)
{
m_result.AddString((_bstr_t)pRst->GetCollect("SName")); /*m_result是我關聯的一個list空間變數*/
pRst->MoveNext();
}
pRst->Close();
pConn->Close();
pRst.Release();
pConn.Release();

CoUninitialize();
}

上面是用連線物件來執行sql語句的,我們也可以用command對象來實現,
首先添加command智能指標:
_CommandPtr pCmd(__uuidof(Command));
設定活動串連:
pCmd->put_ActiveConnection(_variant_t((IDispatch*)pConn));
設定命令文本:
pCmd->CommandText="select * from Student";
返回記錄集:
pRst=pCmd->Execute(NULL,NULL,adCmdText);

MFC串連SQL Server資料庫

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.