大佬教程收集整理的这篇文章主要介绍了无法从 SQL 表中查询字符串,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
当在 TEdit
中选择一个项目时,我试图将组的值从数据库传递到 TComboBox
。但是,返回的值应该是字符串,而不是整数。在组的文本字段中,返回的值为 0。谁能帮我解决这个问题?
这是应该根据在 TComboBox
中选择的项目返回组数据的文本字段的代码:
ADOquery1.sql.Clear;
rf := ADOquery1.sql.Add('SELECT grouppp FROM f3_sheet WHERE holder = "' +cb1.Text +'"');
gpp.Text := rf;
TADOQuery.SQL
属性是一个 TStrings
对象。它的 Add()
方法返回您刚刚添加到列表中的字符串的 index。这就是为什么在您的示例中返回值是整数 0
。
但在这种情况下,这不是您想要的。根据需要填写SQL
语句后,然后需要通过调用TADOQuery.open()
方法在数据库上实际执行该SQL,然后才能读取检索到的字段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;
话虽如此,请注意我如何将您的 SQL 更改为使用 AnsiQuotedStr()
,而不是手动用引号将 cb1.Text
括起来。如果允许用户在 TComboBox
中输入任意文本,您的原始代码会遭受潜在的SQL 注入攻击。
例如,如果用户在 "; deletE FROM f3_sheet; --
中输入类似 TComboBox
的内容,您的原始代码最终将执行此 SQL:
SELECT grouppp FROM f3_sheet WHERE holder = ""; deletE FROM f3_sheet; --"
你的数据库表的内容将会再见!
将 TComboBox
设为只读是减轻这种攻击的一种方法,这样只有您的代码才能指定不会破坏 SQL 的有效字符串。
使用 AnsiQuotedStr()
是另一种方式,通过转义用户文本中嵌入的引号,例如:
SELECT grouppp FROM f3_sheet WHERE holder = """; deletE FROM f3_sheet; --"
现在 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;
让数据库为您处理任何引用和转义要求。
以上是大佬教程为你收集整理的无法从 SQL 表中查询字符串全部内容,希望文章能够帮你解决无法从 SQL 表中查询字符串所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。