我在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
答案 0 :(得分:3)
如果读者从true
报告Read()
,那么您的存储过程肯定会返回一行(或多行)。
如果您直接呼叫SP(SSMS等),那么很快就会告诉您是否返回了一行。每列中带空值的行仍为行。两个选项:
例如。如果第一列对于“实际”行必须为非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.Value
或IsDBNull(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的行数。