2012-04-08 83 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 
      }