C# reader.Read()将布尔值计算为true或false

C# reader.Read()将布尔值计算为true或false,c#,ado.net,C#,Ado.net,假设我有以下c代码: 假设假想的SQL查询返回符合查询条件的行(如果存在)。如果我运行这段代码,而数据库中没有符合条件的内容,那么该方法的计算结果应该为false,对吗?换句话说,如果查询返回一个空结果,它将计算为false,但是如果它返回行,它将计算为true 感谢您正在执行,其返回值记录如下: 如果有更多行,则为true;否则就错了 如果查询返回0行,它将立即返回false。您的F5键也可以告诉您这一点。;-) 您正在执行,其返回值记录如下: 如果有更多行,则为true;否则就错了 如果查询

假设我有以下c代码:

假设假想的SQL查询返回符合查询条件的行(如果存在)。如果我运行这段代码,而数据库中没有符合条件的内容,那么该方法的计算结果应该为false,对吗?换句话说,如果查询返回一个空结果,它将计算为false,但是如果它返回行,它将计算为true

感谢您正在执行,其返回值记录如下:

如果有更多行,则为true;否则就错了

如果查询返回0行,它将立即返回false。您的F5键也可以告诉您这一点。;-)

您正在执行,其返回值记录如下:

如果有更多行,则为true;否则就错了


如果查询返回0行,它将立即返回false。您的F5键也可以告诉您这一点。;-)

是的,您是正确的。您还可以使用属性而不是读取方法

return reader.HasRows;

是的,您是正确的。您还可以使用属性而不是读取方法

return reader.HasRows;
你的方法

private bool MethodName(string inviteId)
{
  var command = new SqlCommand
  {
    CommandText = "SELECT statement goes here",
    Connection = conn
  } ;
  var reader = command.ExecuteReader();
  return reader.Read();
}
虽然它确实返回一个true/false值,指示sql查询是否检索任何行,但它使数据读取器、命令和连接挂起

SqlDataReader上有等待读取的行

从方法退出时,SqlCommand和SqlDataReader将超出范围。它们最终将被垃圾收集,但在它们被收集之前:

  • 连接已锁定,因为它有一个正在执行的命令。这意味着,在处理SqlCommand和SqlDataReader并进行垃圾回收之前,其他人无法使用它。这可能需要一段时间

  • 您的SQL Server实例在连接的SPID上有挂起的读取,这意味着它有未完成的锁。这最终会导致数据库阻塞,而您的DBA会脾气暴躁

SqlConnection
SqlCommand
等都可以
IDisposable
。这意味着您可以使用with
with
,以确保正确处置它们,并且在它们超出范围时释放它们所持有的所有资源。此外,
SqlConnection
在默认情况下是池化的,这意味着您通常应该打开连接,进行工作,然后立即关闭它,从而将其返回到池中供其他使用

所以…如果您试图做的是检查数据库中是否存在条件,那么可以这样做,利用上面的信息。代码更干净,您也不会因为试图弄明白为什么SQL server上似乎有幽灵SPID而阻塞其他用户而感到毛骨悚然:

static bool ConditionExists( string someParameterValue )
{
  bool exists ; // our return value

  const string query = @"
    select convert(bit,sign(count(*)))
    from foo t
    where t.someColumn = @p1
    " ;
  string connectionString = GetConnectionString() ;

  using ( SqlConnection connection = new SqlConnection(connectionString) )
  using ( SqlCommand    cmd        = connection.CreateCommand() )
  {
    cmd.CommandText = query ;
    cmd.CommandType = CommandType.Text;
    connection.Open() ;
    exists = (bool) cmd.ExecuteScalar() ;
    connection.Close() ;
  }

  return exists ;
}
编辑说明:
使用
不会进行垃圾收集。C#中的垃圾收集器是不确定的:系统决定垃圾收集器何时运行以及其强度
使用
确保在引用超出范围时调用
IDisposable
对象的
Dispose()
方法。除非您在处理对象时显式调用
Dispose()
,允许
IDisposable
释放它所持有的资源,而
Dispose()
最终将在垃圾收集器清理对象实例时被调用,这可能需要很长一段时间……同时,还有所持有的资源,可能会导致其他对象/进程等出现问题

而构造

using ( Widget foo = new Widget() )
{
  DoSomethingUseful() ;
}
Widget foo ;
try
{
  foo = new Widget() ;
  DoSomethingUseful() ;
}
finally
{
  foo.Dispose() ;
}
与构造[几乎]完全等效

using ( Widget foo = new Widget() )
{
  DoSomethingUseful() ;
}
Widget foo ;
try
{
  foo = new Widget() ;
  DoSomethingUseful() ;
}
finally
{
  foo.Dispose() ;
}
(除了<代码>使用<代码>限定变量的范围外),但是为什么您要执行<代码>尝试<代码>/<代码>最终所需的所有额外键入操作,而不是使用<代码>所需的简洁的<代码>方法?

private bool MethodName(string inviteId)
{
  var command = new SqlCommand
  {
    CommandText = "SELECT statement goes here",
    Connection = conn
  } ;
  var reader = command.ExecuteReader();
  return reader.Read();
}
虽然它确实返回一个true/false值,指示sql查询是否检索任何行,但它使数据读取器、命令和连接挂起

SqlDataReader上有等待读取的行

从方法退出时,SqlCommand和SqlDataReader将超出范围。它们最终将被垃圾收集,但在它们被收集之前:

  • 连接已锁定,因为它有一个正在执行的命令。这意味着,在处理SqlCommand和SqlDataReader并进行垃圾回收之前,其他人无法使用它。这可能需要一段时间

  • 您的SQL Server实例在连接的SPID上有挂起的读取,这意味着它有未完成的锁。这最终会导致数据库阻塞,而您的DBA会脾气暴躁

SqlConnection
SqlCommand
等都可以
IDisposable
。这意味着您可以使用with
with
,以确保正确处置它们,并且在它们超出范围时释放它们所持有的所有资源。此外,
SqlConnection
在默认情况下是池化的,这意味着您通常应该打开连接,进行工作,然后立即关闭它,从而将其返回到池中供其他使用

所以…如果您试图做的是检查数据库中是否存在条件,那么可以这样做,利用上面的信息。代码更干净,您也不会因为试图弄明白为什么SQL server上似乎有幽灵SPID而阻塞其他用户而感到毛骨悚然:

static bool ConditionExists( string someParameterValue )
{
  bool exists ; // our return value

  const string query = @"
    select convert(bit,sign(count(*)))
    from foo t
    where t.someColumn = @p1
    " ;
  string connectionString = GetConnectionString() ;

  using ( SqlConnection connection = new SqlConnection(connectionString) )
  using ( SqlCommand    cmd        = connection.CreateCommand() )
  {
    cmd.CommandText = query ;
    cmd.CommandType = CommandType.Text;
    connection.Open() ;
    exists = (bool) cmd.ExecuteScalar() ;
    connection.Close() ;
  }

  return exists ;
}
编辑说明:
使用
不会进行垃圾收集。C#中的垃圾收集器是不确定的:系统决定垃圾收集器何时运行以及其强度
使用
确保在引用超出范围时调用
IDisposable
对象的
Dispose()
方法。除非在处理对象时显式调用
Dispose()
,允许
IDisposable
释放它所持有的资源,