zoukankan      html  css  js  c++  java
  • 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作为判断删除是否成功的标志。
  • 相关阅读:
    如果把表单数据的校验交给了javascript那么后台还有没有必要对数据做校验呢
    JSR303注解
    C++ STL标准模板库(stack)
    C++ STL标准模板库(vector)
    C++ 类模板三(类模版中的static关键字)
    C++ 类模板二(类模版与友元函数)
    C++ 类模板一(类模板的定义)
    C语言 百炼成钢27
    C语言 百炼成钢26
    C语言 百炼成钢25
  • 原文地址:https://www.cnblogs.com/Yinner/p/1558361.html
Copyright © 2011-2022 走看看