2

私は文字通り行を持たないSQLのテーブルを持っていますが、それを読むと少なくとも1回はリーダーを通過します.

            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 行が null で、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 など)、行が返されるかどうかがすぐにわかります。すべての列に NULL がある行は、依然として行です。2 つのオプション:

  • 行を誤って返さないようにSPを修正します(変数を選択していると思います。次に変数を選択すると、常に行が生成されます)
  • 不可能なデータを無視するようにリーダー コードを変更する

例えば。「実際の」行の最初の列が非 null でなければならない場合は、単純に次のようにします。

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

最初のセルが null の場合、行は無視されます。

于 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

最初- がありません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 に答える
1

DBNull.ValueまたはIsDBNull(column_ordinal)メソッドを使用して、特定の列の値が null かどうかをテストできます。

于 2012-07-31T11:01:42.737 に答える