Добрый день, коллеги!
У меня возник вопрос, а ответа поиском не нашел, может, кто-нибудь сталкивался уже...
Итак, есть процедура в ORACLE, есть код на C#, который ее вызывает.
У процедуры несколько параметров разных типов, типы параметров в C# соответствуют оракловым. Порядок добавления параметров в объект OleDbCommand не соответствует порядку параметров процедуры в ORACLE.
Но передаются значения параметров почему-то в порядке их добавления к OleDbCommand, а не выбираются по именам. Вопрос — почему, если у меня в процедуре:
CREATE OR REPLACE PROCEDURE ПРОЦЕДУРА(
параметр1 IN INTEGER;
параметр2 IN VARCHAR2;
параметр3 IN INTEGER;
...
а в коде явно указаны имена:
OleDbCommand tmp = new OleDbCommand("ПРОЦЕДУРА", conn);
tmp.CommandType = CommandType.StoredProcedure;
OleDbParameter param = null;
param = tmp.Parameters.Add(new OleDbParameter("параметр3", OleDbType.Integer));
param.Value = 1;
OleDbParameter param = null;
param = tmp.Parameters.Add(new OleDbParameter("параметр2", OleDbType.VarChar));
param.Value = "тест";
OleDbParameter param = null;
param = tmp.Parameters.Add(new OleDbParameter("параметр1", OleDbType.Integer));
param.Value = 2;
в процедуру попадут параметры: параметр1 = 1, параметр2 = "тест", параметр3 = 2, хотя все должно быть немного иначе?
Здравствуйте, Аноним, Вы писали:
А>У меня возник вопрос, а ответа поиском не нашел, может, кто-нибудь сталкивался уже...
А>Итак, есть процедура в ORACLE, есть код на C#, который ее вызывает.
А>У процедуры несколько параметров разных типов, типы параметров в C# соответствуют оракловым. Порядок добавления параметров в объект OleDbCommand не соответствует порядку параметров процедуры в ORACLE.
А>Но передаются значения параметров почему-то в порядке их добавления к OleDbCommand, а не выбираются по именам.
А почему они должны выбираться "по именам"?
Читайте
документацию:
The OLE DB .NET Provider does not support named parameters for passing parameters to an SQL statement or a stored procedure called by an OleDbCommand when CommandType is set to Text. In this case, the question mark (?) placeholder must be used. For example:
SELECT * FROM Customers WHERE CustomerID = ?
Therefore, the order in which OleDbParameter objects are added to the OleDbParameterCollection must directly correspond to the position of the question mark placeholder for the parameter in the command text.
То, что у вас CommandType.StoredProcedure, а не "Text", как сказано, дела не меняет — System.Data.OleDb
не поддерживает именованные параметры: