我正在尝试在Delphi中更新我的数据库,但我没有做对。
我想要的很简单。这是我的代码:
form1.ADOQuery1.SQL.Clear;
form1.ADOQuery1.SQL.Add('Update Table1 set mark=' +Form1.Edit4.Text);
form1.ADOQuery1.ExecSQL;
所以基本上,我想要的是编辑中使用UPDATE
函数进入我的数据库的文本,其中我的数据库表为table1
,字段名为mark
答案 0 :(得分:3)
您的问题中没有足够的信息来提供明确的答案。但是,我可以估计一下。
如果将mark
定义为序数或布尔字段,并且用户在TEdit
中输入适当的数字/布尔值,则显示的内容才能成功。
但是,如果将mark
字段定义为文本字段,则需要将Text
值包装在引号字符中,否则将产生无效的SQL语法。
想象一下,您输入的Text
值为'hello world'
。您的原始SQL语句将最终成为以下内容,这是无效的语法:
Update Table1 set mark=hello world
您需要将文本值换成引号字符:
Update Table1 set mark='hello world'
或者:
Update Table1 set mark="hello world"
例如:
form1.ADOQuery1.SQL.Add('Update Table1 set mark=' + QuotedStr(Form1.Edit4.Text));
或者:
form1.ADOQuery1.SQL.Add('Update Table1 set mark=' + AnsiQuotedStr(Form1.Edit4.Text, #34));
使用像(Ansi)QuotedStr()
这样的函数来避免SQL注入攻击非常重要。这是通过确保输入文本中的任何嵌入引号字符都是转义属性来完成的。否则,如果您只是做了类似的事情:
form1.ADOQuery1.SQL.Add('Update Table1 set mark="' + Form1.Edit4.Text + '"');
用户可以输入类似'"; <arbitrary SQL here>'
的文本值,并真正对您的数据库造成严重破坏。
更安全的方法是使用参数化查询,让ADO为您处理任何必要的SQL格式(确保TADOQuery.ParamCheck
为真):
form1.ADOQuery1.SQL.Clear;
form1.ADOQuery1.SQL.Add('Update Table1 set mark=:Mark');
form1.ADOQuery1.Parameters.ParamByName('Mark').Value := Form1.Edit4.Text;
form1.ADOQuery1.ExecSQL;