C# 在C中使用ADO.NET进行登录身份验证#

C# 在C中使用ADO.NET进行登录身份验证#,c#,mysql,winforms,ado.net,C#,Mysql,Winforms,Ado.net,这是我第一次来这里。所以我只想问一个关于在C#中使用ADO.NET进行登录身份验证的问题 就这样 我偶然读到一本名叫《Syngress-SQL注入攻击和防御》的电子书,我对书中给出的例子有点困惑 这是书中的示例代码,我把它与示例混淆了 SqlConnection con = new SqlConnection(ConnectionString); string Sql = "SELECT * FROM users WHERE username=@username" + "AND password

这是我第一次来这里。所以我只想问一个关于在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);因为在VisualStudio2010的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”已经被定义了。” 那么我将使用什么语法来设置参数和提供值呢? 顺便说一下,我正在使用MySQL,它与ADO.NET一起工作

cmd.Parameters.Add("?cashieruser", MySqlDbType.VarChar, 35);
将“?cashieruser”参数添加到cmd对象的参数集合中。由于参数已添加到集合中,因此可以按如下方式设置其值:

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

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

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

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

第二,由于您试图添加两次相同的参数名,因此会出现该异常。如果您使用
add()
方法添加参数,然后使用上面的语法设置应对问题进行排序的值。

在第一个示例中出现错误。参数是使用索引的集合。
正确的语法是:

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条件和查询的第二部分之间没有空格。(这里确实不需要连接字符串。)

您还可以直接在查询中提到变量。像这样

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
            }