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); 比 Parameters.Value 因为它在 Visual Studio 2010 的 IntelliSense 中找不到。

这是我的代码:

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 

在第二个示例中,您尝试两次添加相同的参数
您可以将创建和值设置与仅允许删除 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 条件和查询的第二部分之间没有空格。(真的没有必要在这里连接字符串。)

于 2012-04-08T15:39:01.273 回答
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
            }
于 2017-11-07T06:17:08.127 回答
0

编码

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

将“?cashieruser”参数添加到 cmd 对象的参数集合中。由于参数已经添加到集合中,您可以像这样设置它的值:

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

或者,如果您尚未使用 Add 方法将参数添加到集合中,则可以使用 AddWithValue 方法。

于 2012-04-08T15:35:38.077 回答
0

首先,我认为您应该阅读的示例代码:

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

其次,您遇到了该异常,因为您尝试添加相同的参数名称两次。如果您使用该Add()方法添加参数,然后使用上面的语法设置应该对您的问题进行排序的值。

于 2012-04-08T15:38:45.760 回答