2017-08-03 93 views
0

即使我输入了正确的用户凭证,也会显示无效的用户凭证。我不知道我是否使参数错误或者如果我的查询错误。我想了解参数化查询,但我不知道我在这里做错了什么。MySQL参数化查询中的用户凭证无效

con.OpenConnection(); 

     using (con.connection) 
     { 
      String query = "SELECT * FROM tblUser WHERE Username = @Username and Password = @Password"; 
      try 
      { 
       MySqlCommand cmd = new MySqlCommand(query, con.connection); 
       cmd.Parameters.Add("@Username", MySqlDbType.VarChar).Value = txtUsername.Text; 
       cmd.Parameters.Add("@Password", MySqlDbType.VarChar).Value = txtPassword.Text; 
       cmd.ExecuteNonQuery(); 
       DataTable dt = new DataTable(); 
       MySqlDataAdapter da = new MySqlDataAdapter(cmd); 
       da.Fill(dt); 
       i = Convert.ToInt32(dt.Rows.Count.ToString()); 

       if (i == 0) 
       { 
        MessageBox.Show("Invalid user credentials."); 
       } 
       else 
       { 
        //Do stuff 
       } 
      } 
      catch (MySqlException mse) 
      { 
       MessageBox.Show(mse.Message); 
      } 

      finally 
      { 
       con.CloseConnection(); 
      } 
+1

你能分享你所得到的异常信息? – hbulens

+0

其中是'i'定义..也是一个字符串或整数.. 'i = Convert.ToInt32(dt.Rows.Count.ToString());' 如果我是一个整数,那么你不需要做转换只需设置i =这样的计数 'var i = dt.Rows.Count;' – MethodMan

+0

@hbulens我没有收到异常消息。我认为用我写的代码if语句返回true,因为它不符合参数。我无法确定。 – Alpha

回答

0

不知道为什么它不起作用,但如果你使用AddWithValue,它将工作。这样

cmd.Parameters.AddWithValue("@Username", txtUsername.Text); 
cmd.Parameters.AddWithValue("@Password", txtPassword.Text); 
+0

我已经尝试过这种方式,但它对我无效 – Alpha

+0

AddWithValue()可能会产生意想不到的性能损失。一般来说最好是明确你的参数类型。 –

0
东西

更改您的代码,以便它调用的方法,当你点击一个按钮,用户名和密码变量传递到这个方法。在类级别创建用户名和密码AutoProperty

private DataTable PopulateSomeDatatSet(DataSet aDataset, string UserName, string Password) 
{ 
    var query = "SELECT * FROM tblUser WHERE Username = @Username and Password = @Password"; 
    MySqlDataAdapter sda; 
    using (SqlConnection connStr = new SqlConnection(ConnString)) //replace with your ConnectionString Variable 
    { 
     using (MySqlCommand cmd = new MySqlCommand(query, connStr)) 
     { 
      cmd.CommandType = CommandType.Text; 
      cmd.Parameters.Add("@Username", MySqlDbType.VarChar).Value = UserName; 
      cmd.Parameters.Add("@Password", MySqlDbType.VarChar).Value = Password; 
      sda = new MySqlDataAdapter(cmd); 
      new MySqlDataAdapter(cmd).Fill(aDataset); 
     } 
    } 
    ((IDisposable)sda).Dispose(); 
    return aDataset.Tables[0]; 
} 
+0

是这样的? String user = txtUsername.Text; String pass = txtPassword.Text; DataSet ds = new DataSet(); i = PopulateSomeDatatSet(adaset,user,pass).Rows.Count; – Alpha

+0

为什么要将MySqlDataAdapter转换为IDiposable?为什么不直接调用它呢?你为什么不把它放在finally块或使用'using'语句中? – mason

0

如果您正在使用第三方库找到,你可以试试这个与MySQL.Simple。这将有更少的代码和较小的功能和转换有错误。

首先需要声明的数据库

using (Database con = ConnectionString) 

你可以声明你的SQL作为

String query = "SELECT * FROM tblUser WHERE Username = $0 and Password = $1"; 

现在里面你尝试块你可以有:

using (var data = con.QuerySingle(query, txtUsername.Text, txtPassword.Text)){ 
    if (data) { // if any rows were returned 
     string username = data["username"]; // fetches username with GetString() 
     // do something 
    } 
    else { 
     MessageBox.Show("Invalid user credentials."); 
    } 
} 

如果你不想传递数字查询字符串并且想要确保用户名和密码到正确的地方,您可以创建如下条件。

var c = new Conditioner(); 
var conditionUsername = c["Username", txtUsername.Text]; 
    // creates a condition variable that compares the db field Username to the text value 
var conditionPassword = c["Password", txtPassword.Text]; 

现在你可以创建自己的数据变量,如下所示:

using (var data = con.From("tblUser") 
       .WhereConditional(conditionUsername.And(conditionPassword) 
       .QuerySingle());