ado操作數據庫

一、最近幾天一直再搞數據庫,以下是這幾天的成果,而且還帶了個範例
    1、引用ADO庫文件操作數據庫
頭文件添加:#import "C:/Program Files/common files/system/ado/msado15.dll" no_namespace rename("EOF","rsEOF") //引用庫
CoInitialize(NULL); //初始化COM庫
CoUninitialize(); //釋放COM庫  
    2、三個智能指針
①_ConnectionPtr; //接口返回一個記錄集或一個空指針。通常使用它來創建一個數據連接或執行一條不返回任何結果的SQL語句,如一個存儲過程。使用 _ConnectionPtr接口返回一個記錄集不是一個好的使用方法。對於要返回記錄的操作通常用_RecordserPtr來實現。而用 _ConnectionPtr操作時要想得到記錄條數得遍歷所有記錄,而用_RecordserPtr時不需要。
②_CommandPtr接口返回一個記錄集。它提供了一種簡單的方法來執行返回記錄集的存儲過程和SQL語句。在使用_CommandPtr接口時,你可以利用全局 _ConnectionPtr接口,也可以在_CommandPtr接口裏直接使用連接串。如果你只執行一次或幾次數據訪問操作,後者是比較好的選擇。但如果你要頻繁訪問數據庫,並要返回很多記錄集,那麼,你應該使用全局_ConnectionPtr接口創建一個數據連接,然後使用_CommandPtr 接口執行存儲過程和SQL語句。
③_RecordsetPtr;是一個記錄集對象。與以上兩種對象相比,它對記錄集提供了更多的控制功能,如記錄鎖定,遊標控制等。同_CommandPtr接口一樣,它不一定要使用一個已經創建的數據連接,可以用一個連接串代替連接指針賦給 _RecordsetPtr的connection成員變量,讓它自己創建數據連接。如果你要使用多個記錄集,最好的方法是同Command對象一樣使用已經創建了數據連接的全局_ConnectionPtr接口,然後使用_RecordsetPtr執行存儲過程和SQL語句。
    3、連接並打開數據庫:
m_pConnection->ConnectionTimeout=5; //設置超時時間爲5秒
m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=*.mdb","","",adModeUnknown); //通過JET數據庫引擎對access數據庫的連接
m_pConnection->Open("Data Source=adotest;UID=sa;PWD=;","","",adModeUnKown);//通過DSN數據源對任何支持ODBC的數據庫進行連接;
m_pConnection->Open("driver={SQL Server};Server=127.0.0.1;DATABASE=vckbase;UID=sa;PWD=139","","",adModeUnknown);
//不通過DSN對SQL SERVER數據庫進行連接;其中Server是SQL服務器的名稱,DATABAE是庫的名稱
注:adModeUnknown 表示目前用ado連接數據庫的方式還不知道,這種方式以後可以在程序中以表、視圖、查詢、SQL、過程等方式提取數據。
    4、關閉數據庫:if(m_pConnection->State)m_pConnection->Close(); //如果連接狀態有效,條件爲真
    5、打開數據表:m_pRecordset->Open("select * from table1",m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
    參數①Source:可以是一個Command對象名稱、一段SQL命令、一個指定的數據表名稱或是一個Stored Procedure;
        ②ActiveConnect:Connection連接對象或是包含數據庫連接信息的字符串參數
③CursorType:表示以什麼樣的遊標類型啓動數據: 是否支持(Bookmark,PageCount,Move,MoveLast,Resync等)
adOpenForwardOnly 0 :缺省值,啓動一個只能向前移動的遊標(   N     N       N      N      N)
adOpenKeyset 1 :啓動一個Keyset(鍵盤)類型的遊標。 (   N        N       Y      Y      N)
adOpenOpenDynamic 2 :啓動一個Dynamic(動態的)類型的遊標。 (全支持)
adOpenStatic 3 :啓動一個Static(靜態的)類型的遊標。 (全支持)
④LockType:如果忽略這個參數,那麼系統會以Recordset對象的LockType屬性爲預設值。
adLockReadOnly 1 缺省值,Recordset對象以只讀方式啓動,無法運行AddNew、Update及Delete等方法
adLockPrssimistic 2 當數據源正在更新時,系統會暫時鎖住其他用戶的動作,以保持數據一致性。
adLockOptimistic 3 當數據源正在更新時,系統並不會鎖住其它用戶的動作,其他用戶可以進行增、刪、改操作。
adLockBatchOptimistic 4 當數據源正在更新時,其它用戶必須將CursorLocation屬性改爲adUdeClientBatch才能對數據進行操作增刪改。
⑤Options:adCmdText 表明CommandText是文本命令
   adCmdTable 表明CommandText是一個表明
   adCmdProc 表示CommandText是一個存儲過程
   adCmdUnknown 未知
    6、讀取表內數據:



二、簡單事例:
CoInitialize(NULL);
//打開並連接數據庫
_ConnectionPtr pCon(__uuidof(Connection)); //或:pCon.CreateInstance(__uuidof(Connection));
_RecordsetPtr pRst(__uuidof(Recordset));


try
{
pCon->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Demo.mdb","","",adModeUnknown);
AfxMessageBox("打開數據庫成功");
}catch(_com_error *e)
{
AfxMessageBox("數據庫連接失敗,確認數據庫Demo.mdb是否在當前路徑下!");
}
//打開數據庫表
try
{
pRst->Open("select * from product",pCon.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
// pRst=pCon->Execute("select * from product",NULL,adCmdText);

}catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}
//讀取數據庫中信息
_variant_t var;
CString strPrice,strId;
try
{
if (!pRst->BOF)
{
pRst->MoveFirst();
}else
AfxMessageBox("表內數據爲空");


//讀入庫中各字段並加入列表框中
while (!pRst->rsEOF)
{
var=pRst->GetCollect("price");
if (var.vt!=VT_NULL)
{
strPrice=(LPSTR)_bstr_t(var);
}
var=pRst->GetCollect("product");
if (var.vt!=VT_NULL)
{
strId=(LPSTR)_bstr_t(var);
}
m_List.AddString(strPrice+"-->"+strId);
pRst->MoveNext();
UpdateData(FALSE);
//m_List.SetCurSel(0);
}
}catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}

//插入記錄。
try{
pRst->AddNew();
pRst->PutCollect("id",_variant_t("10004"));
pRst->PutCollect("price",atol("deade"));
pRst->Update();
AfxMessageBox("插入成功!");
}catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}
CoUninitialize();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章