的ExecuteNonQuery总是返回零。 我可以用这个值为0到我的验证代码?(Execute

2019-10-21 03:41发布

我用下面的C#代码,我现在用的OleDbCommand和的ExecuteNonQuery创造DBA_USERS表中的Oracle用户。 用户在DBA_USERS表被成功创建,但的ExecuteNonQuery总是retun值为“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");
}

Answer 1:

没有,基本上是这样。 这0没有多大的意义-事实上,它告诉我,最主要的是,你可能已经SET NOCOUNT ON的地方,或者这是没有一个存储过程RETURN -否则我会想到1返回到显示1行的影响。 无论哪种方式:它并不表示没有错误的。 缺乏一个异常的指示没有错误的。 回到1是有用的“是的,没错1行已更新”复选框,如果启用它。



Answer 2:

正如马克说,你不能靠返回值。 返回值是实际不相符或随身携带,在不同的数据库和语句类型您可能会看到-1或0成功非DML,和0,1或更大的DML,以我的经验。 按他的意见左右SET NOCOUNT ON ,Oracle不支持,它是一个SQL Server功能。

顺便说一下,一个CREATE USER语句中,我总是看到-1(我开发多种桌面数据库工具,我已经做了跟踪的很多),虽然我不使用OleDb的多。 我很惊讶你看0,您应该仔细检查。

无论如何,你必须使用异常处理错误情况进行的ExecuteNonQuery和的ExecuteScalar和它的兄弟姐妹。 这是不可能的,否则写健壮的代码。 缺乏例外意味着成功。 至于返回代码,它是检验真没用,除了在DML。 你如何写一个通用的算法,可以接受-1,0或1或N是有效的? 我简单地检查它,当我知道我发出了一个可能的DML,以及需要返回的行数给用户。

  1. 您的代码应在使用块(在所有ADO的IDisposable类型通常应该被设置在使用语句)
  2. 你应该有一个try / catch或至少一个try /终于

如果你不喜欢重复自己,然后在自己的函数,将处理异常,并返回一个布尔真/假包的ExecuteNonQuery。 在某些情况下,我喜欢写在连接或读取器类的扩展方法。



文章来源: ExecuteNonQuery always returns zero. Can i use this 0 value into my code for validation?