0
public bool ValidateUser(string uName)
{
  SqlCommand cmd = new SqlCommand();
  if (connection == null)
  {
    connection = connectToDB();
  }
  cmd.Connection = connection;
  cmd.CommandText = "Select * from Users where UserName='" + uName + "'";
  cmd.CommandType = CommandType.Text;
  SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
  if (dr.Rows.Count > 0) 
  {
    return true;
  }
  else
  {
    return false;
  }

データ アクセス レイヤーにコードを書きましたが、列をカウントするために行でエラーが発生していました。

エラー:

'System.Data.SqlClient.SqlDataReader' には 'Rows' の定義が含まれておらず、タイプ 'System.Data.SqlClient.SqlDataReader' の最初の引数を受け入れる拡張メソッド 'Rows' が見つかりませんでした (using ディレクティブがありませんか?またはアセンブリ参照?)

4

3 に答える 3

3

プロパティ call がないHasRowsため、代わりに使用してください。SqlDataReaderRows

if (dr.HasRows) 
{
    return true;
}

ただし、代わりにカウントが必要な場合は、データテーブルにロードできます

DataTable dt = new DataTable();
dt.Load(dr);
int num = dt.Rows.Count;
于 2013-09-06T15:16:21.890 に答える
1

SqlDataReader には Rows プロパティはありません。
しかし、あなたのコードには多くの問題があります。
この方法でコードを変更します。

    public bool ValidateUser(string uName)
    {
        using(SqlConnection cn = connectToDB())
        using(SqlCommand cmd = new SqlCommand("Select count(*) from Users where UserName=@name", cn))
        {
           cmd.Parameters.AddWithValue("@name", uName);
           return (Convert.ToInt32(cmd.ExecuteScalar()) > 0)
        }
    }
  • 接続オブジェクトはもはやグローバルではなく、using ステートメントを閉じると破棄されます。
  • ユーザーが存在するかどうかを調べるためだけに DataReader を使用する必要はありません
  • パラメーター化されたクエリを使用して、入力データに対する SQL インジェクションを回避する

グローバル接続オブジェクトは避けてください。パフォーマンスの問題を取り除く接続プーリングインフラストラクチャがあり、過剰なリソースの使用から保護されます。
SqlDataReader は、大量のレコードを順番に取得する必要がある場合に適していますが、ユーザーが存在するかどうかの情報だけを取得するには、ExecuteScalarメソッドと適切な SQL を使用するのが最善の方法です。
パラメータ化されたクエリは、すべての重要なデータベース作業に必須です。入力をフレームワークにフォーマットする作業を渡すため、 SQL インジェクションのリスクはありません。

于 2013-09-06T15:20:27.253 に答える