vc 中,ado執行sql server儲存過程

2021-09-30 15:50:25 字數 2780 閱讀 5752

_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...