0

これは、Stackoverflowでの私の最初のことです。そこで、C#でADO.NETを使用したログイン認証について質問したいと思います。

だからここに行きます。

「Syngress-SQLインジェクションの攻撃と防御」という電子書籍を読んだときに、この本に記載されている例と少し混乱しました。

これが私が例と混同している本からのサンプルコードです

SqlConnection con = new SqlConnection(ConnectionString);
string Sql = "SELECT * FROM users WHERE username=@username" + "AND password=@password";
cmd = new SqlCommand(Sql, con);
// Add parameters to SQL query
cmd.Parameters.Add("@username",              // name
                   SqlDbType.NVarChar,       // data type
                   16);                      // length
cmd.Parameters.Add("@password",
                    SqlDbType.NVarChar,
                    16);
cmd.Parameters.Value["@username"] = username; // set parameters
cmd.Parameters.Value["@password"] = password; // to supplied values
reader = cmd.ExecuteReader();

「cmd.Parameters.Value」の部分と混同しています。コーディングしようとすると、IDEにParameters.Valueが指定されていないためです。

だから私がしたことは、cmd.Parameters.AddWithValue( "?cashieruser"、cashieruser);を使用していることです。Visual Studio 2010のIntelliSenseにないため、Parameters.Valueよりも。

これが私のコードです:

public bool isAuth(String cashieruser, String cashierpass)
{
    bool IsAuth = false;
    con.ConnectionString = conString;
    String sql = "SELECT * FROM cashieraccount WHERE cashieruser = ?cashieruser" + "AND cashierpass = ?cashierpass";
    MySqlCommand cmd = new MySqlCommand(sql, con);

    //Add parameters to SQL Query
    cmd.Parameters.Add("?cashieruser", MySqlDbType.VarChar, 35);
    cmd.Parameters.Add("?cashierpass", MySqlDbType.VarChar, 15);

    cmd.Parameters.AddWithValue("?cashieruser", cashieruser);
    cmd.Parameters.AddWithValue("?cashierpass", cashierpass);
    cmd.ExecuteScalar();

    try
    {
       con.Open();
       MySqlDataReader rdr = cmd.ExecuteReader();
       if (rdr.Read())
       {   
          IsAuth = true;
       }
       else
          IsAuth = false;
    }
    finally
    {
       con.Close();
    }
    return IsAuth;
}

そのため、例外が発生しました:「パラメータ'?cashieruser'はすでに定義されています。」では、パラメーターを設定して値を提供するために、どの構文を使用しますか? ちなみに、私はADO.NETで動作するMySQLを使用しています

4

4 に答える 4

1

最初の例では、エラーがあります。パラメータは、インデックスを使用するコレクションです。
正しい構文は次のとおりです。

cmd.Parameters["@username"].Value = username; // set parameters 
cmd.Parameters["@password"].Value = password; // to supplied values 

2番目の例では、同じパラメーターを2回追加しようとします。
作成と値の設定を1行だけで組み合わせると、AddWithValue行を削除できます。

//Add parameters to SQL Query   
cmd.Parameters.Add("?cashieruser", MySqlDbType.VarChar, 35).Value = cashierUser;   
cmd.Parameters.Add("?cashierpass", MySqlDbType.VarChar, 15).Value = cashierPass;   

また、cmd.ExecuteScalarを削除する必要があります。
接続を開いた後、ExecuteReaderを実行します。最後に、これはおそらくタイプミスです。
クエリテキストでは、クエリの最初のwhere条件と2番目の部分の間にスペースはありません。(実際には、ここで文字列を連結する必要はありません。)

于 2012-04-08T15:39:01.273 に答える
0

まず、あなたが持っているサンプルコードは読むべきだと思います:

cmd.Parameters["@username"].Value = username; // set parameters
cmd.Parameters["@password"].Value = password; // to supplied values

次に、同じパラメータ名を2回追加しようとしているため、この例外が発生します。メソッドを使用してパラメーターを追加してAdd()から、上記の構文を使用して、問題をソートする値を設定する場合。

于 2012-04-08T15:38:45.760 に答える
0

コード

cmd.Parameters.Add("?cashieruser", MySqlDbType.VarChar, 35);

cmd オブジェクトの Parameters コレクションに "?cashieruser" パラメーターを追加します。パラメータはすでにコレクションに追加されているため、次のように値を設定できます。

cmd.Parameters["?cashieruser"].Value = cashieruser;

または、Add メソッドを使用してコレクションにパラメーターをまだ追加していない場合は、AddWithValue メソッドを使用できます。

于 2012-04-08T15:35:38.077 に答える