- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在撕扯我的头发!!
即使是像这样简单的事情:
procedure MyAdoQueryTest();
const MYSQL_CONNECT_STRING='Driver={MySQL ODBC 5.1 Driver};Server=%s;Port=3306;Database=%s;User=%s;Password=%s;Option=3;';
var AdoConnection : TADOConnection;
ADOQuery : TADOQuery;
Param : TParameter;
begin
AdoConnection := TADOConnection.Create(Nil);
AdoConnection.ConnectionString := Format(MYSQL_CONNECT_STRING,['localhost',
'mysql',
'root',
'']);
AdoConnection.LoginPrompt := False;
AdoConnection.Connected := True;
ADOQuery := TADOQuery.Create(Nil);
ADOQuery.Connection := AdoConnection;
ADOQuery.Sql.Clear();
ADOQuery.SQl.Add('SHOW :what_to_show');
Param := ADOQuery.Parameters.ParamByName('what_to_show');
Param.DataType := ftString;
Param.Value := 'databases';
ADOQuery.Prepared := true;
ADOQuery.Active := True;
end;
(顺便说一句,我真的需要使用“Param”变量和 3 个语句,还是可以只使用“ADOQuery.Parameters.ParamByName('what_to_show').Value := 'databases';?”
无论如何,当我运行它时,我在 ADOQuery.SQl.Add('SHOW :what_to_show');
处遇到异常,其中显示“参数类型错误,超出了可接受的范围”范围或相互冲突”。
我想做的是创建 2 个中心函数:一个接受并执行任何不会返回任何数据的 SQL 语句(例如 INSERT INTO),另一个会接受并执行任何数据(例如 SELECT)。
我目前仅使用 AdoConnection,但现在尝试使用 AdoQuery,因为我想参数化我的 SQL 语句以处理带引号的字符串。
我可以有halpz吗?
最佳答案
错误在这里:
ADOQuery.SQl.Add('SHOW :what_to_show');
:Param
只能用于值,不能用于动态列/关键字/表/数据库名称。
这是因为,如果它像这样工作,您将面临 SQL 注入(inject)风险,具体取决于参数的内容。
为了解决这个问题,您必须将 what_to_show
内容注入(inject)到 SQL 字符串中。
像这样:
var
what_to_show: string;
begin
....
what_to_show:= 'tables';
ADOQuery.SQL.Text:= ('SHOW '+what_to_show);
....
现在就可以了。
警告
确保测试您注入(inject) SQL 的所有内容,以防止用户将其 SQL 代码注入(inject)您的查询中。
参数可以防止 SQL 注入(inject),但由于您不能在此处使用它们,因此您需要根据预先批准的值列表来检查它们。例如包含所有允许的内容的 stringlist
。
转义或使用特殊字符是没有用的。
安全注入(inject)示例代码
var
what_to_show: string;
i: integer;
inputapproved: boolean;
begin
....
what_to_show:= lower(trim(someinput));
i:= 0;
inputapproved:= false;
while (i < WhiteList.count) and not(inputapproved) do begin
inputapproved:= ( what_to_show = lower(Whitelist[i]) );
Inc(i);
end; {while}
if inputapproved then ADOQuery.SQL.Text:= ('SHOW '+what_to_show);
....
关于delphi - AdoQuery 无法使用 SHOW : command,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6241150/
我不确定为什么会发生这种情况,所以我将简要解释一下情况(应该很容易理解): Form1 一个执行 sql select 语句并将其显示在通过 TDataSource 组件链接到 ADOQuery1 组
我想请您帮助我的 Delphi 项目(RAD Studio),我是 Delphi 的新手。 我正在使用:TADOConnection(带连接字符串)2x ADOQUERY(设置“连接 = TADOCo
我在 Delphi 2010 应用程序中使用异步 ADO 查询。用户可以请求取消查询,否则查询可能会因错误而失败。这是我用来取消查询的代码: if not Assigned(myADOQuery.Re
尊敬的专家们,我正在尝试过滤连接到 adoquery 的 dbgrid 中的结果,根据用户对 4 个复选框的选择,用户可以选择一个或多个字段来相应地过滤数据我有这段代码,如果用户选择两个或多个复选框,
我想将 ClientDataSet 保存到文件,然后在 AdoQuery (AdoQuery.LoadFromFile()) 中打开该文件。可能吗? 或者如何将数据集保存为 pfADTG 文件格式?
我有一个ADOQuery,它将记录插入到SQL Server 2005表中,该记录已触发将数据插入到另一个表中。我使用以下代码刷新查询并避免使用Row cannot be located for up
我在这里使用的是 Delphi 5 和 SQL Server 2000。 我使用 INSTEAD OF DELETE 触发器在可更新 View 之上创建了一个 ADOQuery。 可更新 View 主
我在快速报告中遇到问题,显示 ADO 查询中的数据不正确。我使用以下 sql.text SELECT * FROM JOB_DATA INNER JOIN CUSTOMER ON JOB_DATA.C
我有这个简单的代码来检查表中是否存在记录,但它总是返回运行时错误: Arguments are of the wrong type, are out of acceptable range, or a
我正在努力寻找执行 SQL 查询的正确过程。 基本上,我有一个文本字段,用户可以在其中输入 SQL 代码,程序将执行它。不幸的是,我不知道是否会返回数据集,因此我无法判断使用哪个函数:ADOQuery
我在 Delphi 7 和 Oracle 中使用 ADOQuery。我在将参数传递给 ADOQuery 时遇到错误。我用过以下行。请帮我找出错误。 ADOQuery.Sql.text:= 'selec
我有这个返回访问冲突的代码('sqloledb.dll' 模块中地址 74417E44 的访问冲突。读取地址 786E3552'),我无法确定问题出在哪里。我唯一的猜测是 ADOQuery 对我们可以
我正在测试一些数据库组件,例如 SDAC 等,我发现了一些有趣的东西: 当我使用 TADOQuery 执行查询并且该查询有很多 blob 字段并且我获取所有行 (fetchall) 时,我的应用程序的
我正在使用 ADO 组件连接到 MS SQL 数据库。我知道如何在 DBGrid 中显示查询结果。但是,例如,我想将结果作为字符串存储在数组中。 这是否可能,或者是否有其他方式使用查询结果? 最佳答案
好的,我有一个查询应该返回所有问题编号。我想要的是获取返回的每个问题编号并将其添加到字符串列表中。 ADOQuery1.SQL.Clear; SQLQuery := 'SELECT issue FRO
我有一个通过数据源链接到 DBGrid 的 ADOQuery。 ADOQuery 和DataSource 位于DataModule 中,并且连接采用另一种形式。 有什么方法可以让我的应用程序在查询获取
我在 ADOQuery2 中有一个查询。现在我想要一个过滤器: ADOQuery2.Filter := 'where Fname like ' + QuotedStr(Txt_Search.Tex
我正在撕扯我的头发!! 即使是像这样简单的事情: procedure MyAdoQueryTest(); const MYSQL_CONNECT_STRING='Driver={MySQL OD
我有一个 Delphi 7 项目,它使用 MySQL 中的数据库来存储一些配置。每当我更改配置时,都会启用“保存”按钮。此按钮中的 OnClick 过程调用 TADOQuery.Edit、Select
我有以下行来定位查询中的一行。 if Query.Locate('Line;Hour;Minute',VarArrayOf([Line-400,AHour,minuteof(Start)]),[])
我是一名优秀的程序员,十分优秀!