如何使用C#调用Oracle存储过程_OracleCommand配置CommandType.StoredProcedure
OracleCommand.CommandType CommandType.StoredProcedure 生效的前提是存储过程名与CommandText完全一致含大小写、包名参数名、方向、类型须与PL/SQL端严格匹配且连接字符串必须包含UnicodeTrue以确保字符串正确传输。OracleCommand.CommandType CommandType.StoredProcedure 为什么没生效常见现象是调用后无报错但存储过程没执行或返回空结果。根本原因不是 commandtype 设错了而是没配对oracle 存储过程名必须和 commandtext 完全一致含大小写、包名且参数名、方向、类型必须与 pl/sql 端严格匹配。CommandText 应设为 pkg_name.proc_name带包名或 proc_name无包不能是 call pkg_name.proc_name() 或带 begin/endOracle 不靠函数签名推断参数OracleParameter 的 ParameterName 必须和存储过程中定义的参数名**完全一致**区分大小写哪怕只差一个下划线也会绑定失败如果存储过程有 OUT 或 IN OUT 参数Direction 必须显式设为 ParameterDirection.Output 或 ParameterDirection.InputOutput不能省略IN/OUT 参数怎么传才不报 ORA-06502 或 ORA-01008ORA-06502 多半是类型不匹配比如 C# 传 intPL/SQL 期望 NUMBER(1)ORA-01008 是“未绑定变量”本质是参数名拼错或漏加 OracleParameter。OracleParameter 构造时OracleDbType 要尽量选精确类型OracleDbType.Varchar2 对应 VARCHAR2OracleDbType.Int32 对应 NUMBER(10)别全用 OracleDbType.Decimal对于 REF CURSOR 输出参数必须用 OracleDbType.RefCursor且不能设 Value执行后需用 OracleDataAdapter 或 ExecuteReader() 拿结果集如果存储过程定义了默认值的参数C# 仍需显式添加该参数并设 Value DBNull.Value否则 Oracle 认为“未提供”可能触发 ORA-01008连接字符串里要不要加 Unicodetrue要加尤其当存储过程处理中文、特殊符号或使用 NVARCHAR2 类型时。不加可能导致乱码或隐式转换失败且错误常不直接报在执行阶段而是在取 OUT 值时崩掉。连接字符串中明确加上 UnicodeTrue如 Data Source...;User Id...;Password...;UnicodeTrue;即使数据库字符集是 AL32UTF8.NET 驱动默认仍按非 Unicode 方式编码字符串UnicodeTrue 才启用 UTF-16 ? UTF-8 正确转换这个配置不影响 CommandType 行为但会影响所有字符串参数的传输准确性漏掉它前面参数全对也白搭执行后读不到 REF CURSOR 返回的数据集不是没返回是没用对方式。Oracle 的 REF CURSOR 不能像 SQL 查询那样直接 ExecuteScalar() 或当普通输出参数取值它本质是个游标句柄得用数据适配器或专门的读取逻辑。 arXiv Xplorer ArXiv 语义搜索引擎帮您快速轻松的查找保存和下载arXiv文章。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2520971.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!