将具有输入参数的Oracle存储过程的数据表返回给.NET应用程序

时间:2016-07-07 14:04:35

标签: c# .net oracle stored-procedures

我已经对我的问题进行了一些研究,但我认为由于缺乏Oracle经验(完全来自SQL Server背景),我正在努力。

我试图从.NET应用程序调用Oracle存储过程并将数据表返回给我的应用程序。我得到了一个" ORA-00900:无效的SQL语句"错误。

伪隐藏:

OracleConnection conn = new OracleConnection("...");
OracleCommand cmd = new OracleCommand("sproc_name", conn);
cmd.Connection = conn;
cmd.Parameters.Add("Year", OracleDbType.Int16).Value = vYear
cmd.Parameters.Add("Name", OracleDbType.Varchar2).Value = vName;
cmd.Parameters.Add("ID", OracleDbType.Varchar2).Value = vID;
conn.Open();
DataTable dt = new DataTable();
dt.Load(cmd.ExecuteReader());

伪存储过程:

CREATE OR REPLACE
PROCEDURE sproc_name
(
  Year IN NUMBER
, Name IN VARCHAR2
, ID IN VARCHAR2
)
AS
BEGIN
SELECT *
FROM TABLE
WHERE TABLE.Year = Year AND
      TABLE.Name = Name AND
      TABLE.ID = ID
END sproc_name;

我已阅读参考游标,我试图重写我的程序,没有运气。我该怎么办?

2 个答案:

答案 0 :(得分:0)

试试这个

using (var conn = new OracleConnection("..."))

using (var cmd = conn.CreateCommand())
{

cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "sproc_name";
cmd.BindByName = true;

// ...

答案 1 :(得分:0)

回答一些老问题,但回答回答问题总是好的, Oracle永远不会将您的输出显示为sql。为了获得结果集,您需要将sys_refcursor标识为Out参数。

因此,您的过程将类似于 也尝试命名适当的(只是一个建议):)

CREATE OR REPLACE PROCEDURE sproc_name (
  numYear IN NUMBER
, strName IN VARCHAR2
, numID IN VARCHAR2,
, cr_output out sys_refcursor
)
AS
BEGIN
open cr_output for
SELECT *
FROM TABLE
WHERE TABLE.Year = Year AND
      TABLE.Name = Name AND
      TABLE.ID = ID
END sproc_name;