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);