VC++中使用ADO访问Oracle遇到的问题及解决方法(待续)

1、如何判断存储过程输出参数的值为NULL?
 办法如下:
    _variant_t v = m_pCmd->Parameters->Item["xxxxx"]->Value;

    
if ( v.vt == VT_NULL ) return "";
    
else return v.bstrVal;
解释:若不进行NULL判断,直接返回v.bstrVal,则会报错!

2、存储过程正确,程序中参数设置也正确,为什么会报错或者结果不正确?
可能原因:c++中执行参数的Append()方法的顺序必须和Oracle中的参数顺序一致。
解释:ADO与Oracle的通信不似ADO.NET那么智能,它以格式化的字符串进行通信,所以如果参数的顺序与数据库中的参数顺序不一致,传递的值就会出现错误。

3、是否可以使用Reresh()方法?
回答:不可以
解释:ADO使用Command的Parameter来操作Oracle的存储过程,必须不断的CreateInstance、Append,过程确实繁琐;网上提供的Refresh()方法可以在执行以下步骤:
m_pCmd->CommandText = "stocName";
m_pCmd
->CommandType = adCmdStoredProc;
m_pCmd
->Parameters->Refresh();
之后,存储过程所要求的参数列表会自动填充到m_pCmd->Parameters中去,剩下的只需对输入参数赋值、执行即可,这简直是天来福音,引起我一阵激动,但经过无数次的尝试后,始终未能成功,不得不放弃。废尽千辛总算被我找到了原因:
(参见微软在线帮助《PRB: ADO Refresh Method May Fail with Oracle Stored Procedure》)
Oracle不支持这一方法,而其他数据库如SQL SERVER(自家的孩子果然待遇不一样啊)、Sysbae是支持的,唉,两大企业的死掐可害苦了我们!

4、在执行Parameters->Append( parameter )时需要注意什么?
回答:对于已经添加的对象不能重复添加,否则Execute()时会报错!
建议:如果多个函数共用一个Command对象,建议在每个函数结束时Delete您所Append的Parameter对象,这样其他函数在添加参数对象时就不用担心重复的问题了。

5、在存储过程中使用序列?
在存储过程中使用序列时,不能在赋值语句的上下文中使用,如:
inttemp := sequence1.nextval;
而应该在select语句中使用,如:
select sequence1.nextval into inttemp from dual;

6、使用RecordsAffected
当使用Command.Execute()方法执行存储过程时,所返回的RecordAffected值受影响的行数,如果存储过程只有一条语句(用于删除前的判断)
select count(*into mycount from table1;
这里,返回的RecordAffected值为1。
因此,不能简单地使用RecordAffected作为判断删除是否成功的标志。

posted on 2009-09-01 22:23  Yinner  阅读(2239)  评论(0编辑  收藏  举报

导航