rAZHere Ответов: 4

ORA-00936: отсутствующее выражение


Мой код выглядит следующим образом:

string sql = "Insert into Employee (EmpId,FirstName,LastName)" +
                         "values(@EmpID,'@FirstName','@LastName')";

           using (OracleConnection conn = new OracleConnection(connString))
           {
               conn.Open();

               using (OracleCommand cmd = new OracleCommand(sql, conn))
               {
                   cmd.Parameters.Add("@EmpID", OracleDbType.Int32).Value = empID;
                   cmd.Parameters.Add("@FirstName", OracleDbType.Varchar2).Value = firstName;
                   cmd.Parameters.Add("@LastName", OracleDbType.Varchar2).Value = lastName;



                   //cmd.Parameters.Add("@Dob", OracleDbType.Varchar2).Value = "2070.03.04";
                   //cmd.Parameters.Add("@Salary", OracleDbType.Int32).Value =333 ;
                   //cmd.Parameters.Add("@DeptId", OracleDbType.Int32).Value = 21;

                   cmd.ExecuteNonQuery();
               }
           }



//---------------------------------------------------------------------------------------------
При выполнении команды 'cmd.ExecuteNonQuery()' это приводит к следующей ошибке >> 'ORA-00936: отсутствует выражение'

т.е.

Ошибка сервера в приложении'/'.
ORA-00936: отсутствующее выражение
Описание: необработанное исключение возникло во время выполнения текущего веб-запроса. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.

Сведения Об Исключении: Oracle.Доступа к данным.Клиент.OracleException: ORA-00936: отсутствует выражение

Ошибка Источника:


Строка 409: //cmd.Parameters.Add("@DeptId", OracleDbType.Int32).Value = 21;
Строка 410:
Строка 411: cmd.Метод executenonquery();
Строка 412: }
Строка 413: }


Исходный Файл: G:\Practise\Default.aspx.cs Линия: 411

трассировка стека:


[OracleException (0x80004005): ORA-00936: отсутствует выражение]
Оракул.Доступа к данным.Клиент.Исключение OracleException.HandleErrorHelper(int32 значение errCode, объекта oracleconnection, штат Коннектикут, указателя IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, объект src, процедура строка, булево bCheck) +1440
Оракул.Доступа к данным.Клиент.Исключение OracleException.Handleerror с(int32 значение errCode, объекта oracleconnection, штат Коннектикут, порядок строки, указателя IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, объект src, логическое bCheck) +69
Оракул.Доступа к данным.Клиент.OracleCommand.ExecuteNonQuery() +6127
Практиковать._По умолчанию.InsertProduct(int32 значение empid в, строку "имя", строки "фамилия") в G:\Practise\Default.aspx.cs:411
Практиковать._Default.grdEmployee_RowCommand(отправитель объекта, GridViewCommandEventArgs e) в G:\Practise\Default.aspx.cs:356
Системы.Веб.Пользовательского интерфейса.WebControls.GridView.OnRowCommand(GridViewCommandEventArgs e) +115
Системы.Веб.Пользовательского интерфейса.WebControls.GridView.HandleEvent(EventArgs e, Boolean causesValidation, String validationGroup) +68
Системы.Веб.Пользовательского интерфейса.WebControls.GridView.OnBubbleEvent(источник объекта, EventArgs e) +95
Системы.Веб.Пользовательского интерфейса.Контроль.RaiseBubbleEvent(источник объекта, EventArgs args) +37
Системы.Веб.Пользовательского интерфейса.WebControls.GridViewRow.OnBubbleEvent(источник объекта, EventArgs e) +121
Системы.Веб.Пользовательского интерфейса.Контроль.RaiseBubbleEvent(источник объекта, EventArgs args) +37
Системы.Веб.Пользовательского интерфейса.WebControls.Кнопка.OnCommand(CommandEventArgs e) +125
Системы.Веб.Пользовательского интерфейса.WebControls.Кнопка.RaisePostBackEvent(String eventArgument) +167
Системы.Веб.Пользовательского интерфейса.WebControls.Кнопка.Системы.Веб.Пользовательского интерфейса.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +10
System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13
System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +36
Системы.Веб.Пользовательского интерфейса.Страницы.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +5563


