【问题标题】:Don't update MS Access database with id不要用 id 更新 MS Access 数据库
【发布时间】:2018-12-29 12:36:48
【问题描述】:

我尝试编写一个程序来更新带有 id 的数据。当我为 id 写数字时(例如 id=7),程序运行并正常工作。但是当我编写标签文本并转换为数字时,代码不会更新并引发错误。

这是我的代码:

private void yadda_saxla_update_Click(object sender, EventArgs e)
{
    connect.Open();  
    OleDbCommand cmd = new OleDbCommand();
    cmd.CommandText = "Update Guller set gulun_adi='"+gul_adi.Text+ "', sekil='" + gulun_adi_label.Text + "' where id='"+Convert.ToInt32( id_label.Text)+"'";

    // when i write "id=7" or other number data is update, 
    // but i want update with label text (  Convert.ToInt32( id_label.Text)  )
    // and gives error

    cmd.Connection = connect;
    cmd.ExecuteNonQuery();
    connect.Close();
    disp_data();
}

错误如下:

我能做什么?谢谢...

【问题讨论】:

  • 请将您的语言环境设置为英语,以便您收到的错误消息为英语。在任何情况下,您的代码都容易受到 SQL 注入的影响:不要将值连接到查询字符串中(尤其是从用户输入获得的字符串值)。
  • 只需查看cmd,CommandText 的值就可以看出id=7id='7' 之间的区别,这将是一个很大的提示......

标签: c# database ms-access sql-update


【解决方案1】:

正如其他人在 cmets 中指出的那样,您应该连接用户输入,因为它会为 SQL Injection 提供攻击向量。 (或至少检查有害输入)

我认为,否则解决方案是您应该删除 ' 因为目前该命令当前被解析为 varchar。 这部分where id='"+Convert.ToInt32( id_label.Text)+"'" 变为where id='7' 而不是where id=7

因此,除非您的 ID 存储为 varchar,否则应更改此行

cmd.CommandText = "Update Guller set gulun_adi='"+gul_adi.Text+ "', sekil='" + gulun_adi_label.Text + "' where id='"+Convert.ToInt32( id_label.Text)+"'";

cmd.CommandText = "Update Guller set gulun_adi='"+gul_adi.Text+ "', sekil='" + gulun_adi_label.Text + "' where id="+Convert.ToInt32( id_label.Text);

【讨论】:

  • 什么是SQL注入部分?我知道 SQL 查询。
  • 我的回答中有一个链接,基本上是一种黑客技术。用户输入一个修改您的查询的字符串。
  • 在您的情况下,假设“gul_adi.Text”包含类似“1' Drop Database WhatEver --”的内容,如果您有一个数据库,代码将删除它,最后一部分 - - 将其余部分排除,因此语法是正确的。还会将表中的所有内容设置为 1,这可能是另一个问题。
猜你喜欢
  • 1970-01-01
  • 2012-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-20
  • 2021-06-25
相关资源
最近更新 更多