有效總結(jié)ADO參數(shù)的使用說明
其實對于ADO參數(shù)這個東西我有許多想說的,如果不設(shè)置游標(biāo)為adUseClient,那么我在取return和output參數(shù)的時候,必須在我把記錄集關(guān)閉以后才能取,就是說,必須先取記錄集,然后關(guān)閉它,***再取return和output參數(shù)。
設(shè)成adUseClient就ok了,另外有ADO參數(shù)一點就是,Execute 方法返回的游標(biāo)繼承該設(shè)置。Recordset 將自動從與之關(guān)聯(lián)的連接中繼承該設(shè)置。我把pConn設(shè)成adUADO參數(shù)seClient,那么***,我的記錄集也是adUseClient的了。
在可以執(zhí)行這個存儲過程了m_pRecordset = m_pCommand->Execute(0,0,adCmdStoredProc);這個時候,如果接下來用variant_t ret_val = m_pCommand->Parameters->GetItem((long)0)->Value;那么將得不到值而如果像下面這樣調(diào)用的話就可以得到返回值了m_pRecordset->Close();variant_t outpuADO參數(shù)t_para = m_pCommand->Parameters->GetItem((long)0)->Value;
MS ADO.net給這一現(xiàn)象的回復(fù)是#t#
You can think of a storADO參數(shù)ed procedure as a function in your code. The function doesn’t return a value until it has executed all of its code. If the stored procedure returns results and you haven’t finished processing these results, the stored procedure hasn’t really finished executing. Until you’ve closed the DataReader, the return and output parameters of your Command won’t contain the values returned by your stored procedure.
也就是說Execute()函數(shù)應(yīng)該看成是直到m_pRecordset關(guān)掉以后才會正確返回.關(guān)于輸出參數(shù)的處理也和這一樣,因為返回值本身就是當(dāng)成輸出參數(shù)來處理的.通過這種方法,我們可以得到一個存儲過程的返回值和結(jié)果集,而且對于所有的存儲過程都可以一樣使用,不必為某個特定ADO參數(shù)的存儲過程去寫代碼,具有一定的通用性.
所以一但調(diào)用它以后,就可以獲取SP的那些信息,那些參數(shù)的信息,可以通過pCmd->Parameters->Item[_variant_t(_bstr_t(\"@pin1\") )]->Value=_variant_t(3); 這樣的方式來設(shè)置參數(shù)
如果要使用Parameter的辦法的話,就不要用refresh了,事實上,如ADO參數(shù)果先把這些參數(shù)的值設(shè)置好了,如 inParam2->Value = _variant_t(_T(\"DD1\"));,一旦refresh后,這些參數(shù)就沒有意義了。
Command.Prepare方法能夠提高數(shù)據(jù)源中重復(fù)的參數(shù)化命令的性能。Prepare指示數(shù)據(jù)源為多個調(diào)用優(yōu)化特定的命令。為了更高效率地使用Prepare,你必須十分清楚數(shù)據(jù)源怎樣回應(yīng)Prepare調(diào)用。對于類似SQL Server 2000的數(shù)據(jù)源,命令是隱式優(yōu)化的,ADO參數(shù)對Prepare的調(diào)用是沒有必要的,但是對于另一些數(shù)據(jù)源,例如SQL Server 7.0,Prepare效率更高。