Информация о версии: Microsoft .NET Framework версия:4.0.30319; ASP.NET версия:4.0.30319.272






Любая помощь будет оценена по достоинству . Заранее спасибо.

4 Ответов

Рейтинг:
2

Member 4679884

Это стоило мне уймы времени.@Record_ID работал для Oracle при удалении и вставке.
Однако обновление не работало, пока я не изменил @ на a : ( надеюсь, это поможет кому-то еще)
Ниже приведен фрагмент текста. Я использовал RowUpdating на gridview.

           <asp:sqldatasource id="ora_test_rec3" runat="server" xmlns:asp="#unknown">
            ConnectionString="<%$ ConnectionStrings:orcl_accrec %>"
            UpdateCommand="update test_rec3 set checkdate=:checkdate
               ,checkamt=:checkamt where   record_id=:record_id"
 
            DeleteCommand="Delete test_rec3 where record_id=@record_id" 
           InsertCommand="insert into test_rec3(invnum,checkdate,checkamt,currdate,record_id)

         values(@invnum,@checkdate,@checkamt,sysdate,seq_test_rec3.nextval);


</asp:sqldatasource>


Чтобы сохранить его прежним, я вернулся и сделал все это ":" вместо того, чтобы "@"

Спасибо,


Рейтинг:
2

Member 13444132

строка sql = "вставить в Employee (EmpId,FirstName,LastName)" +
"значения(:EmpID,:FirstNam',:LastName)";

используя (объекта oracleconnection соед = новый объекта oracleconnection(connString))
{
Коннектикут.Открыть();

using (OracleCommand cmd = new OracleCommand(sql, conn))
{
УМК.Параметры.Добавить("Empid В", OracleDbType.Типа int32).Значение empid в;
УМК.Параметры.Добавить("Имя", OracleDbType.Varchar2).Значение = "имя";
cmd.Parameters.Add("LastName", OracleDbType.Varchar2).Value = фамилия;
УМК.Метод executenonquery();
}
}


CHill60

Этому вопросу уже почти 5 лет, и он уже имеет 3 правильных решения. Все, что вы сделали, это сбросили некоторый код, не объяснив, в чем заключается решение. Придерживайтесь ответов на новые сообщения, где ОП все еще нуждается в помощи, убедитесь, что вы привносите что-то новое в разговор, а не просто сбрасываете неформатированный код без объяснения причин

Patrice T

Простое размещение кода из вопроса не является ответом.

Рейтинг:
1

Visar Uruqi

Oracle имеет другой синтаксис для параметров, чем Sql-Server. Так что используйте : вместо @

using(var con=new OracleConnection(connectionString))
{
   con.open();
   var sql = "insert into users values (:id,:name,:surname,:username)";

   using(var cmd = new OracleCommand(sql,con)
   {
      OracleParameter[] parameters = new OracleParameter[] {
             new OracleParameter("id",1234),
             new OracleParameter("name","John"),
             new OracleParameter("surname","Doe"),
             new OracleParameter("username","johnd")
      };

      cmd.Parameters.AddRange(parameters);
      cmd.ExecuteNonQuery();
   }
}


При использовании именованных параметров в команде OracleCommand имя параметра должно предшествовать двоеточию
(:)
.

http://msdn.microsoft.com/en-us/library/system.data.oracleclient.oraclecommand.parameters.aspx


Рейтинг:
0

rAZHere

//Примечание : В случае Oracele '@EmpID' следует заменить на ':P_EmpID' в sql-запросе. В противном случае это
// выдает ошибку в 'cmd.ExecuteNonQuery()' like 'ORA-00936: отсутствующее выражение'