0

我目前正在使用 AdoQuery 和append post命令。但是为了数据安全,我想用insert into和改变我的代码update table name......

但我有很多表格和表格......

因此,我认为也许有人已经开发了用于生成插入语句的代码。

实际上我找到了一种方法,但我被卡住了。

  1. 我有查询1。它包含字段列表。
  2. 我正在从此字段列表的另一个查询中创建一个参数列表。
  3. 我正在逐个字段地更新参数。

这不是很方便

有人可以给我一个简单的方法来做到这一点。

注意:我更喜欢仅使用标准组件对这项工作进行编码。我不想安装其他组件。

4

2 回答 2

3

也许不是你想要的答复。我认为您需要提高抽象级别。您需要跳过 SQL。ORM 框架可以为您做到这一点。这对你来说可能感觉是一大步,但我保证使用如下代码也是一种解脱:

Person.name := 'Bob';
Invoice.customer.address.street := 'Abbey road';
Edit1.text := Invoice.customer.name;

要实际更新数据库,您需要调用因框架而异的更新方法。有关框架列表,请参见此处。我也知道TMS Aurelius。我在日常使用中使用Bold 。Bold 还具有 OCL、模型中的派生属性和链接、一些粗体组件(它会在 db 更改时更新)等功能。但它有一个很大的缺点。它仅适用于 D2006/D2007。我正在为此寻找解决方案,因为我认为它是 Delphi 最好和最成熟的 ORM 框架。另请参阅我关于Bold for Delphi的博客。问你是否有问题!

于 2013-11-10T01:57:31.903 回答
2

您从查询中获取字段列表。
使用参数创建一个新查询。
并填写数值。

像这样的东西:

const 
  TableNameEscapeStart = '['; //SQL server, use '`' for MySQL
  TableNameEscapeEnd = ']';   //SQL server, use '`' for MySQL
  FieldNameEscapeStart = '[';
  FieldNameEscapeEnd = ']';

function CreateInsertStatementFromTable1ToTable2(Table1, Table2: TTable): String;
var
  i: integer;
  comma: string;
begin
  i:= 0;
  Result:= 'INSERT INTO '+TableNameEscapeStart + Table2.TableName + TableNameEscapeEnd + ' (';
  comma:= ' , '
  while i < Table1.FieldCount do begin
    if (i = Table1.FieldCount -1) then begin comma:= ' '; end;
    Result:= Result + FieldNameEscapeStart + Table1.Fields.Field[i].Name + FieldNameEscapeEnd + comma;
  end;
  Result:= Result +' ) VALUES ( ';
  i:= 0;
  comma:= ' , '
  while i < Table1.FieldCount do begin
    if (i = Table1.FieldCount -1) then begin comma:= ' '; end;
    Result:= Result +':' + IntToStr(i+1) + comma;  
  end; {while}
  Result:= Result + ' ); ';
end;

这里有三种 SQL 注入途径。
1. 字段值
2. 表名
3. 字段名

第一个是使用参数。
涵盖了第二个和第三个,因为您直接使用表的表名和字段名。
如果您没有trusted表和字段名称的来源,则需要将它们与直接从表中获得的表和字段名进行比较。
请参阅:Delphi - 防止 SQL 注入

ParamByName您可以使用(缓慢)或更有效地使用Param[i]wherei从 0 开始插入数据。

在 MySQL 中更简单:
如果 table1 和 table2 具有相同的字段,则以下 SQL 会将 table2 中的所有数据插入 table1:

INSERT INTO table1 SELECT * FROM table2;
于 2013-11-08T20:33:44.887 回答