【发布时间】:2014-03-27 14:26:47
【问题描述】:
我们在 C# 程序中使用 Oracle 存储过程,在我们添加“v_nameurn”变量之前它工作正常。
这是 Oracle 过程:
create or replace procedure stats_By_Date (
v_SDate IN varchar2,
v_EDate IN varchar2,
v_user IN number,
v_nameurn IN number,
p_cursor OUT SYS_REFCURSOR
) as
BEGIN
OPEN p_cursor FOR
select T1.Staff_No,
T3.Title,
T2.Verno,
To_char(T1.Response_dt, 'DD/MM/YYYY'),
T5.Response,
T6.Forenames||' '||T6.Surname
from TOU.Users_version_link T1,
TOU.Version T2,
TOU.name T3,
TOU.Admin_Access T4,
Tou.CV_Response T5,
corp.wforce_employee@remote_DWLive T6
where T1.Version_urn=T2.Urn
and T1.Name_urn= T3.urn
and T3.urn = T4.name_urn
and T1.Response_urn=T5.urn
and T1.staff_no=T6.Staff_Number
and Trunc(T1.Response_dt) >= To_date(v_Sdate, 'DD/MM/YYYY')
and Trunc(T1.Response_dt) <= To_date(v_EDate, 'DD/MM/YYYY')
and T4.Staff_No = v_user
and T3.urn = v_nameurn;
End;
这里是 C# 代码:
this.ConnectToDb();
var cmd = new OracleCommand
{
Connection = cn,
CommandText = "TOU.Stats_By_Date",
CommandType = CommandType.StoredProcedure
};
var id = HttpContext.Current.User.Identity.Name.Split('\\')[1].ToString();
cmd.Parameters.Add("v_SDate", OracleDbType.Varchar2).Value =
startdate.ToString("dd-MM-yyyy");
cmd.Parameters.Add("v_EDate", OracleDbType.Varchar2).Value =
enddate.ToString("dd-MM-yyyy");
cmd.Parameters.Add("v_user", OracleDbType.Decimal).Value = int.Parse(id);
cmd.Parameters.Add("v_nameurn", OracleDbType.Decimal).Value = 3;
var rc = cmd.Parameters.Add("p_cursor", OracleDbType.RefCursor);
rc.Direction = ParameterDirection.Output;
cmd.ExecuteNonQuery();
this.DisconnectFromDb();
请对可能出现的问题有任何建议吗?两段代码中总共有 5 个变量(4 输入,1 输出),这很好,并且所有数据类型似乎都匹配。我还尝试了实际 v_nameurn 变量的不同变体,因此我尝试了 3,“3”,并预先将其定义为 Int 变量。
【问题讨论】:
-
对不起,如果这是一个愚蠢的问题,但你每次都关闭连接吗?
-
谢谢,是的,我已经更新了我的代码
-
我不确定您为什么要从 C# 以
"dd-MM-yyyy"格式传递日期,并在 Oracle 中使用'DD/MM/YYYY'格式将其转换为日期。虽然这可能不是错误的原因,但对我来说似乎是错误的。您也可以尝试将 3 解析为整数,就像为id所做的那样,我的意思是int.Parse(3),我不知道它在 C# 中是如何工作的,但值得一试。 -
对不起,如果这是另一个愚蠢的问题,但是您确定您在 C# 代码所在的架构 (
TOU) 中创建了新版本的存储过程(使用v_nameurn参数)寻找它?一种检查方法是查看 SQL*Plus 中的DESCRIBE TOU.STATS_BY_DATE命令是否显示新参数。 -
另一个小建议,确保为 OracleCommand 将
BindByName属性设置为True,否则 Oracle 会尝试在位置上匹配参数。它可能不会影响您的错误,但这是一个很好的做法。