ExecuteNonQuery始终返回零。我可以将这个0值用于我的代码验证吗?

时间:2014-10-16 21:32:33

标签: c# oracle oracle11g oracle10g oracle-sqldeveloper

我正在使用下面的c#代码在dba_users表中创建一个oracle用户,我在使用oledbcommand和ExecuteNonQuery。用户在dba_users表中成功创建,但ExecuteNonQuery始终重新调整为“0”

所以我在我的代码中进行验证(IsUserCreated == 0)。我的编码在这里是否正确?

int IsUserCreated= oleCreateUserCommands.ExecuteNonQuery();

if(IsUserCreated==0)
{
//TBD code
Response.write("User Created Successfully");
}

else
{
//TBD Code
Response.write("User creation failed with some error");
}

2 个答案:

答案 0 :(得分:1)

不,基本上。那个0并不意味着什么 - 事实上,它告诉我的主要事情是你可能在某处有SET NOCOUNT ON,或者这是一个没有RETURN的sproc - 否则我会期望1被退回表示1行受影响。无论哪种方式:它并不表示没有错误。没有例外表明没有错误。如果已启用,则返回1作为“是,正好1行已更新”检查是有用的。

答案 1 :(得分:1)

正如马克所说,你不能依赖回报价值。根据我的经验,返回值实际上不一致或不可移植,在不同的数据库和语句类型中,您可以看到-1或0表示非DML成功,0表示0或1表示DML。根据他对SET NOCOUNT ON的评论,Oracle不支持它,它是一个SQL Server功能。

顺便说一下,对于CREATE USER语句,我总是看到-1(我开发了几个桌面数据库工具,并且我已经完成了很多跟踪),尽管我没有多少使用OleDb。我很惊讶你看到0,你应该仔细检查。

无论如何,必须使用异常来处理ExecuteNonQuery和ExecuteScalar及其兄弟的错误情况。否则无法编写健壮的代码。缺乏例外意味着成功。就返回代码而言,除了DML之外,它对于验证确实没用。你如何编写一个可以接受-1,0或1或N作为有效的通用算法?当我知道我发出可能的DML时,我只是检查它,并且需要将行数返回给用户。

  1. 您的代码应位于using块中(ADO中的所有IDisposable类型通常应在using语句中处理)
  2. 你应该试试/赶上或至少试一试/终于
  3. 如果您不想重复自己,请将ExecuteNonQuery包装在您自己的函数中,该函数将处理异常并返回bool true / false。在某些情况下,我喜欢为连接或读者类编写扩展方法。