gpt4 book ai didi

mysql - 使用delphi xe3和mysql数据库进行Sql插入

转载 作者:行者123 更新时间:2023-11-29 13:02:35 26 4
gpt4 key购买 nike

我正在使用 Delphi Xe5 和 ZeosLib 连接到 Web 服务器上的远程数据库。

我正在使用以下代码将记录插入表中。但每次我插入并且名称中有一个 (') 时,我都会收到错误。

该错误表明我的语法错误,变量中的 (') 与 sql 语句混淆。

我该如何解决这个问题。

代码:

  Data.personel.Active:=false;
sqltext:=data.personel.SQL.Text;
data.personel.SQL.Text:='Insert Into personel (name,surname,id_number,gender,company_name,nature_of_business,position_at_company,type_of_post,renumeration,company_size,duties,benefits,document_id,date_created,date_record_added) ' +
'VALUES ('''+name1+''','''+surname+''','''+idnumber+''','''+gender+''','''+companyname+''','''+natureofbusiness+''','''+positionatcompany+''','''+typeofpost+''','''+renumeration+''','''+companysize+''','''+duties+''','''+benefits+''','''+DokID+''',+'''+FormatDateTime('yyyy-mm-dd',Date_Created)+''','''+FormatDateTime('yyyy-mm-dd',Date_added)+''')';
Data.personel.ExecSQL;

我知道我的方法不是最简洁的,但我只需要解决 (') 问题。感谢您的帮助

最佳答案

看在上帝的份上,不要连接 SQL。它为 SQL 注入(inject)打开了大门,并导致像您现在遇到的问题。请改用参数化 SQL 语句(请参阅后面的注释):

data.personel.Active := False;
data.personel.SQL.Text := 'Insert Into personel'#13 +
'(name, surname, id_number, gender, company_name, nature_of_business,'#13 +
'position_at_company, type_of_post, renumeration, company_size,'#13 +
'duties, benefits, document_id, date_created, date_record_added)'#13 +
'values'#13 +
'(:name, :surname, :id_number, :gender, :company_name, :nature_of_business, '#13 +
':position_at_company, :type_of_post, :renumeration, :company_size,'#13 +
':duties, :benefits, :document_id, :date_created, :date_record_added)';
data.personel.ParamByName('name').AsString := name1;
data.personel.ParamByName('surname').AsString := surname;
data.personel.ParamByName('id_number').AsString := idnumber;
data.personel.ParamByName('gender').AsString := gender;
// repeat for remaining values
data.personel.ExecSQL;

注释:

  • SQL 语句每个部分末尾的 #13 是回车符。这样您就不必担心每行开头或结尾的空格。服务器将忽略它们,因为 SQL 语句中额外的空格没有意义。这与在数据库管理工具中测试查询时在每行末尾按 Enter 键相同。

  • 我使用列名称作为参数名称,前面带有 : 表示它是一个参数。这样可以轻松区分哪个与哪个 - :surname 参数与 surname 列一起使用。

  • 如果将 SQL 语句放入其自己的查询组件中,则可以在设计时放入所有 SQL,而不是在运行时提供。这意味着服务器可以缓存已编译的语句,以防您在短时间内再次使用它,如果您在循环中使用它们,则可以使查询执行得更快。您只需更改循环中分配给参数的值,而无需处理 SQL.Text。

  • 因为您的应用程序仅在内部使用且未暴露在网络上,但这并不意味着您应该忽略 SQL 注入(inject)的风险。所需要的只是一名心怀不满的员工决定向您或您的公司报复,并了解这种可能性 - 当他们决定在正确的编辑控件中输入您不想要的内容并删除或更改重要的数据库或表时,损害同样严重。

关于mysql - 使用delphi xe3和mysql数据库进行Sql插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23134704/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com