2012-04-08 54 views
0

這是我第一次在Stackoverflow。所以我只想在C#中使用ADO.NET提出關於登錄驗證的問題。在C#中使用ADO.NET進行身份驗證登錄#

所以就這樣了。

我偶然發現一本名爲「Syngress-SQL Injection Attacks and Defenses」的電子書,我對這本書給出的例子有些困惑。

這裏是書裏面我用的例子混淆示例代碼

SqlConnection con = new SqlConnection(ConnectionString); 
string Sql = "SELECT * FROM users WHERE [email protected]" + "AND [email protected]"; 
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」的一部分,因爲當嘗試代碼沒有參數.Value在我的IDE中給出。

所以我所做的是我使用cmd.Parameters.AddWithValue(「?cashieruser」,cashieruser);比Parameters.Value因爲它不是在Visual Studio 2010

這裏的智能感知發現是我的代碼:

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

回答

1

在你的第一個例子中有一個錯誤。參數是使用索引的集合。
正確的語法是:

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

在第二個例子中,你嘗試添加相同的參數兩次
您可以結合創建並只用一行,允許刪除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。 最後,但這可能是一個錯字。
在您的查詢文本中,第一個條件與第二個查詢部分之間沒有空格。 (實際上這裏沒有必要連接字符串。)

0

代碼

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

將「?cashieruser」參數添加到CMD對象的參數集合的方式,我使用MySQL。由於參數已經被添加到集合,你可以設置是這樣的值:

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

或者,如果你還沒有加入參數與Add方法的集合,你可以使用AddWithValue方法。

0

首先,我認爲你有示例代碼應爲:

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

其次,您獲得的例外,因爲你正試圖添加相同的參數名稱兩次。如果使用Add()方法添加參數,然後使用上面的語法來設置應對問題進行排序的值。

1

您也可以直接在查詢中提及變量。像這樣..

string sQuery = "select * from cashieraccount where cashieruser =" + cashieruser + " and cashierpass =" + cashierpass; 
SqlCommand cmd = new SqlCommand(sQuery, con); 
SqlDataReader dr = cmd.ExecuteReader(); 
      if (dr.Read()) 
      { 
       //Login success code 
      } 
      else 
      { 
       //Login failed code 
      }