我正在使用下面的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");
}
答案 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时,我只是检查它,并且需要将行数返回给用户。
如果您不想重复自己,请将ExecuteNonQuery包装在您自己的函数中,该函数将处理异常并返回bool true / false。在某些情况下,我喜欢为连接或读者类编写扩展方法。