Вызывать хранимую процедуру Oracle из C #? - PullRequest
25 голосов
/ 15 октября 2010

Я только начал читать о хранимых процедурах. Может кто-нибудь, пожалуйста, помогите мне вызвать хранимую процедуру в oracle из C #?

Ответы [ 7 ]

32 голосов
/ 27 июня 2011

Пожалуйста, посетите этот сайт ODP, созданный Oracle для разработчиков Microsoft OracleClient: 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;
    }
}
17 голосов
/ 03 января 2012

Теперь у меня есть шаги, необходимые для вызова процедуры из 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);

Надеюсь, это поможет

5 голосов
/ 15 октября 2010

Это в основном тот же механизм, что и для команды без запроса с:

  • command.CommandText = имя хранимая процедура
  • command.CommandType = CommandType.StoredProcedure
  • Сколько вызовов к команде. Параметры. Добавлять количество параметров, которое требует sp
  • command.ExecuteNonQuery

Существует множество примеров, первый из которых Google возвращает этот

Существует также небольшая ловушка, в которую вы можете попасть, если ваш SP является функцией, ваш параметр возвращаемого значения должен быть первым в коллекции параметров

4 голосов
/ 09 июля 2013

Этот код хорошо работает для меня, вызывая хранимую процедуру оракула

Добавьте ссылки, щелкнув правой кнопкой мыши имя вашего проекта в обозревателе решений> Добавить ссылку> .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 #

3 голосов
/ 02 августа 2018

Подключение к 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();
    }
2 голосов
/ 15 октября 2010

В .Net до версии 4 это можно сделать так же, как и для хранимых процедур SQL Server, но учтите, что вам необходимо:

using System.Data.OracleClient;

Здесь некоторые системные требования , которыевы должны убедиться, что в вашем сценарии все в порядке.

Microsoft устарела в этом пространстве имен начиная с .Net 4 , поэтому в будущем понадобятся сторонние поставщики.Имея это в виду, вам может быть лучше использовать Oracle Data Provider для .Net (ODP.NET) с самого начала - здесь есть оптимизации, которых нет в классах Microsoft.Существуют и другие сторонние варианты, но Oracle сильно заинтересована в том, чтобы держать разработчиков .Net на борту, поэтому они должны быть хорошими.

0 голосов
/ 10 мая 2019

Вместо

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 = 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...