_variant_t recordsaffected;
string szsql = (string)"p_ks_adduser '" + m_szname+ "','" + m_szpasswd +"';";
trycatch(_com_error e)
catch(_com_error &e)
}必須指定執行sql語句的commandtype是adcmdstoredproc,儲存過程有引數就必須createparameter生成引數,這樣呼叫儲存過程就成了很麻煩的一件事情,必須針對不同的儲存過程生成不同的引數。乙個兩個還可以接受,如果專案的業務邏輯比較複雜,需要依賴大量的儲存過程,並且專案的需求或功能可能要經常變動或擴充套件,那就成了乙個噩夢了。有沒有通用的方法呢?當然有,只需要通用的查詢就可以實現。
_connectionptr pconnection = null;
m_conn.createinstance(__uuidof(connection));
m_conn->connectionstring = "provider=sqloledb;data source=srv;"initial catalog=pubs;user id=sa;password=;";
m_conn->open("","","",null);
_variant_t m_param;
_bstr_t m_bstr;
int index = 0,nfieldcount;
_recordsetptr m_rs;
m_rs.createinstance(__uuidof(recordset));
m_rs->open("select * from titles",(idispatch*)(m_conn->m_conn),adopenstatic, adlockreadonly,adcmdtext);
nfieldcount = m_rs->fields->count;
while(!m_rs->endoffile)
m_rs->movenext();
}m_rs->close();
m_conn->close();
以上一段就是普通的執行查詢sql語句的**,簡單起見,去掉了所有防護和判斷**,對於ms sqlserver,如果是執行返回結果集的儲存過程,比如pubs的byroyalty,只需要把上面**中的"select * from titles"替換成"byroyalty 100"就可以了,即"過程名 引數1,引數2,..."形式。
這樣一來,不需要生成引數,只需要改變sql語句,就實現了ms sqlserver儲存過程的呼叫,可以通用。但是對於返回引數的儲存過程,這段**就不行了,不過還是可以通過sql語句解決:
「declare @q int exec checkpwd 'user','pwd',@ret = @q output select @q」
checkpwd是乙個儲存過程,兩個輸入引數,使用者名稱和密碼,第三個是輸出引數@ret,返回使用者驗證的結果。通過執行上面的sql語句,把輸出引數作為結果集返回,就可以適應上面的vc**了。返回值的儲存過程也是一樣,執行「declare @q int,@return int exec @return = checkpwd 'user','pwd',@ret = @q output select @q,@return」就可以了。
這裡講的是sqlserver的儲存過程呼叫,這段**同樣可以呼叫oracle的儲存過程,不過需要對sql語句作出一些調整。
有參無返回儲存過程
oleinitialize(null);
_connectionptr _pconn(__uuidof(connection));
_variant_t _vres;
_pconn->open("provider=sqloledb; server=192.168.1.155; initial catalog=smsmessage; user id=sa; password=tendency",(bstr) null, (bstr) null, -1);
cstring strsql;
strsql.format("exec smsmessage_insert '4001','1','2001','2002145'");
_pconn->execute((_bstr_t)strsql,&_vres,adcmdtext);
if(_pconn->getstate() == adstateopen)
_pconn->close();
if(_pconn != null)
_pconn.release();
oleuninitialize();
無參無返回儲存過程
oleinitialize(null);
_connectionptr _pconn(__uuidof(connection));
_variant_t _vres;
_pconn->open("provider=sqloledb; server=192.168.1.155; initial catalog=smsmessage; user id=sa; password=tendency",(bstr) null, (bstr) null, -1);
_pconn->execute("smsmessage_insert",&_vres,adcmdstoredproc);
if(_pconn->getstate() == adstateopen)
_pconn->close();
if(_pconn != null)
_pconn.release();
oleuninitialize();
//有參有返回值的儲存過程
VC中ADO程式設計
介紹 vc用ado訪問資料庫全攻略,介紹了vc用ado來訪問資料庫的各個物件及各方法,很經典,也很實用,很值得一看。正文 一 ado概述 ado是microsoft為最新和最強大的資料訪問範例 ole db 而設計的,是乙個便於使用的應用程式層介面。ado 使您能夠編寫應用程式以通過 ole.db ...
vc中ADO執行儲存過程方法記錄
ado執行儲存過程,需要用到 commandptr介面。方法如下 可將如下 段放在資料庫初始化連線中 commandptr m pcommand 定義 commandptr介面的操作物件 m pcommand.createinstance uuidof command 建立例項 m pcommand...
VC 中建立ADO操作類
以通過ado連線access資料庫為例,建立cadoconn類,方便資料庫操作。adoconn.h inte ce for the cadoconn class.if defined afx adoconn h 6d332e0a e24a 4c55 a6e3 73479d3a1e72 include...