SQL數據庫開發基礎
1.MFC ODBC數據庫開發技術
1.利用ODBC建立數據源
2.數據庫連接
1).包含頭文件 #include <afxdb.h>
2).對數據源進行操作之前需要定義一個CDatabase對象,代碼如下
CDatabase m_db;
3).調用CDatabase的成員函數OpenEx建立和數據源的連接,代碼如下
try
{
m_db.OpenEx(L"DSN=test;UID=sa;PWD=", CDatabase::noOdbcDialog);
}
catch(_com_error e)
{
MessageBox(L"連接數據庫失敗");
}
其中DSN爲數據源名稱,UID數據庫用戶名,PWD爲相應的密碼
3.數據庫操作
查詢記錄
CRecordset rs(&m_db); //CRecordset rs; rs = &m_db;
rs.Open(CRecordset::dynaset, L"SELECT * FROM test"); //詳見MSDN
獲得字段值
GetFieldValue
添加,刪除,修改記錄方法如下
1.先定義相應操作的SQL語句
2.調用ExecuteSQL函數即可
ADO數據庫開發技術
1.ADO是Windows環境中比較流行的數據庫編程技術。它是建立在OLE DB底層技術之上的高級編程接口,因而具有強大的數據處理功能和簡單易用的編程接口,並且得到了廣泛的應用。
ADO的底層是OLE DB(微軟的戰略性的通向不同的數據源的低級應用程序接口),所以不僅能訪問關係型數據庫,也可以訪問非關係型數據庫,更是現在最快速的數據庫訪問中間層。
2.ADO主要對象介紹
1).
Connection Object(連接對象)
Command Object(命令對象)
RecordSet Object(記錄集對象)
Field Object(字段對象)
Record Object(記錄對象)
Error Object(錯誤對象)
Parameter Object(參數對象)
Property Object(屬性對象)
Stream Object(流對象)
其中最重要的是Connection Object(連接對象),Command Object(命令對象),RecordSet Object(記錄集對象)
Connection Object:連接對象代表了一個和數據源的連接,之後的數據庫操作都是建立在這個連接上。
Command Object:命令對象用來處理數據庫的一些操作,在某些方面具有和連接對象相同的功能,例如都可以可行標準的SQL語句以及存儲過程,不過命令對象可以返回帶有記錄集的結果。
RecordSet Object:記錄集對象代表了一個記錄集,用來訪問記錄集。
在使用這三個對象之前,需要定義與之對應的3個職能指針,分別爲_ConnectionPtr, _CommandPtr, _RecordsetPtr,然後調用它們的CreateInstance函數進行實例化,從而創建這3個對象的實例。
2)._bstr和_variant_t類
在利用ADO進行數據庫開發時,_bstr_t和_variant_t兩個類很有用,從來省去了BSTR和VARIANT類型轉換的麻煩。
COM編程不適用CString類,因爲COM必須設計成跨平臺,它需要一種更普遍的方式來處理字符串以及其他數據類型。
3).引入ADO庫
在StdAfx.h末尾處引入ADO庫文件
#import "C:/Program Files/Common Files/System/ado" no_namespace rename("EOF", "adoEOF")
使用預處理指令import使程序在編譯過程中引入ADO動態庫(msado115.dll).no_namespace表明不使用命名空間。rename("EOF", "adoEOF")表明把ADO中用到EOF改爲adoEOF,防止發生命名衝突。
注意:利用應用程序嚮導進行ADO數據庫開發時,需要在程序嚮導的第二步選擇(Automation)選項,使應用程序能夠支持“自動操作”的方式。
數據庫連接
_ConnectionPtr m_pConnection; //定義一個_ConnectionPtr指針
m_pConnection.CreateInstance(_uuidof(Connection)); //調用CreateInstance方法實例化
最後,調用Connection對象的Open函數創建數據庫連接,Open函數原型如下。
HRESULT Open(
_bstr_t ConnectiongString,
_bstr_t UserID,
_bstr_t Password,
long Options);
其中,ConnectionString是一個包含連接信息的字符串,UerID是訪問數據庫的用戶名,Password是訪問數據庫的祕密,Options爲可選參數。如果在ConnectiongString中包含了數據庫用戶名和密碼,UerID和Password值可以爲空。
下面附上一些代碼說明(代碼爲我寫的“壁虎桌面日曆”部分代碼)
連接數據庫
m_pConn.CreateInstance(__uuidof(Connection));
wchar_t wPath[200];
GetModuleFileName(NULL,wPath,200);
PathRemoveFileSpec(wPath);
wcscat(wPath,L"//AnyCaler.mdb");
wchar_t wConn[400];
wsprintf(wConn,L"Provider = Microsoft.Jet.OLEDB.4.0; Data Source = %s; Persist Security Info=FALSE",wPath);
try
{
m_pConn->Open(wConn, "", "", adConnectUnspecified);
}
catch(_com_error e)
{
/*
CString errorMsg;
errorMsg.Format(_T("連接數據庫失敗!/n%s"), e.ErrorMessage());
LPCTSTR errMsg;
errMsg = (const WCHAR*)(errorMsg.AllocSysString());
AfxMessageBox(errMsg);*/
MessageBox(NULL,L"數據庫連接失敗!",L"警告",MB_ICONWARNING);
exit(0);
}
查詢 添加記錄 修改記錄
_RecordsetPtr rst;
_variant_t var;
HRESULT hr;
rst.CreateInstance(_uuidof(Recordset)); //打開連接
char sqlStr[100] = {0};
sprintf(sqlStr, "SELECT * FROM MemoInfo WHERE Date = '%d-%d-%d'",
m_MemoDlg.m_year, m_MemoDlg.m_month, m_MemoDlg.m_date);
try
{
hr = rst->Open(sqlStr, m_pConn.GetInterfacePtr(), adOpenDynamic,adLockOptimistic,adCmdText);
}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}
if (rst->adoEOF)
{
rst->AddNew();
rst->PutCollect("Date", _variant_t(tempDateStr));
rst->PutCollect("Time", _variant_t(tempTimeStr));
rst->PutCollect("Memo", _variant_t(m_memo));
rst->PutCollect("Warn", _variant_t(m_MemoDlg.checkRemind));
rst->PutCollect("Shark", _variant_t(m_MemoDlg.checkShake));
rst->PutCollect("Card", _variant_t(m_MemoDlg.checkPopWindow));
rst->PutCollect("Sound", _variant_t(m_MemoDlg.checkPopWindow));
rst->PutCollect("Del", _variant_t("1"));
rst->Update();
}
else
{
rst->PutCollect("Date", _variant_t(tempDateStr));
rst->PutCollect("Time", _variant_t(tempTimeStr));
rst->PutCollect("Memo", _variant_t(m_memo));
rst->PutCollect("Warn", _variant_t(m_MemoDlg.checkRemind));
rst->PutCollect("Shark", _variant_t(m_MemoDlg.checkShake));
rst->PutCollect("Card", _variant_t(m_MemoDlg.checkPopWindow));
rst->PutCollect("Sound", _variant_t(m_MemoDlg.checkPopWindow));
rst->PutCollect("Del", _variant_t("1"));
rst->Update();
}
rst->Close();
rst = NULL;
刪除
rst->Delete(adAffectCurrent);
備註:_ConnectionPtr對象可申明爲全局變量,在App的InitInstance函數中連接數據源,在ExitInstance斷開數據源連接;每個_RecordSet指針在使用完之後記得Close並附空值。
還可以利用ADO數據控件進行數據庫編程,具體參考Visual C++++++ SQL Server數據庫開發與實例
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.