由於最近專案上要使用ado訪問資料庫,而網上又沒有非常完整的帖子,乾脆摸著石頭過河來總結乙個ado的使用;首先不得不說ado的使用率並不是很高
1.ado是微軟提供的訪問各種資料庫的統一介面,是對底層的com技術ole db的封裝;
它的主要優點是易於使用,高速度,低記憶體開銷,和乙個小磁碟占用,缺點:開發效率相對不高;
2.既然ado是乙個物件導向的com,就涉及到乙個ado的物件;
物件圖表如下:
物件有:
connection:用於建立資料來源連線;該物件是安全的;
command:定義乙個你打算對資料來源執行的特定命令;該物件是不安全的;
recordset:執行命令生成的結果集或者乙個表的記錄集;注:紀錄集物件始終只有乙個記錄(當前記錄);該物件是安全的;
parameter:基於引數的名稱或者儲存過程,主要是儲存過程經常用到;
剩下的不常有的物件就不一一介紹了,如果後面有用到,再描述;
3.ado的重要屬性:(全部太多,介紹常用的);
activecommand 指示建立關聯的記錄集物件的命令物件。
activeconnection 指示指定的命令、記錄集或記錄物件當前所屬的連線物件。
bof : 表明當前記錄位置在第一條記錄前乙個記錄集物件。
eof : 表明當前記錄位置後的最後乙個記錄乙個記錄集物件。
commandtext :執行命令語句。
commandtimeout :表示在執行命令之前要等待多長時間才能終止嘗試並生成錯誤。
commandtype :表示命令物件的型別。
connectiontimeout :表示在建立連線之前要等待多長時間才能終止嘗試並生成錯誤。
4.ado函式:(敲黑板了,重點!!!)
addnew :為乙個可更新的記錄集物件建立乙個新的記錄。
例如:recordset.addnew fieldlist, values;
recordset.update;
begintrans:開始乙個事務;
committrans:提交乙個事務;
rollbacktrans:回滾乙個事務;
例如:object.begintrans
object.committrans
object.rollbacktrans
cancel :取消執行等待非同步方法呼叫。
例如:object.cancel
delete (ado parameters collection):從引數集合中刪除乙個物件。
delete (ado fields collection):從欄位集合中刪除乙個物件。
delete (ado recordset):刪除結果集;
excute (ado command):執行 commandtext 屬性中指定的查詢、sql 語句或儲存過程。
excute (ado connection)執行指定的查詢、sql 語句、儲存過程或提供程式特定的文字。
excute返回乙個結果集或者null;
set recordset = command.execute( recordsaffected, parameters, options ) ;
getrows 將記錄集物件的多個記錄檢索到陣列中。
array = recordset.getrows(rows, start, fields )
getstring 以字串形式返回記錄集。
variant = recordset.getstring(stringformat, numrows, columndelimiter, rowdelimiter, nullexpr)
movefirst、movelast、movenextmoveprevious:移動到指定 recordset 物件中的第乙個、最後乙個、下乙個或上乙個記錄, 並將其記錄為當前記錄。
open (ado connection) :將開啟與資料來源的連線。
open (ado record) :將開啟現有的記錄物件, 或建立新的檔案或目錄。
open (ado recordset) :將開啟乙個游標。
5.講了這麼多,來乙個例項吧;網上將執行sql語句的很多也很簡單,我來乙個執行帶引數儲存過程的;
專案開頭:必不可少的;msado15.dll的路徑根據自己的情況設定,
#import "c:/program files (x86)/common files/system/ado/msado15.dll" no_namespace rename("eof","adoeof")
_connectionptr m_pconn; //連線
_recordsetptr m_precordset;//結果集
_commandptr m_pcommand;//命令
初始化:
coinitializeex(null, coinit_multithreaded);//初始化com環境
m_precordset.createinstance("adodb.recordset"); //指標敲出.是不是很神奇,不應該是->嗎?
m_pconn.createinstance("adodb.connect");
m_pcommand.createinstance("adodb.command");
//或者直接這樣子:_connectionptr pconn(__uuidof(connection));初始化也可以;
char sql = ; //連線字串;
hresult hr; //連線返回值
trycatch (_com_error &e)
if (!succeeded(hr))
接下來:先調乙個沒有引數的儲存過程,再將其執行結果作為引數傳到另外乙個儲存過程去執行;
int getid(std::string& stridout) //返回值表示是否有id,引數表示具體是多少; ;
int isum = 0;
try;
_variant_t temp;
if (!m_precordset->adoeof)
iindex++;
temp = m_precordset->getcollect(_variant_t((long)iindex))
if (temp.vt != vt_null)
iindex++;
stridout =cvalue; }
m_precordset->close();
}catch (_com_error &e)
return isum; }
執行帶引數的儲存過程;
... ..
. (下面就和沒有引數儲存過程一樣了);
}最後最後:用完記得釋放;
if (m_precordset)
m_precordset->close(); //關閉記錄集
if (m_pconn)
m_pconn->close();//關閉資料庫
if (m_pcommand)
m_pcommand->cancel();
if (m_precordset)
m_precordset.release();//釋放記錄集物件指標
if (m_pconn)
m_pconn.release();//釋放連線物件指標
couninitialize(); //釋放com環境
後面的內容以後再討論吧!!!
執行帶輸出引數的儲存過程
declare msg varchar 100 exec submitinfo 34342 90782528352907 0,1,kf01 msg output select msg msg 為返回的資訊 儲存過程一部分 alter proc dbo submitinfo name varchar ...
儲存過程帶in引數
set ansi nulls on set quoted identifier on goalter procedure dbo testlist userid nvarchar 4000 asdeclare search array nvarchar 100 begin set search ar...
oracle儲存過程 帶引數的儲存過程
帶引數的儲存過程 舉例 為指定的員工漲100元的工資,列印漲前和漲後的工資 如果帶參,需要指定是輸入引數還是輸出引數 create orreplace procedure raisesalary eno in number as 定義乙個變數儲存漲前的薪水,引用emp中sal的型別作為psal的型別...