2

我在 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 行是否为空并且不执行 Counter

编辑

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

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

4 回答 4

3

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

如果您直接调用 SP(SSMS 等),它将很快告诉您是否返回了一行。每一列都为空的行仍然是一行。两种选择:

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

例如。如果“真实”行的第一列必须为非空,则只需:

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

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

于 2012-07-31T11:16:20.120 回答
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 () );
于 2012-07-31T11:18:48.983 回答
1

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

于 2012-07-31T11:01:42.737 回答
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 的行数。

于 2012-07-31T13:04:29.200 回答