C#无法使用ODBC Oracle运行delete语句

时间:2012-06-26 10:45:00

标签: c# asp.net oracle odbc

运行任何类型的删除语句会导致无效语句异常,这是非常奇怪的错误。

我的查询是delete from table where Id = 1。 Id不是主键。我需要运行几个删除语句,它们不使用主键。完全相同的语句在toad上运行。

连接字符串:

<add name="Oracle_xxxxx" connectionString="Driver={Microsoft ODBC for Oracle};Server=
(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=*host*)(PORT=*port*))(CONNECT_DATA=
(SID=*sid*)));Uid=*uid*;Pwd=*pwd*;" providerName="System.Data.Odbc" />

查询运行正常。我真的不想更改连接字符串/驱动程序。

错误讯息:

A first chance exception of type 'System.Data.Odbc.OdbcException' occurred in System.Data.dll
at System.Data.Odbc.OdbcConnection.HandleError(OdbcHandle hrHandle, RetCode retcode)
at System.Data.Odbc.OdbcCommand.ExecuteReaderObject(CommandBehavior behavior, String
method, Boolean needReader, Object[] methodArguments, SQL_API odbcApiMethod)
at System.Data.Odbc.OdbcCommand.ExecuteReaderObject(CommandBehavior behavior, String  
method, Boolean needReader)
at System.Data.Odbc.OdbcCommand.ExecuteReader(CommandBehavior behavior)
at System.Data.Odbc.OdbcCommand.ExecuteReader()
at ClientOnBoarding.COBTrackerDataManager.*function*() in C:\Working\SVN\xx\App_Code\xx.cs:line 928

ERROR [42000] [Microsoft][ODBC driver for Oracle][Oracle]ORA-00900: invalid SQL statement

非常感谢任何帮助!

编辑:我首先运行了ExecuteNonQuery(),然后测试了ExecuteReader(),两者都给了我同样的错误 - 为上面的误导性错误消息道歉。

编辑2:我已多次尝试在Toad上测试我的SQL,没有任何问题。我的更新和插入语句在使用或不使用尾随分号时都可以正常工作。只有删除才给我一个例外。

编辑3:

OdbcCommand cmd = new OdbcCommand("@delete from table where Id = " + param, conn);
//conn is OdbcConnection object with valid connection I use for all other commands. Conn is open. param is a string (which is a number)
try
{
    //cmd.ExecuteReader();//was testing both
    cmd.ExecuteNonQuery();
}//end try
catch (Exception e)
{
    System.Diagnostics.Debug.WriteLine(e.StackTrace);
    System.Diagnostics.Debug.WriteLine(e.InnerException);
    System.Diagnostics.Debug.WriteLine(e.Message);
}//end catch

2 个答案:

答案 0 :(得分:1)

从错误消息看起来它是一个sql语句错误,与.NET无关。尝试直接在oracle中运行此查询。另外,我认为在Oracle中你需要“;”最后delete from table where Id = 1;,还要确保Id或表名不是关键字

答案 1 :(得分:1)

好的家伙觉得自己像个白痴...... @符号是在报价之后而不是之前...

OdbcCommand cmd = new OdbcCommand("@delete from table where Id = " + param, conn);

应该是

OdbcCommand cmd = new OdbcCommand(@"delete from table where Id = " + param, conn);