其实对于ADO参数这个东西我有许多想说的,如果不设置游标为adUseClient,那么我在取return和output参数的时候,必须在我把记录集关闭以后才能取,就是说,必须先取记录集,然后关闭它,***再取return和output参数。
设成adUseClient就ok了,另外有ADO参数一点就是,Execute 方法返回的游标继承该设置。Recordset 将自动从与之关联的连接中继承该设置。我把pConn设成adUADO参数seClient,那么***,我的记录集也是adUseClient的了。
在可以执行这个存储过程了m_pRecordset = m_pCommand->Execute(0,0,adCmdStoredProc);这个时候,如果接下来用variant_t ret_val = m_pCommand->Parameters->GetItem((long)0)->Value;那么将得不到值而如果像下面这样调用的话就可以得到返回值了m_pRecordset->Close();variant_t outpuADO参数t_para = m_pCommand->Parameters->GetItem((long)0)->Value;
MS ADO.net给这一现象的回复是#t#
You can think of a storADO参数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()函数应该看成是直到m_pRecordset关掉以后才会正确返回.关于输出参数的处理也和这一样,因为返回值本身就是当成输出参数来处理的.通过这种方法,我们可以得到一个存储过程的返回值和结果集,而且对于所有的存储过程都可以一样使用,不必为某个特定ADO参数的存储过程去写代码,具有一定的通用性.
所以一但调用它以后,就可以获取SP的那些信息,那些参数的信息,可以通过pCmd->Parameters->Item[_variant_t(_bstr_t(\"@pin1\") )]->Value=_variant_t(3); 这样的方式来设置参数
如果要使用Parameter的办法的话,就不要用refresh了,事实上,如ADO参数果先把这些参数的值设置好了,如 inParam2->Value = _variant_t(_T(\"DD1\"));,一旦refresh后,这些参数就没有意义了。
Command.Prepare方法能够提高数据源中重复的参数化命令的性能。Prepare指示数据源为多个调用优化特定的命令。为了更高效率地使用Prepare,你必须十分清楚数据源怎样回应Prepare调用。对于类似SQL Server 2000的数据源,命令是隐式优化的,ADO参数对Prepare的调用是没有必要的,但是对于另一些数据源,例如SQL Server 7.0,Prepare效率更高。