如何通过纯代码创建插入和更新SQL

时间:2013-11-08 13:01:00

标签: delphi pascal

我目前正在使用AdoQuery和append post命令。但是为了数据安全,我想用insert intoupdate table name ...

更改我的代码

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

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

其实我找到了办法但是我被卡住了。

  1. 我有query1。它包含字段列表。
  2. 我正在使用此字段列表在另一个查询中创建参数列表。
  3. 我正按字段更新参数。
  4. 这不太方便

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

    注意:我更喜欢仅使用标准组件编写此作业。我不想安装其他组件。

2 个答案:

答案 0 :(得分:3)

也许不是你想要的回复。我认为你需要提高抽象级别。你需要跳过SQL。 ORM框架可以为您完成此任务。这对你来说可能是一个很大的进步,但我保证只使用以下代码也是一种解脱:

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

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

答案 1 :(得分: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 - prevent against SQL injection

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

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

INSERT INTO table1 SELECT * FROM table2;