個(gè)人覺(jué)得,數(shù)據(jù)庫(kù)操作連接和操作上手很快,但是那些類(lèi)型總是會(huì)讓你頭疼 目前我還沒(méi)搞清楚用怎么從T-SQL 的decimal技術(shù)到MFC中相應(yīng)的數(shù)據(jù)?? 將一下數(shù)據(jù)庫(kù)連接的步驟 一:加載動(dòng)態(tài)鏈接庫(kù) #import C:\Program Files\Common Files\System\ADO\msado15.dll \ no
個(gè)人覺(jué)得,數(shù)據(jù)庫(kù)操作連接和操作上手很快,但是那些類(lèi)型總是會(huì)讓你頭疼
目前我還沒(méi)搞清楚用怎么從T-SQL 的decimal技術(shù)到MFC中相應(yīng)的數(shù)據(jù)??
將一下數(shù)據(jù)庫(kù)連接的步驟
一:加載動(dòng)態(tài)鏈接庫(kù)
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
no_namespace rename("EOF", "EndOfFile")
講一下這句話(huà)什么意思,就是導(dǎo)入動(dòng)態(tài)鏈接庫(kù),否則你的那個(gè)什么ptrConn,ptrRecord連接指針,都會(huì)在編譯的時(shí)候報(bào)錯(cuò)
第二個(gè)rename,EOF替換成,EndOfFile是為了在從記錄集Recordset取出來(lái)時(shí)候,判斷是否到達(dá)了結(jié)尾
如果是到達(dá)了結(jié)尾,那么就會(huì)返回非VARIANT_FALSE
二:聲明連接指針和記錄集
_ConnectionPtr ptrConn; // 定義Connection對(duì)象
_RecordsetPtr ptrRecord;
三:創(chuàng)建連接
CoInitialize(NULL); //不要忘記了,否則指針全部為空,無(wú)效
try//打開(kāi)連接 { // 創(chuàng)建一個(gè)連接實(shí)體 ptrConn.CreateInstance(__uuidof(Connection)); // 設(shè)定連接等待的最大秒數(shù),默認(rèn)是15秒 ptrConn->ConnectionTimeout = 20; // 打開(kāi)連接 ptrConn->Open("driver={SQL server};server=127.0.0.1;uid=laicb;pwd=616458;database=DBCourse", "",//登錄用戶(hù)名 "",//登錄密碼 adConnectUnspecified);//打開(kāi)連接 } catch(_com_error &e)--捕獲異常 { CString str; CString strTemp; str.Format(TEXT("Error:\n")); strTemp.Format(TEXT("Code = %08lx\n"), e.Error()); str+="\n"; str+=strTemp; strTemp.Format(TEXT("Meaning = %s\n"), e.ErrorMessage()); str+="\n"; str+=strTemp; strTemp.Format(TEXT("Source = %s\n"), (wchar_t*) e.Source()); str+="\n"; str+=strTemp; strTemp.Format(TEXT("Description = %s\n"), (wchar_t*) e.Description()); str+="\n"; str+=strTemp; MessageBox(str); }
try { //_RecordsetPtr ptrRS; // recordset 對(duì)象 // 創(chuàng)建recordset 對(duì)象實(shí)體 ptrRecord.CreateInstance(__uuidof(Recordset));//有些時(shí)候如果記錄級(jí)背使用過(guò)了,可能需要重新創(chuàng)建實(shí)例,然后再打開(kāi) ptrRecord->Open("select * from dbo.StaffInfo",///為什么把這里的數(shù)據(jù)庫(kù)改成dbo.StaffRecord時(shí)候,列表框就顯示全為空 ptrConn.GetInterfacePtr(), adOpenKeyset, //注意在VB說(shuō)明文檔時(shí)候,首字母a是大寫(xiě)的,在C++中應(yīng)該小寫(xiě) adLockBatchOptimistic, adCmdText); //int j= ptrRecord->RecordCount; //或者 //ptrRS = ptrConn ->Execute(m_ strSql,NULL, adCmdText); } catch(_com_error &e) { CString str; CString strTemp; str.Format(TEXT("Error:\n")); strTemp.Format(TEXT("Code = %08lx\n"), e.Error()); str+="\n"; str+=strTemp; strTemp.Format(TEXT("Meaning = %s\n"), e.ErrorMessage()); str+="\n"; str+=strTemp; strTemp.Format(TEXT("Source = %s\n"), (wchar_t*) e.Source()); str+="\n"; str+=strTemp; strTemp.Format(TEXT("Description = %s\n"), (wchar_t*) e.Description()); str+="\n"; str+=strTemp; MessageBox(str); }
try { ptrConn->Execute("select * from dbo.Login",NULL,adCmdText); ptrRecord->MoveFirst();//加了這句這會(huì)就可以取出數(shù)據(jù)了,可能是上一個(gè)父親指針已經(jīng)把其移動(dòng)到最后了 int i= ptrRecord->RecordCount;//如果把游標(biāo)從動(dòng)態(tài)到記錄集,那么這個(gè)參數(shù)就有用 while(ptrRecord->EndOfFile==VARIANT_FALSE) { _variant_t va; _variant_t str; va.vt=VT_I4; va.lVal=0; str = ptrRecord->Fields->GetItem(va)->Value; CString strGetID((wchar_t*)(_bstr_t)str); str = ptrRecord->Fields->GetItem(short(1))->Value; CString strGetSerect((wchar_t*)(_bstr_t)str); strGetID.TrimRight(); strGetSerect.TrimRight(); right=ptrRecord->Fields->GetItem(short(2))->Value.intVal; if(strGetID==strID&&strGetSerect==strSerect) { isadmin=true; } ptrRecord->MoveNext(); } } catch(_com_error &e) { CString str; CString strTemp; str.Format(TEXT("Error:\n")); strTemp.Format(TEXT("Code = %08lx\n"), e.Error()); str+="\n"; str+=strTemp; strTemp.Format(TEXT("Meaning = %s\n"), e.ErrorMessage()); str+="\n"; str+=strTemp; strTemp.Format(TEXT("Source = %s\n"), (wchar_t*) e.Source()); str+="\n"; str+=strTemp; strTemp.Format(TEXT("Description = %s\n"), (wchar_t*) e.Description()); str+="\n"; str+=strTemp; AfxMessageBox(str); }
取出查詢(xún)結(jié)果是
ptrRecord->Fields->GetItem(va)->Value;
ptrRecord->Fields->GetItem(va)->Name;
va是
_variant_t va; va.vt=VT_I4; va.lVal=0;
也可以這樣
ptrRecord->Fields->GetItem(short(0))->Name;
while(ptrRecord->EndOfFile==VARIANT_FALSE)
{
取出結(jié)果集
ptrRecord->MoveNext();
}
有些時(shí)候,如果你的結(jié)果集已經(jīng)被全部取出來(lái)的時(shí)候,也就是你的結(jié)果集已經(jīng)到了非VARIANT_FALSE
這時(shí)候你就需要重新創(chuàng)建實(shí)例,然后打開(kāi),ptrRecord.CreateInstance(__uuidof(Recordset));//有些時(shí)候如果記錄級(jí)背使用過(guò)了,可能需要重新創(chuàng)建實(shí)例,然后再打開(kāi) ptrRecord->Open("select * from dbo.StaffInfo",///為什么把這里的數(shù)據(jù)庫(kù)改成dbo.StaffRecord時(shí)候,列表框就顯示全為空 ptrConn.GetInterfacePtr(), adOpenKeyset, //注意在VB說(shuō)明文檔時(shí)候,首字母a是大寫(xiě)的,在C++中應(yīng)該小寫(xiě) adLockBatchOptimistic, adCmdText);
這樣你才能重新使用,不然好像MoveFirst,么有用啊
另外如果你結(jié)果集在某處調(diào)用了close,那么你再次使用的時(shí)候一定要執(zhí)行上面這段語(yǔ)句,否則會(huì)報(bào)說(shuō)記錄集已經(jīng)關(guān)閉了,wufa使用
六:Command對(duì)象的使用
try
{
// Create Connection Object (1.5 Version)
Conn1.CreateInstance( __uuidof( Connection ) );
Conn1->ConnectionString = bstrConnect;
Conn1->Open( bstrEmpty, bstrEmpty, bstrEmpty, -1 );
// Create Command Object
Cmd1.CreateInstance( __uuidof( Command ) );
Cmd1->ActiveConnection = Conn1;
Cmd1->CommandText = _bstr_t("SELECT * FROM mytable WHERE age< ?");
然后執(zhí)行就可以了cmd1->Execute就OK了
結(jié)束:
一些釋放操作,置空操作
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com