C# ExecuteOnQuery始终返回零。我可以在代码中使用此0值进行验证吗?

C# ExecuteOnQuery始终返回零。我可以在代码中使用此0值进行验证吗?,c#,oracle,oracle11g,oracle10g,oracle-sqldeveloper,C#,Oracle,Oracle11g,Oracle10g,Oracle Sqldeveloper,我使用下面的c代码在dba#U users表中创建一个oracle用户,其中我使用的是oledbcommand和ExecuteOnQuery。正在dba_users表中成功创建用户,但ExecuteOnQuery始终将值重新运行为“0” int IsUserCreated= oleCreateUserCommands.ExecuteNonQuery(); if(IsUserCreated==0) { //TBD code Response.write("User Created Success

我使用下面的c代码在dba#U users表中创建一个oracle用户,其中我使用的是oledbcommand和ExecuteOnQuery。正在dba_users表中成功创建用户,但ExecuteOnQuery始终将值重新运行为“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");
}
因此,我在代码中以(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并不意味着什么-事实上,它告诉我的主要事情是,您可能在某个地方设置了
NOCOUNT,或者这是一个没有
返回的存储过程
-否则我希望返回1以指示1行受影响。无论哪种方式:它都不表示没有错误。缺少异常表示缺少错误。如果启用,返回1作为“是的,正好有一行更新了”检查很有用。

正如Marc所说,您不能依赖返回值。在不同的数据库和语句类型中,返回值实际上不一致或不可移植。根据我的经验,对于非DML,返回值为-1或0表示成功,对于DML,返回值为0、1或更大。根据他关于
设置NOCOUNT ON
的评论,Oracle不支持这一点,这是SQL Server的一项功能

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");
}
顺便说一句,对于CREATEUSER语句,我总是看到-1(我开发了几个桌面数据库工具,并且做了很多跟踪),尽管我很少使用OleDb。我很惊讶你看到了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");
}
无论如何,必须使用异常来处理ExecuteOnQuery和ExecuteScalar及其同级的错误情况。否则就不可能编写健壮的代码。没有例外意味着成功。至于返回代码,除了在DML中,它对于验证来说真的是无用的。如何编写一个可以接受-1、0或1或N为有效的通用算法?当我知道我发出了一个可能的DML,并且需要将行数返回给用户时,我只需检查它

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");
}
  • 代码应该在using块中(ADO中的所有IDisposable类型通常都应该在using语句中处理)
  • 你应该试一试,或者至少试一试

  • 若您不喜欢重复自己的操作,那个么将ExecuteOnQuery封装在您自己的函数中,该函数将处理异常并返回bool true/false。在某些情况下,我喜欢为connection或reader类编写扩展方法。

    我认为应该检查是否存在异常。返回值应该是受影响的行数。我只是用c#对查询进行硬编码,而不是使用存储过程。这个案子的零是正确的吗?@selva我不能告诉你它是否正确,因为我不知道你的全部设置。这可能意味着“没有行被更新/删除/插入”;这可能意味着“您的db提供程序没有为此提供有用的值”;这可能意味着“
    已启用对
    (或等效项)设置无计数”;这可能意味着您在插入/更新/删除并重置行数之后执行了其他操作。在上述任何情况下,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");
    }