我目前正在使用AdoQuery和append
post
命令。但是为了数据安全,我想用insert into
和update table name
...
但我有很多表格和表格......
因此我认为可能有人已经开发了用于生成插入语句的代码。
其实我找到了办法但是我被卡住了。
这不太方便
有人可以给我一个简单的方法来做到这一点。
注意:我更喜欢仅使用标准组件编写此作业。我不想安装其他组件。
答案 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;