Как вызвать хранимую процедуру в oracle из С#?
Вызов хранимой процедуры Oracle из С#?
Ответ 1
Посетите этот сайт ODP, созданный Oracle для разработчиков OracleClient для Microsoft: http://www.oracle.com/technetwork/topics/dotnet/index-085703.html
Также ниже приведен пример кода, который может заставить вас начать вызов хранимой процедуры из С# в 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;
}
}
Ответ 2
Теперь у меня есть шаги, необходимые для вызова процедуры из С#
//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);
Надеюсь, что это поможет
Ответ 3
Это в основном тот же механизм, что и для команды без запроса с:
- command.CommandText = имя хранимой процедуры
- command.CommandType =
CommandType.StoredProcedure
- Столько обращений к команде. Параметры. Добавьте количество параметров, которое требует sp
- command.ExecuteNonQuery
Есть много примеров там, первый возвращаемый Google является это один
Есть также небольшая ловушка, в которую вы можете попасть, если ваш SP - функция, ваш возвращаемый параметр должен быть первым в коллекции параметров.
Ответ 4
Этот код хорошо работает для меня, когда я вызываю хранимую процедуру 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();
И его Done... Happy Coding с С#
Ответ 5
Подключение к Oracle ужасно. Вот немного более чистого кода с использованием оператора. Многие другие примеры не вызывают методы 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();
}
Ответ 6
В .Net через версию 4 это можно сделать так же, как и для SQL Server Stored Procs, но обратите внимание, что вам нужно:
using System.Data.OracleClient;
Здесь некоторые системные требования, которые вы должны подтвердить, в вашем сценарии в порядке.
Microsoft обесценивает это пространство имен с .Net 4, поэтому сторонние поставщики понадобятся в будущем. Имея это в виду, вам может быть лучше использовать поставщик данных Oracle для .Net (ODP.NET) из слова go - у этого есть оптимизации, которые не входят в классы Microsoft. Существуют и другие сторонние варианты, но Oracle имеет большой интерес к тому, чтобы разработчики .NET на борту, чтобы их было хорошо.
Ответ 7
Вместо
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);