繁体   English   中英

从C#调用Oracle存储过程?

[英]Calling Oracle stored procedure from C#?

如何从C#调用oracle中的存储过程?

请访问由oracle为Microsoft OracleClient Developers设置的ODP网站: http : //www.oracle.com/technetwork/topics/dotnet/index-085703.html

同样在下面是示例代码,可以帮助您开始从C#到Oracle调用存储过程。 PKG_COLLECTION.CSP_COLLECTION_HDR_SELECT是在Oracle上构建的存储过程,接受参数PUNIT,POFFICE,PRECEIPT_NBR并将结果返回到T_CURSOR。

using Oracle.DataAccess;
using Oracle.DataAccess.Client;

public DataTable GetHeader_BySproc(string unit, string office, string receiptno)
{
    using (OracleConnection cn = new OracleConnection(DatabaseHelper.GetConnectionString()))
    {
        OracleDataAdapter da = new OracleDataAdapter();
        OracleCommand cmd = new OracleCommand();
        cmd.Connection = cn;
        cmd.InitialLONGFetchSize = 1000;
        cmd.CommandText = DatabaseHelper.GetDBOwner() + "PKG_COLLECTION.CSP_COLLECTION_HDR_SELECT";
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.Add("PUNIT", OracleDbType.Char).Value = unit;
        cmd.Parameters.Add("POFFICE", OracleDbType.Char).Value = office;
        cmd.Parameters.Add("PRECEIPT_NBR", OracleDbType.Int32).Value = receiptno;
        cmd.Parameters.Add("T_CURSOR", OracleDbType.RefCursor).Direction = ParameterDirection.Output;

        da.SelectCommand = cmd;
        DataTable dt = new DataTable();
        da.Fill(dt);
        return dt;
    }
}

我现在已经有了从C#调用过程所需的步骤

   //GIVE PROCEDURE NAME
   cmd = new OracleCommand("PROCEDURE_NAME", con);
   cmd.CommandType = CommandType.StoredProcedure;

   //ASSIGN PARAMETERS TO BE PASSED
   cmd.Parameters.Add("PARAM1",OracleDbType.Varchar2).Value = VAL1;
   cmd.Parameters.Add("PARAM2",OracleDbType.Varchar2).Value = VAL2;

   //THIS PARAMETER MAY BE USED TO RETURN RESULT OF PROCEDURE CALL
   cmd.Parameters.Add("vSUCCESS", OracleDbType.Varchar2, 1);
   cmd.Parameters["vSUCCESS"].Direction = ParameterDirection.Output;

   //USE THIS PARAMETER CASE CURSOR IS RETURNED FROM PROCEDURE
   cmd.Parameters.Add("vCHASSIS_RESULT",OracleDbType.RefCursor,ParameterDirection.InputOutput); 

   //CALL PROCEDURE
   con.Open();
   OracleDataAdapter da = new OracleDataAdapter(cmd);
   cmd.ExecuteNonQuery();

   //RETURN VALUE
   if (cmd.Parameters["vSUCCESS"].Value.ToString().Equals("T"))
   {
      //YOUR CODE
   }
   //OR
   //IN CASE CURSOR IS TO BE USED, STORE IT IN DATATABLE
   con.Open();
   OracleDataAdapter da = new OracleDataAdapter(cmd);
   da.Fill(dt);

希望这可以帮助

它与非查询命令的基本机制相同:

  • command.CommandText =存储过程的名称
  • command.CommandType = CommandType.StoredProcedure
  • sp要求的对command.Parameters.Add的调用与参数数量一样多
  • command.ExecuteNonQuery

那里有很多例子,谷歌返回的第一个例子就是这个

您可能还会陷入一个陷阱,如果您的SP是一个函数,则返回值参数必须在参数集合中排在首位

此代码对我调用oracle存储过程非常有效

通过在解决方案资源管理器>添加引用> .Net中右键单击您的项目名称来添加引用,然后添加名称空间。

using System.Data.OracleClient;
using System.Data;

然后将此代码粘贴到事件处理程序中

        string str = "User ID=username;Password=password;Data Source=Test";
        OracleConnection conn = new OracleConnection(str);
        OracleCommand cmd = new OracleCommand("stored_procedure_name", conn);
        cmd.CommandType = CommandType.StoredProcedure;
        --Ad parameter list--
        cmd.Parameters.Add("parameter_name", "varchar2").Value = value;
        ....
        conn.Open();
        cmd.ExecuteNonQuery();

及其完成...使用C#进行快乐编码

连接到Oracle很丑。 这是一些带有using语句的更简洁的代码。 其他许多示例并未在其创建的对象上调用IDisposable方法。

using (OracleConnection connection = new OracleConnection("ConnectionString"))
    using (OracleCommand command = new OracleCommand("ProcName", connection))             
    {
          command.CommandType = CommandType.StoredProcedure;
          command.Parameters.Add("ParameterName", OracleDbType.Varchar2).Value = "Your Data Here";
          command.Parameters.Add("SomeOutVar", OracleDbType.Varchar2, 120);
          command.Parameters["return_out"].Direction = ParameterDirection.Output;
          command.Parameters.Add("SomeOutVar1", OracleDbType.Varchar2, 120);
          command.Parameters["return_out2"].Direction = ParameterDirection.Output;
          connection.Open();
          command.ExecuteNonQuery();
          string SomeOutVar = command.Parameters["SomeOutVar"].Value.ToString();
          string SomeOutVar1 = command.Parameters["SomeOutVar1"].Value.ToString();
    }

在.Net到版本4中,这可以通过与SQL Server存储过程相同的方式来完成,但请注意,您需要:

using System.Data.OracleClient;

这里有一些系统要求 ,您应该在方案中验证是否可以。

Microsoft 从.Net 4开始不推荐使用此命名空间,因此将来将需要第三方提供程序。 考虑到这一点,使用go一词中的Oracle Data Provider for .Net (ODP.NET)可能会更好-这具有Microsoft类中没有的优化。 还有其他第三方选项,但是Oracle对于让.Net开发人员加入董事会有着浓厚的既得利益,因此他们的软件应该不错。

代替

cmd = new OracleCommand("ProcName", con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("ParName", OracleDbType.Varchar2, ParameterDirection.Input).Value = "foo";

您还可以使用以下语法:

cmd = new OracleCommand("BEGIN ProcName(:p0); END;", con);
cmd.CommandType = CommandType.Text;
cmd.Parameters.Add("ParName", OracleDbType.Varchar2, ParameterDirection.Input).Value = "foo";

请注意,如果设置cmd.BindByName = False (这是默认设置),则必须按照与在命令字符串中写入的顺序相同的顺序添加参数,实际名称cmd.BindByName = False 对于cmd.BindByName = True ,参数名称必须匹配,顺序无关紧要。

如果是函数调用,命令字符串将如下所示:

cmd = new OracleCommand("BEGIN :ret := ProcName(:ParName); END;", con);
cmd.CommandType = CommandType.Text;
cmd.Parameters.Add("ret", OracleDbType.RefCursor, ParameterDirection.ReturnValue);    
cmd.Parameters.Add("ParName", OracleDbType.Varchar2, ParameterDirection.Input).Value = "foo";
// cmd.ExecuteNonQuery(); is not needed, otherwise the function is executed twice!
var da = new OracleDataAdapter(cmd);
da.Fill(dt);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM