【问题标题】:C# MySql Unknown column in where clauseC# MySql 在 where 子句中的未知列
【发布时间】:2018-10-30 13:40:48
【问题描述】:

在我尝试从txt_Username 文本框中的给定用户名在 dataGrid 中输出密码后,我收到以下错误消息:

MySql.Data.MySqlClient.MySqlException:“'where 子句'中的未知列'Test'”

MySqlDataAdapter da = new MySqlDataAdapter("Select Password from tbl_anmeldedaten Where Username=" + txt_Username.Text, con);
da.SelectCommand.CommandType = CommandType.Text;
DataTable dt = new DataTable();
da.Fill(dt);
dataGridView1.DataSource = dt;

【问题讨论】:

  • 使用参数化查询

标签: c# mysql


【解决方案1】:

错误的确切原因是您正在尝试执行以下查询:

SELECT Password
FROM tbl_anmeldedaten
WHERE Username = Test;

看起来Test 应该有单引号吗?是的,它应该,并且您可以将它添加到您的原始查询中。但是,在 C# 中连接这样的查询会留下 SQL 注入的可能性。更好的方法是使用准备好的语句:

string sql = "SELECT Password FROM tbl_anmeldedaten WHERE Username = @val1";
MySqlCommand cmd = new MySqlCommand(sql, MySqlConn.conn);
cmd.Parameters.AddWithValue("@val1", txt_Username.Text);
cmd.Prepare();
MySqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read()) 
{
    // consume a record in the result set
}

【讨论】:

【解决方案2】:

您正在使用作为 SQL 注入攻击向量的字符串连接。也许文本字段中的用户名正在执行一些不应该被允许的 SQL(例如 '' OR Test=1。有很多资源可以使用参数化查询来解决问题。

【讨论】:

猜你喜欢
  • 2017-06-05
  • 2021-09-19
  • 2018-04-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多