【问题标题】:"Number of query values and destination fields are not the same"“查询值和目标字段的数量不一样”
【发布时间】:2016-03-23 15:15:08
【问题描述】:
try
{
        connection.Open();
        OleDbCommand komanda = new OleDbCommand();
        command.Connection = konekcija;
        command.CommandText = "insert into EmployeeData (FirstName,LastName,Pay) values('"+txt_fname.Text+"','"+txt_lname.Text+"','"+txt_pay.Text+"')";
        command.ExecuteNonQuery();
        MessageBox.Show("data saved");
        connection.Close();
}
catch (Exception ex)
{
       MessageBox.Show("error"+ex);
}

【问题讨论】:

  • 我建议使用参数化查询
  • 我假设您的一个文本框中有一个 ' 字符
  • 请在command.ExecuteNonQuery();行设置断点并提供实际command.CommandText值
  • 支付的数据类型是货币

标签: c#


【解决方案1】:

问题的根源在于您实际上并不知道您正在执行什么查询。因为您正在执行用户发送给您的任何代码。

在大多数非边缘情况下,这 似乎“工作得很好”(这就是为什么它经常被忽视的原因),在某些情况下,它会导致查询中出现语法或结构错误(即这里发生了什么),并且在某些情况下,用户会利用它在您的数据库上执行任意代码。

这称为SQL injection 漏洞。

您可以通过使用将用户输入视为值而不是可执行代码的查询参数来纠正此问题。像这样的:

command.CommandText = "insert into EmployeeData (FirstName,LastName,Pay) values(?,?,?)";
command.Parameters.Add("@FirstName", OleDbType.VarChar, 50).Value = txt_fname.Text;
command.Parameters.Add("@LastName", OleDbType.VarChar, 50).Value = txt_lname.Text;
command.Parameters.Add("@Pay", OleDbType.VarChar, 50).Value = txt_pay.Text;
command.ExecuteNonQuery();

请注意,我已经猜到了 OleDbType 和列的大小。根据您的表结构进行必要的调整。

【讨论】:

  • Ole DB 提供程序不支持命名参数 - 您应该在 CommandText 中使用 ?(并确保正如您在此处所做的那样,将参数添加到 @987654326 @按正确顺序收集)
  • 非常感谢您的回复,我已经解决了这个问题,现在我收到““索引或主键不能包含 Null 值”错误”,但对我来说一切似乎都是正确的
  • @Damien_The_Unbeliever:很有趣,无论哪种方式,我都在网上找到示例。诚然,我目前没有机会进行测试。
  • @M.M:该表中的主键似乎不会自动生成值。要么它需要,要么您需要在插入记录时提供一个值。 (通常首选自动生成选项。)
  • command.CommandText ="插入 EmployeeData (FirstName,LastName,Pay) 值(@FirstName,@LastName,@Pay)";我试过这样,只改变这一行代码,就可以了。谢谢大家的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多