Sql reader正在读取空行?

时间:2012-07-31 10:57:55

标签: c# sql-server-2008 .net-2.0

我在SQL中有一个表,它实际上没有行但只有一行表示null(我猜是默认情况下)现在如果我读它,它至少会通过读者一次,这就是我想要做的。

            int Count = 0;

            SqlCommand cmd1 = new SqlCommand("Exists", conn);
            cmd1.CommandType = CommandType.StoredProcedure;
            cmd1.Parameters.Add(new SqlParameter("@Url", URL));
            SqlDataReader rdr1 = cmd1.ExecuteReader();


            if (rdr1.Read())
            {
                Count++;
            }

如何检查Rdr行是否为空并且不执行计数器

修改

存储过程(我不允许对其进行更改)

CREATE PROCEDURE [dbo].[Exists]
(
    @Url varchar(255)
)
AS
    SET NOCOUNT ON;
SELECT COUNT(*) AS Rows FROM Instances 
WHERE Url = @Url

4 个答案:

答案 0 :(得分:3)

如果读者从true报告Read(),那么您的存储过程肯定会返回一行(或多行)。

如果您直接呼叫SP(SSMS等),那么很快就会告诉您是否返回了一行。每列中带空值的行仍为行。两个选项:

  • 修复SP,使其不会错误地返回行(我猜它是在选择变量。然后选择变量:总会产生一行)
  • 更改阅读器代码以忽略不可能的数据

例如。如果第一列对于“实际”行必须为非null,则只需:

if(!reader.IsDBNull(0)) Count++;

如果第一个单元格为空,则忽略该行。

答案 1 :(得分:2)

相反使用读者为什么不使用ExecuteScaler()?这是从数据库中检索单个值的更好选择。

如果有特殊要求使用读者,那么您需要检查

if( reader.Read() ==true && reader[0] !=DBNull.Value)
{
count++;
} 

这是你如何使用ExecuteScalar:如果在数据库中找不到任何内容,那么它将返回0。

             int Count = 0;
            using (SqlConnection conn = new SqlConnection ( " Your ConnectionString" ))
            {

                using (SqlCommand cmd1 = new SqlCommand ( "Exists", conn ))
                {

                    cmd1.CommandType = CommandType.StoredProcedure;
                    cmd1.Parameters.Add ( new SqlParameter ( "@Url", URL ) );

                    conn.Open ();

                    if( Convert.ToInt32 ( cmd1.ExecuteScalar () ) > 0 )
                    {
                        Count +=1;
                    }
                    conn.Dispose ();

                }
            }

如果没有特定要求使用Count+=1;,那么以下行将用作击球手

Count = Convert.ToInt32 ( cmd1.ExecuteScalar () );

答案 2 :(得分:1)

您可以使用DBNull.ValueIsDBNull(column_ordinal)方法测试特定列的值是否为空。

答案 3 :(得分:1)

首先 - 您错过了Memory Management。代码应如下所示......

int Count = 0;
using (SqlCommand cmd1 = new SqlCommand("Exists", conn))
{
    cmd1.CommandType = CommandType.StoredProcedure;
    cmd1.Parameters.Add(new SqlParameter("@Url", URL));
    using (SqlDataReader rdr1 = cmd1.ExecuteReader())
    {
        if (rdr1.Read())
        {
            Count++;
        }
    }
}

Count将始终返回0记录或大于0的内容。因此,您将始终收到一行,该行将包含特定URL的行数。