12

次のコードは、SQLデータベースからユーザー情報を取得するために使用しているものです。

            string userName = LoginUser.UserName;
            string password = LoginUser.Password;
            string comm = "SELECT Username,Password,Clientname,Role FROM Users WHERE Username = '" + userName + "';";
            bool rememberUserName = LoginUser.RememberMeSet;

            SqlConnection conn = new SqlConnection(connstring);
            conn.Open();

            SqlCommand command = new SqlCommand(comm, conn);
            SqlDataAdapter da = new SqlDataAdapter(command);
            DataTable dt = new DataTable();
            da.Fill(dt);
            DataRow dr = dt.NewRow();
            if (dt != null)
            {
                //logic
            }

ただし、LoginUser.Usernameと等しいユーザー名を持つエントリがデータベースにない場合、(dt!= null)はfalseを返しません。sqlコマンドが成功したかどうかを確認する別の方法はありますか?

4

7 に答える 7

36

DataTable一致するレコードがない場合は空になるため、返されたレコードの数を確認できます。

if (dt.Rows.Count > 0)

そして、少しトピックから外れて、あなたの質問の下のコメントを読んでから、グーグルでSQLインジェクションとパラメータ化されたSQLステートメントという用語を読んでください。これから始めてみてください

于 2012-09-10T20:31:36.140 に答える
13

ステートメントを少し変更して、DataTableがnullであるか、行がないかを確認してみませんか。

if(dt != null && dt.Rows.Count > 0)

また、補足として、SQLを動的に構築するのではなく、パラメータ化されたクエリも調べる必要があります。これにより、アプリケーションを危険にさらそうとする攻撃者の攻撃ベクトルの数が減ります。

于 2012-09-10T20:31:28.310 に答える
2

C#6.0以降では、Null条件演算子 ?.(または?[]配列)を使用できます。

null条件演算子は、ステートメントを次のように単純化します。

if (dt?.Rows?.Count > 0)

これは、次の場合にfalseを返します。

  1. データテーブルdtがnull
  2. データテーブルの行dt.Rowsがnullです
  3. 行数dt.Rows.Countは0です

null条件演算子を使用すると、データテーブルとカウントプロパティの両方を手動でチェックすることを回避できます。if (dt != null && dt.Rows.Count > 0)

于 2019-03-17T18:48:43.110 に答える
1

DataTableを使用しているように見えますが、SqlDataAdapterはタスクに対して少し重すぎます。

ここでDataReaderを使用できます。

        SqlCommand command = new SqlCommand(comm, conn);
        using (var reader = command.ExecuteQuery()) 
        {
            if (reader.Read())
            {
                //logic
                var userName = reader.GetString(0);
                var password = reader.GetString(1);
                // etc
            }
        }
于 2012-09-10T21:01:33.837 に答える
0

try catchテーブルが空かどうかのチェックに使用すると、IndexOutOfRangeException例外を処理するだけでよいでしょう。

次のロジックを使用します。

try
{
   //dataTable operations
}
catch(IndexOutOfRangeException)
{
}

私にとってはその働き。

于 2013-11-29T16:58:32.520 に答える
0

あなたはこのDataSetようにチェックすることができます:

if (ds.Tables[0].Rows.Count > 0)
于 2018-10-03T10:27:54.693 に答える
0

私はこの質問が古いことを知っており、回答は公開された時点で役に立ちましたが、次のように今すぐこれを解決する簡単な方法があります。

if ((dataTableName?.Rows?.Count ?? 0) > 0)
于 2019-02-25T20:25:38.327 に答える