在sql server 2008中使用dephi插入数据的最佳方法

dap*_*ini 6 sql sql-server delphi

我一直使用这样的脚本将数据插入到delphi 7中的表中

sql := 'INSERT INTO table_foo (field1,field2,field3) VALUES ('
+quotedstr('value1')
+','+quotedstr('value2')
+','+quotedstr('value3')
+')';
adoquery1.close;
adoquery1.sql.text := sql;
adoquery1.execsql;
Run Code Online (Sandbox Code Playgroud)

但是我的一个朋友给我看了另一种看起来更干净的方式,如下:

sql := 'SELECT * FROM table_foo';
adoquery1.close;
adoquery1.sql.text := sql;
adoquery1.open;
adoquery1.insert;
adoquery1.fieldbyname('field1').asstring := quotedstr('value1');
adoquery1.fieldbyname('field2').asstring := quotedstr('value2');
adoquery1.fieldbyname('field3').asstring := quotedstr('value3');
adoquery1.post;
Run Code Online (Sandbox Code Playgroud)

两种方法中的哪一种更好(更快,更容易阅读/调试)?特别是当数据table_foo很大或者还有更多的字段要填充时.

kob*_*bik 9

如果你使用INSERT INTO语句使用参数(出于可读性的原因,避免SQL注入,SQL缓存),例如:

adoquery1.sql.text := 'INSERT INTO table_foo (field1, field2) values (:field1, :field2)';
adoquery1.Parameters.ParamByName('field1').Value := value1;
adoquery1.Parameters.ParamByName('field2').Value := value2; 
Run Code Online (Sandbox Code Playgroud)

更喜欢第二种方式(我会解释一下小调整).由于您要插入一条记录,因此调整是选择一个记录集,即:

SELECT * FROM table_foo where 1=0
Run Code Online (Sandbox Code Playgroud)

这样您就不会从表中选择所有记录.QuotedStr分配值时也不需要使用,即:

adoquery1.FieldByName('field1').AsString := 'value1';
Run Code Online (Sandbox Code Playgroud)

我使用这种方法的主要原因是它易于阅读和维护.我不需要用纯SQL查询来打扰自己.我不需要处理有时需要指定参数数据类型的参数(例如Parameters.ParamByName('field1').DataType := ftInteger).没必要ParseSQL.我只是使用DataSet As(Type)例如

FieldByName('field1').AsBoolean := True;
Run Code Online (Sandbox Code Playgroud)

如果我需要在单个事务中插入多个记录,我也更喜欢使用此方法.第二种方法的缺点是通过SQL服务器短途旅行SELECT FROM.

另一个选择是创建SQL存储过程,将值传递给SP,并在SP中写入所有SQL逻辑.

  • 参数+1 :)人们更喜欢INSERT语法的一个重要原因是当你想要更快的BULK INSERTS时. (4认同)