C#程序调用 oracle 存储过程发生的问题, v 友帮忙看下
存储过程:
PROCEDURE INCHECKPRINT(IV_FHTBH IN VARCHAR2,
IV_FHY IN VARCHAR2,
IV_DJBH IN VARCHAR2,
IV_YZID IN VARCHAR2,
IV_DJ_SORT IN VARCHAR2,
IV_ZZXH IN VARCHAR2,
OV_PXH OUT VARCHAR2) IS
LV_PX OUT_SALE_TASK_D.PXH%TYPE;
C_COUNT NUMBER;
V_PXH NUMBER;
V_DDLX OUT_SALE_BILLING_M.DDLX%TYPE;
BEGIN
xxxxxxx......
过程说明:
参数 IV_DJ_SORT 值会不同,其他的入参都是一致的,OV_PXH 从 1 开始返回结果,传入不同的 IV_DJ_SORT 值开始递增返回结果。
问题:
C#程序调用存储过程,当 OV_PXH 的返回值应为 10 时,存储过程会抛出一个异常:“...字符串缓冲区太小”。但是通过调试程序拿到对应的参数,然后在 plsql 里面新建测试窗口进行调用,是正常返回结果值 10 的。
试过的解决办法:
1 、关键词搜索相关结果,没有查询到对应类似的问题。
2 、使用 ai 分析代码,结果一直是说给参数和返回变量定义的长度有问题,但是让 ai 修改后,还是不行,可能是我描述的不够准确,目前使用 ai 也解决不了。
3 、把 plsql 里面的窗口执行代码直接在 C#程序里面执行,也不行,一样是字符串缓冲区太小。
我对 C#不太熟悉,目前是学习阶段,所以现在还没有想到其他思路去尝试解决这个问题,如果有 v 友遇到过类似问题或者可以解决这个问题,感谢告知。
tips:
如果上面我描述的不够清楚,请指出,谢谢。下面附上 C#调用存储过程的代码。
public bool CallInCheckPrint(string ivFhtbh, string ivFhy, string ivDjbh, string ivYzid, string ivDjSort, string ivZzxh)
{
using var conn = new OracleConnection(_connectionString);
conn.Open();
using var cmd = new OracleCommand("PKG_CHECKPROC.INCHECKPRINT", conn)
{
CommandType = CommandType.StoredProcedure,
BindByName = true
};
cmd.Parameters.Add(new OracleParameter("IV_FHTBH", OracleDbType.Varchar2, 4000, ParameterDirection.Input)).Value = ivFhtbh ?? "";
cmd.Parameters.Add(new OracleParameter("IV_FHY", OracleDbType.Varchar2, 4000, ParameterDirection.Input)).Value = ivFhy ?? "";
cmd.Parameters.Add(new OracleParameter("IV_DJBH", OracleDbType.Varchar2, 4000, ParameterDirection.Input)).Value = ivDjbh ?? "";
cmd.Parameters.Add(new OracleParameter("IV_YZID", OracleDbType.Varchar2, 4000, ParameterDirection.Input)).Value = ivYzid ?? "";
cmd.Parameters.Add(new OracleParameter("IV_DJ_SORT", OracleDbType.Varchar2, 4000, ParameterDirection.Input)).Value = ivDjSort ?? "";
cmd.Parameters.Add(new OracleParameter("IV_ZZXH", OracleDbType.Varchar2, 4000, ParameterDirection.Input)).Value = ivZzxh ?? "";
cmd.Parameters.Add(new OracleParameter("OV_PXH", OracleDbType.Varchar2, 4000, ParameterDirection.Output));
cmd.ExecuteNonQuery();
string resultPxh = cmd.Parameters["OV_PXH"].Value?.ToString();
return true;
}
3 条回复
beginor
12 小时 36 分钟前
骨灰级 C# 程序员路过, 建议把存储过程贴出来,这样可以一起分析, 或者把程序和存储过程一起丢给 AI 分析一下。 只写一半,没办法深入分析啊
rftlz0326
12 小时 24 分钟前
@
beginor 存储过程很长,而且涉及到很多其他包里面的过程和函数,无法完整贴出来或者给到 ai 。
kiracyan
7 小时 58 分钟前
再套一层 只返回输出看看,先手动返回一个值然后再调用原来存储过程返回同样值看看是哪里的问题。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
https://www.v2ex.com/t/1232049
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.