2013-06-28 7 views
0

У меня есть хранимая процедура на сервере oracle, и я пытаюсь запустить ее, однако я не могу понять, что я делаю неправильно. Когда я вызываю его непосредственно с сервера, он работает отлично, однако, когда я пытаюсь сделать это из веб-приложения, он не работает.Вызов Oracle хранимой процедуры из ASP.NET (C#)

Вот хранимая процедура с его параметрами:

my_stored_procedure ('1111' , '01 AUGUST 2011', '22','abc' , 
      'abc' , SYSDATE , 'abc' , 1 ,'abc' , NULL, 7, returnValue) ; 

Если я бегом это на оракул сервере, то он работает без каких-либо проблем, и делает то, что это предположит. Теперь вот с # код, который я бегу, чтобы попытаться заставить его работать:

OdbcConnection conn = getConnection(); //method that gets the connection 
     OdbcParameter[] parameter = new OdbcParameter[12]; 

     parameter[0] = new OdbcParameter("@P_1", OdbcType.VarChar); 
     parameter[0].Value = "0085"; 
     parameter[1] = new OdbcParameter("@P_2", OdbcType.DateTime); 
     parameter[1].Value = new DateTime(2013, 04, 15); 
     parameter[2] = new OdbcParameter("@P_3", OdbcType.VarChar); 
     parameter[2].Value = "72"; 
     parameter[3] = new OdbcParameter("@P_4", OdbcType.VarChar); 
     parameter[3].Value = "SANDBOX2"; 
     parameter[4] = new OdbcParameter("@P_5", OdbcType.VarChar); 
     parameter[4].Value = "BATAR"; 
     parameter[5] = new OdbcParameter("@P_6", OdbcType.DateTime); 
     parameter[5].Value = new DateTime(); 
     parameter[6] = new OdbcParameter("@P_7", OdbcType.VarChar); 
     parameter[6].Value = "MRD"; 
     parameter[7] = new OdbcParameter("@P_8", OdbcType.Double); 
     parameter[7].Value = 1; 
     parameter[8] = new OdbcParameter("@P_9", OdbcType.VarChar); 
     parameter[8].Value = "ORG70000"; 
     parameter[9] = new OdbcParameter("@P_10", OdbcType.VarChar); 
     parameter[9].Value = System.DBNull.Value; 
     parameter[10] = new OdbcParameter("@P_11", OdbcType.Double); 
     parameter[10].Value = 1; 
     parameter[11] = new OdbcParameter("@P_12", OdbcType.Int); 
     parameter[11].Value = 1; 
     parameter[11].Direction = ParameterDirection.Output; 

     cmd.Connection = conn; 
     cmd.CommandType = CommandType.StoredProcedure; 
     cmd.Parameters.AddRange(parameter); 
     cmd.CommandText = "my_stored_procedure (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ;"; 
     cmd.ExecuteNonQuery(); 
     foreach (OdbcParameter p in parameter) 
     { 
      if (p.Direction == ParameterDirection.Output) 
       returnParameter = p.Value.ToString(); 
     } 

     cmd.Connection.Close(); 
     cmd.Dispose(); 

ошибка, я получаю: + $exception {"ERROR [42000] [Oracle][ODBC][Ora]ORA-00900: invalid SQL statement\n"} System.Exception {System.Data.Odbc.OdbcException}

Я не могу понять, что я делаю неправильно.

Параметры для процедуры:

var1 VARCHAR2, var1 DATE, var3 VARCHAR2, 
    var4 VARCHAR2, var5 VARCHAR2, var6 DATE, var7 VARCHAR2, var8 NUMBER, 
    var9 VARCHAR2, var10 VARCHAR2 DEFAULT NULL, var11 NUMBER, var12 OUT NUMBER 
+0

параметр [11] имеет значение, но является выходным параметром. Должно ли это быть 'ParameterDirection.InputOutput'? – JayGee

+0

Я пробовал это, и он по-прежнему выдавал ту же ошибку, поэтому я попытался удалить значение и просто вызывать вывод, и он все равно дал мне ту же ошибку. – Bojan

ответ

2

Вы пробовали:

cmd.CommandText = "CALL my_stored_procedure"; 

или

cmd.CommandText = "CALL my_stored_procedure (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; 

команда ODBC требует ВЫЗОВ

+0

Вы «Гений! ха-ха не может поверить, что у меня пропала такая очевидная вещь ... – Bojan

+0

+1 смотрел именно на это. ODBC - мой заклятый враг – Steve

1

CommandText должен содержать только имя StoredProcedure

cmd.CommandText = "my_stored_procedure"; 
+0

Я просто попробовал это, и он по-прежнему дает мне ту же ошибку. – Bojan

+0

Можете ли вы добавить к своему вопросу код хранимой процедуры? – Steve

+0

К сожалению, я не могу, однако могу сказать, что, когда я запускаю хранимую процедуру в оракуле, он работает без проблем. Взгляните на параметры, которые я передаю, я убежден, что проблема там где-то. Я не знаю, правильно ли вызывается возвращаемый параметр или, возможно, нулевые или даже числовые поля. В оракуле они определяются как «Число». Я обновил код, чтобы показать типы параметров для процедуры. – Bojan

0

Это определение процедуры в оракула:

строки connStr = «Источник данных = источник данных; Упорство Info Security = True; User ID = пользователь; = ПАРОЛЬ; Unicode = Правда"; DataSet dataset = новый DataSet();

string connStr = ConfigurationManager.ConnectionStrings ["OracleConn"]. ToString();

using (OracleConnection objConn = new OracleConnection(connStr)) 
    { 
     OracleCommand objCmd = new OracleCommand(); 
     objCmd.Connection = objConn; 
     objCmd.CommandText = "Oracle_PkrName.Stored_Proc_Name"; 
     objCmd.CommandType = CommandType.StoredProcedure; 
     objCmd.Parameters.Add("Emp_id", OracleType.Int32).Value = 3; // Input id 
     objCmd.Parameters.Add("Emp_out", OracleType.Cursor).Direction = ParameterDirection.Output; 

     try 
     { 
      objConn.Open(); 
      objCmd.ExecuteNonQuery(); 
      OracleDataAdapter da = new OracleDataAdapter(objCmd); 
      da.Fill(dataset);     
     } 
     catch (Exception ex) 
     { 
      System.Console.WriteLine("Exception: {0}", ex.ToString()); 
     } 
     objConn.Close(); 
    }