ADO学习(八)源码示例
#include <icrsint.h>
//其中icrsint.h文件包含了VC++擴展的一些預處理指令、宏等的定義,用于COM編程時使用。
//放在所有include的后面
//#import "C:/Program Files/Common Files/System/ADO/msado15.dll" named_guids rename("EOF","adoEOF"), rename("BOF","adoBOF")
#import "C:/Program Files/Common Files/System/ADO/msado15.dll" named_guids rename("EOF","adoEOF"), rename("BOF","adoBOF")
//不知道named_guids是干嘛的?????????
using namespace ADODB;
/*
msado15.dll使用的命名空間是ADODB,故此使用using namespace ADODB;
方法二:
#import "C:/Program Files/Common Files/System/ADO/msado15.dll" no_namespace rename("EOF","adoEOF"), rename("BOF","adoBOF")
//不用使用命名空間
方法三:
#import "C:/Program Files/Common Files/System/ADO/msado15.dll" rename_namespace("NEWSPACE") rename("EOF","adoEOF"), rename("BOF","adoBOF")
using namespace NEWSPACE;
*/
?// TODO: 在此添加額外的初始化代碼
?//使用COM的初始化
?HRESULT hr = CoInitialize(NULL);
?ASSERT(SUCCEEDED(hr));
?//或者(AfxOleInit只能在MFC中使用)
?//AfxOleInit();
?/*
?初始化OLE/COM庫
?AfxOleInit();
?或者
?::CoInitialize(NULL);
?(據(jù)說AfxOleInit只能在MFC中使用)
?實現(xiàn)方法:
?if(!AfxOleInit())
?{???????????????
?AfxMessageBox(("COM Error!"));???
?}
?AfxOleInit()是初始化Ole的運行環(huán)境,Ole是在Com的基礎上作的擴展,是ActiveX運行的基礎。AfxOleInit()調用的是OleInitialize(),而OleInitialize()除了調用CoInitializeEx()來初始化COM庫外,還進行一些其它的操作,這些操作對OLE應用來說是必須的,這些OLE應用包括:??
?(1)Clipboard;??
?(2)Drag and drop;??
?(3)Object linking and embedding(現(xiàn)在的OLE,已不再僅僅是Object??????? linking??????? and??????? embedding的概念);??
?4)In-place??????? activation;??
?與AfxOleInit()對應的是,AfxOleTerm()。??
?CoInitialize CoInitializeEx 是用來初始化COM運行環(huán)境的。CoInitialize和CoUninitialize必須成對使用。
?AfxOleInit()和AfxOleTerm()其實也是需要成對的,但是,在你的程序中,AfxOleTerm()可以不出現(xiàn),這是因為,MFC已經(jīng)幫你做好了。
?*/
?
//按鈕響應
void CADO_STUDYDlg::OnBnClickedButton1()
{
?// TODO: 在此添加控件通知處理程序代碼
?try
?{
??//創(chuàng)建實例
??m_pConnection.CreateInstance("ADODB.Connection");
??//或者? __uuidof使取類型的GUID
??//m_pConnection.CreateInstance(__uuidof(Connection));
??//方法一:字符串數(shù)據(jù)源
??//或者也可以不對ConnectionString進行賦值,直接寫在open的第一個參數(shù)里面
??m_pConnection->ConnectionString = "Provider=SQLOLEDB.1;Password=123456;Persist Security Info=True;User ID=sa;Initial Catalog=CAMPUS;Data Source=192.168.0.102";
??
??//連接超時為5秒
??m_pConnection->ConnectionTimeout = 5;
??
??m_pConnection->Open("","","",adModeUnknown);
??/*
??參數(shù)一:連接字符串
??參數(shù)二:用戶名
??參數(shù)三:用戶密碼
??參數(shù)四:
??adModeUnknown:缺省。當前的許可權未設置
??adModeRead:只讀
??adModeWrite:只寫
??adModeReadWrite:可以讀寫
??adModeShareDenyRead:阻止其它Connection對象以讀權限打開連接
??adModeShareDenyWrite:阻止其它Connection對象以寫權限打開連接
??adModeShareExclusive:阻止其它Connection對象打開連接
??adModeShareDenyNone:允許其它程序或對象以任何權限建立連接
??*/
// ??//方法二字符串數(shù)據(jù)源
// ??char m_szConnStr[MAX_PATH];
// ??char szUdlPath[MAX_PATH] ={".\\campus.udl"};//可相對路徑,亦可絕對路徑
// ??sprintf(m_szConnStr,"File Name=%s", szUdlPath);//前面是固定格式
// ??m_pConnection->Open((_bstr_t)(m_szConnStr),"","",adModeUnknown);
??//狀態(tài)校驗
??ASSERT(m_pConnection->State == adStateOpen);
??//執(zhí)行SQL語句
??CString szsql = _T("select * from student");
??/*
??CString szsql = _T("insert into student values('1007','xiaoming','101')");
??CString szsql = _T("delete from student where SID='1007'");
??CString szsql = _T("uddate student set SNAME = 'xiaoming'where SID='1001'");
??利用m_pConnection->Execute()完成增刪改完全沒有問題,查詢的時候要有一個變量來儲存返回來的結果集
??*/
??_RecordsetPtr pRst;
??_variant_t RecordsAffected;
??pRst = m_pConnection->Execute((_bstr_t)szsql, &RecordsAffected, adCmdText);
??/*
??參數(shù)三:
??adCmdText:表明CommandText是文本命令
??adCmdTable:表明CommandText是一個表名
??adCmdProc:表明CommandText是一個存儲過程
??adCmdUnknown:未知
??*/
??//這里應該有一個數(shù)據(jù)集校驗的邏輯??if(pRst->State == 1) ;
// ??//以下兩種方式都可以
// ??//while (pRst->adoEOF!=VARIANT_FALSE)
// ??while (!pRst->adoEOF)
// ??{
// ???CString SID=(_bstr_t)(pRst->Fields->GetItem(_variant_t("SID"))->Value);
// ???//或者使用CString SID=(_bstr_t)(pRst->Fields->GetItem(_variant_t("SID"))->GetValue());
// ???CString SNAME=(_bstr_t)(pRst->Fields->GetItem(_variant_t("SNAME"))->Value);
//? ???CString TID=(_bstr_t)(pRst->Fields->GetItem(_variant_t("TID"))->Value);
// ???gConsoleLog.WriteLogInfo("%s--->%s--->%s", SID,SNAME,TID);
//
// ???//利用pRst指針修改數(shù)據(jù)
// // ???if (SID.Find("1001")>=0)
// // ???{
// // ????//當然光標要支持更新
// // ????//方法一:
// // ????pRst->Fields->GetItem(_variant_t("SNAME"))->Value = "111111111";
// // ????//方法二:
// // ????pRst->Fields->GetItem(_variant_t("SNAME"))->PutValue(_bstr_t("趙薇"));
// // ???}
// ???pRst->MoveNext();
// ??}
??//
??//利用pRst指針添加數(shù)據(jù)
// ??try
// ??{
// ???/*
// ???新記錄添加成功后,即自動成為當前記錄。AddNew方法有兩種形式,一個含有參數(shù),而另一個則不帶參數(shù)。
// ???*/
// ???//方法一(不帶參數(shù)):
// ???if (!pRst->Supports(adAddNew))?return;
// ???pRst->AddNew();
// ???pRst->Fields->GetItem(_variant_t("SID"))->Value = "1008";
// ???pRst->Fields->GetItem(_variant_t("SNAME"))->Value = "addnew";
// ???pRst->Fields->GetItem(_variant_t("TID"))->Value = "102";
// ???pRst->Update();
// ??}
// ??catch (_com_error &e)
// ??{
// ???AfxMessageBox(e.Description());
// ???AfxMessageBox(e.ErrorMessage());
// ??}
??//
??//利用pRst指針刪除數(shù)據(jù)
// ??try
// ??{
// ???pRst->MoveFirst();
// ???//pRst->Delete(1);
// ???pRst->Update();
// ???pRst->MoveFirst();
// ??}
// ??catch (_com_error &e)
// ??{
// ???AfxMessageBox(e.Description());
// ???AfxMessageBox(e.ErrorMessage());
// ??}
??//
??//command對象執(zhí)行sql語句
??//Command對象在進行存儲過程的調用中能真正體現(xiàn)它的作用
??_CommandPtr m_pCommand;
??m_pCommand.CreateInstance(__uuidof(Command));
??_variant_t vNULL;
??vNULL.vt = VT_ERROR;
??vNULL.scode = DISP_E_PARAMNOTFOUND;
??m_pCommand->ActiveConnection = m_pConnection;
??m_pCommand->CommandText = "select * from student";
??pRst = m_pCommand->Execute(&vNULL,&vNULL,adCmdText);
??while (!pRst->adoEOF)
??{
???CString SID=(_bstr_t)(pRst->Fields->GetItem(_variant_t("SID"))->Value);
???//或者使用CString SID=(_bstr_t)(pRst->Fields->GetItem(_variant_t("SID"))->GetValue());
???CString SNAME=(_bstr_t)(pRst->Fields->GetItem(_variant_t("SNAME"))->Value);
???CString TID=(_bstr_t)(pRst->Fields->GetItem(_variant_t("TID"))->Value);
???gConsoleLog.WriteLogInfo("%s--->%s--->%s", SID,SNAME,TID);
???pRst->MoveNext();
??}
??//
??//釋放并關閉連接
??if (m_pConnection->State == adStateOpen)
??{
???//先后順序錯亂會導致程序崩潰
???m_pConnection->Release();
???m_pConnection->Close();
??}
??//卸載com庫
??::CoUninitialize();
?}
?catch (_com_error &e)
?{
??AfxMessageBox(e.Description());
??AfxMessageBox(e.ErrorMessage());
?}
}
void CADO_STUDYDlg::OnBnClickedButton2()
{
?// TODO: 在此添加控件通知處理程序代碼
?//ADO使無法建立數(shù)據(jù)庫的
// ?_bstr_t strcnn1(_T("Provider=Microsoft.JET.OLEDB.4.0;Data source=student.mdb"));
// ?try
// ?{
// ??m_pConnection.CreateInstance(__uuidof(Connection));
// ??m_pConnection->Open(strcnn1,? _T(""), _T(""), adModeUnknown);
// ??m_pRecordset.CreateInstance(__uuidof(Recordset));
// ?}
// ?catch(_com_error e)
// ?{
// ??AfxMessageBox(_T("建立數(shù)據(jù)庫失敗!"), MB_OK|MB_ICONSTOP);
// ?}
// ?return ;
?TCHAR szPathName[MAX_PATH];
?GetModuleFileName(NULL, szPathName, MAX_PATH);
?CString strPath = szPathName;
?int nPos;??
?nPos = strPath.ReverseFind (_T('\\'));??
?strPath = strPath.Left(nPos);
?strPath? += _T("\\student.mdb");
?CFileFind ff;
?if(ff.FindFile(strPath)) //如果沒有找到該數(shù)據(jù)庫文件則重建此文件夾
?{?
??AfxMessageBox(_T("已經(jīng)存在數(shù)據(jù)庫文件"));
??return;?
?}
?CString strConnection;
?strConnection.Format(_T("Provider=Microsoft.JET.OLEDB.4.0;Data source=%s"), strPath);
?_bstr_t strcnn(strConnection);
?HRESULT hr = m_pCatalog.CreateInstance(__uuidof(ADOX::Catalog));
?if(FAILED(hr))
?{
??AfxMessageBox(_T("創(chuàng)建ADOX實例失敗"));
??return;
?}
?try
?{
??m_pCatalog->Create(strcnn);
??m_pConnection.CreateInstance(__uuidof(Connection));
??m_pConnection->Open(strcnn,? _T(""), _T(""), adModeUnknown);
??CString strSql = _T("create table StudentInfo(student_id varchar(20) not null, \
???????student_name varchar(20) not null, score int)");
??m_pConnection->Execute((_bstr_t)strSql, NULL, adCmdText);
?}
?catch(_com_error e)
?{
??AfxMessageBox(_T("創(chuàng)建MDB文件失敗"));
?}
}
void CADO_STUDYDlg::OnBnClickedButton3()
{
?// TODO: 在此添加控件通知處理程序代碼
?try
?{
??m_pConnection.CreateInstance("ADODB.Connection");
??m_pConnection->ConnectionString = "Provider=SQLOLEDB.1;Password=123456;Persist Security Info=True;User ID=sa;Initial Catalog=CAMPUS;Data Source=192.168.0.102";
??m_pConnection->ConnectionTimeout = 5;
??//客戶端游標(不適用此游標就不能使用DataGrid控件)
??m_pConnection->CursorLocation = adUseClient;
??m_pConnection->Open("","","",adModeUnknown);
??_RecordsetPtr m_pRecordset;
??m_pRecordset.CreateInstance(__uuidof(Recordset));
??CString strsql;
??strsql.Format(_T("select * from CAMPUS..STUDENT order by sname asc"));
??//以下兩種方式都是可以的
??//m_pRecordset->Open(_bstr_t(strsql), (IDispatch*)m_pConnection, adOpenDynamic,adLockOptimistic,adCmdText);
??m_pRecordset->Open(_bstr_t(strsql), m_pConnection.GetInterfacePtr(), adOpenDynamic,adLockOptimistic,adCmdText);
??CString SID,SNAME,TID;
??_variant_t vt;
??while (!m_pRecordset->adoEOF)
??{
???//SID=(_bstr_t)(m_pRecordset->Fields->GetItem(_variant_t("SID"))->Value);
???vt = m_pRecordset->GetCollect("SID");
???if (vt.vt != VT_NULL) SID=(LPCSTR)_bstr_t(vt);
???SNAME=(LPCSTR)(_bstr_t)(m_pRecordset->Fields->GetItem(_variant_t("SNAME"))->Value);
???TID=(LPCSTR)(_bstr_t)(m_pRecordset->Fields->GetItem(_variant_t("TID"))->Value);
???gConsoleLog.WriteLogInfo("%s--->%s--->%s", SID,SNAME,TID);
???m_pRecordset->MoveNext();
??}
??m_DataGrid.put_AllowAddNew(TRUE);
??m_DataGrid.put_AllowDelete(TRUE);
??m_DataGrid.put_Caption(_T("學生成績表"));
??m_DataGrid.putref_DataSource(m_pRecordset);
?}
?catch (_com_error &e)
?{
??AfxMessageBox(e.Description());
??AfxMessageBox(e.ErrorMessage());
?}
}
void CADO_STUDYDlg::OnBnClickedButton4()
{
?// TODO: 在此添加控件通知處理程序代碼
?m_pConnection.CreateInstance(__uuidof(Connection));//創(chuàng)建連接對象實例
?try????????????????
?{?
??// 打開本地Access庫AddressBook.mdb
??m_pConnection->Open("Provider=SQLOLEDB.1;Password=123456;Persist Security Info=True;User ID=sa;Initial Catalog=CAMPUS;Data Source=192.168.0.102","","",adModeUnknown);
?}
?catch(_com_error e)
?{
??AfxMessageBox("數(shù)據(jù)庫連接失敗,確認數(shù)據(jù)庫AddressBook.mdb是否在當前路徑下!");
??return;
?}
?m_pRecordset.CreateInstance(__uuidof(Recordset));//創(chuàng)建記錄集對象
?try
?{
??m_pRecordset->Open("SELECT * FROM STUDENT",???????? // 查詢STUDENT表中所有字段
???m_pConnection.GetInterfacePtr(),????// 獲取庫接庫的IDispatch指針
???adOpenDynamic,
???adLockOptimistic,
???adCmdText);
?}
?/*
?參數(shù)三:
?adOpenDynamic???? 允許添加、修改和刪除記錄,支持所有方式的光標移動,其他用戶的修改可以在聯(lián)機以后仍然可見
?adOpenKeyset????? 類似于adOpenDynamic光標,它支持所有類型的光標移動,但是建立連接以后其他用戶對記錄的添加不可見,其他用戶對記錄的刪除和對數(shù)據(jù)的修改是可見的。支持書簽操作
?adOpenStatic????? 支持各種方式的光標移動,但是建立連接以后其他用戶的行添加、行刪除和數(shù)據(jù)修改都不可見,支持書簽操作
?adOpenForwardOnly 只允許向前存取,而且在建立連接以后,其他用戶的行添加、行刪除和數(shù)據(jù)修改都不可見,支持書簽操作
?參數(shù)四:
?adLockReadOnly(缺省)數(shù)據(jù)只讀
?adLockPessimistic鎖定操作的所有行,也稱為消極鎖定
?adLockOptimistic只在調用Update方法時鎖定操作的行,也稱為積極鎖定
?adLockBatchOptimistic在批量更新時使用該鎖定,也稱為積極批量鎖定
?
?*/
?catch(_com_error *e)
?{
??AfxMessageBox(e->ErrorMessage());
?}?
?//添加新記錄
?m_pRecordset->AddNew();
?m_pRecordset->PutCollect("SID",_variant_t("1007"));
?m_pRecordset->PutCollect("SNAME",_variant_t("liuxiong"));
?m_pRecordset->PutCollect("TID", _variant_t("102"));
?m_pRecordset->Update();
?m_pRecordset->Close();//關閉記錄集對象
?m_pRecordset = NULL;
?if(m_pConnection->State)
??m_pConnection->Close();//關閉連接對象
?m_pConnection= NULL;?
}
void CADO_STUDYDlg::OnBnClickedButton5()
{
?// TODO: 在此添加控件通知處理程序代碼
?//_CommandPtr對象的優(yōu)勢就在于執(zhí)行存儲過程中可以傳遞參數(shù)
?m_pConnection.CreateInstance(__uuidof(Connection));//創(chuàng)建連接對象實例
?try????????????????
?{?
??m_pConnection->Open("Provider=SQLOLEDB.1;Password=123456;Persist Security Info=True;User ID=sa;Initial Catalog=CAMPUS;Data Source=192.168.0.102","","",adModeUnknown);
?
??//存儲過程名
??_bstr_t storproc("procname");
??_bstr_t name("1002");
??_CommandPtr pCommand;
??pCommand.CreateInstance(__uuidof(Command));
??pCommand->ActiveConnection=m_pConnection;
??//指定CommandTexe屬性為存儲過程名
??pCommand->CommandText=storproc;
??//指定CommandType屬性為存儲過程類型
??pCommand->CommandType=adCmdStoredProc;
??//在給參數(shù)賦值前調用Refresh方法
??pCommand->Parameters->Refresh();
??//給存儲過程的參數(shù)賦值
??pCommand->Parameters->Item[_variant_t((long)1)]->Value=_variant_t((LPCTSTR)name);
??//執(zhí)行存儲過程,返回_RecordsetPtr類型指針,因為在CommandText中指定了命令,在Execute方法中參數(shù)賦空值就可了
??m_pRecordset=pCommand->Execute(NULL,NULL,adCmdStoredProc);
??CString SID,SNAME,TID;
??_variant_t vt;
??while (!m_pRecordset->adoEOF)
??{
???//SID=(_bstr_t)(m_pRecordset->Fields->GetItem(_variant_t("SID"))->Value);
???vt = m_pRecordset->GetCollect("SID");
???if (vt.vt != VT_NULL) SID=(LPCSTR)_bstr_t(vt);
???SNAME=(LPCSTR)(_bstr_t)(m_pRecordset->Fields->GetItem(_variant_t("SNAME"))->Value);
???TID=(LPCSTR)(_bstr_t)(m_pRecordset->Fields->GetItem(_variant_t("TID"))->Value);
???gConsoleLog.WriteLogInfo("%s--->%s--->%s", SID,SNAME,TID);
???m_pRecordset->MoveNext();
??}
?
?}
?catch(_com_error e)
?{
??AfxMessageBox(e.Description());
??return;
?}
}
總結
以上是生活随笔為你收集整理的ADO学习(八)源码示例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C,C++中使用可变参数
- 下一篇: ADO学习(二).udl文件