存储过程:
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;
}
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;
}