Nur*_*kah 1 delphi ado tadoquery
我试图从数据库中一组的值传递到TEdit当在一个项目被选中TComboBox。但是,返回的值应该是字符串,而不是整数。在组的文本字段中,返回的值为 0。谁能帮我解决这个问题?
这是文本字段的代码,它应该根据 a 中选择的项目返回组数据TComboBox:
ADOQuery1.SQL.Clear;
rf := ADOQuery1.SQL.Add('SELECT grouppp FROM f3_sheet WHERE holder = "' +cb1.Text +'"');
gpp.Text := rf;
Run Code Online (Sandbox Code Playgroud)
该TADOQuery.SQL属性是一个TStrings对象。它的Add()方法返回您刚刚添加到列表中的字符串的索引。这就是为什么0在您的示例中返回值是整数的原因。
但这不是你在这种情况下想要的。SQL根据需要填写语句后,您需要通过调用该方法在数据库上实际执行该 SQL TADOQuery.Open(),然后您可以从TADOQuery.Fields集合中读取检索到的字段值,例如:
ADOQuery1.SQL.Text := 'SELECT grouppp FROM f3_sheet WHERE holder = ' + AnsiQuotedStr(cb1.Text, '"');
ADOQuery1.Open;
try
if not ADOQuery1.Eof then
gpp.Text := ADOQuery1.Fields[0].AsString
else
gpp.Text := '';
finally
ADOQuery1.Close;
end;
Run Code Online (Sandbox Code Playgroud)
话虽如此,请注意我如何更改您的 SQL 以使用AnsiQuotedStr()而不是cb1.Text手动用引号括起来。从潜在的原密码遭受SQL注入攻击,如果用户被允许进入任意文本到TComboBox。
例如,如果用户在 中输入类似"; DELETE FROM f3_sheet; --的内容TComboBox,您的原始代码最终将执行此 SQL:
SELECT grouppp FROM f3_sheet WHERE holder = ""; DELETE FROM f3_sheet; --"
Run Code Online (Sandbox Code Playgroud)
您的数据库表的内容将再见!
使TComboBox只读是减轻这种攻击的一种方法,因此只允许您的代码指定不会破坏 SQL 的有效字符串。
使用AnsiQuotedStr()是另一种方式,通过转义用户文本中嵌入的引号,例如:
SELECT grouppp FROM f3_sheet WHERE holder = """; DELETE FROM f3_sheet; --"
Run Code Online (Sandbox Code Playgroud)
现在 SQL 将搜索holder文本字符串的字段,但"; DELETE FROM f3_sheet; --找不到任何结果。
但是,避免此类攻击的最佳方法是首先不要手动创建 SQL 语句,而是使用参数化查询或存储过程。例如,上面的示例可以重写为使用参数,如下所示:
// make sure to set ADOQuery1.ParamCheeck=true beforehand...
ADOQuery1.SQL.Text := 'SELECT grouppp FROM f3_sheet WHERE holder = :PHolder';
ADOQuery1.Parameters.ParamByName('PHolder').Value := cb1.Text;
ADOQuery1.Open;
try
if not ADOQuery1.Eof then
gpp.Text := ADOQuery1.Fields[0].AsString
else
gpp.Text := '';
finally
ADOQuery1.Close;
end;
Run Code Online (Sandbox Code Playgroud)
让数据库为您处理任何引用和转义要求。