【问题标题】:How to save values from a table into another table delphidelphi 如何将表中的值保存到另一个表中
【发布时间】:2019-02-12 19:27:32
【问题描述】:

我正在使用 delphi rad studio,我是这方面的初学者。我正在尝试将值从另一个只包含 ID 的表中插入到一个表中。我有一些组合框填充了表中的 ID,然后我想将这些值插入到另一个表中。更具体地说,我有一个包含汽车规格的表格,我想将这些规格保存到一个表格中,其中包含租用这辆车的信息。我已经尝试了很多,但我没有得到答案。这是组合框的代码:

    procedure TForm13.DBLookupComboBox1Click(Sender: TObject);
    begin
    adomarca.SQL.Text :=    ' SELECT tabel_Marca.Marca from Tabel_Masini ' +
     'join tabel_Marca on tabel_masini.id_Marca=tabel_marca.id_Marca ' ;

     SELF.ADOmarca.ExecSQL;
     SELF.ADOmarca.Open;
     ADOmarca.Prepared := TRUE;
     end;        

这是保存按钮的代码:

     procedure TForm13.button2click(Sender: TObject);

      begin
      Comanda := 'Insert into Tabel_Inchirieri (id_Client, id_Marca, 
                id_Model, id_Transmisie, id_Caroserie, id_Culoare, 
                   id_Combustibil, Ziua_Inchirierii, Ziua_Restituirii, 
            Nr_zile_inchiriate) ' +
        // 'select * from tabel_masini ' +
         'Values (' + inttostr(DBLOOKUPCOMBOBOX8.keyvalue) + ',' 
         +inttostr(DBLOOKUPCOMBOBOX1.keyvalue) + ',' + 
          inttostr(DBLOOKUPCOMBOBOX2.keyvalue) + ',' + 
          inttostr(DBLOOKUPCOMBOBOX3.keyvalue) + ',' + 
          inttostr(DBLOOKUPCOMBOBOX4.keyvalue)+ ',' + 
           inttostr(DBLOOKUPCOMBOBOX5.keyvalue) + ',' + 
          inttostr(DBLOOKUPCOMBOBOX6.keyvalue)+ ',' + 
           quotedstr(formatdatetime('yyyy-mm-dd',DateTimePicker1.Date))+ 
          ','+ quotedstr(formatdatetime('yyyy-mm- 
           dd',DateTimePicker2.Date))+',' + 
          inttostr(daysbetween(DateTimePicker2.Date, 
        DateTimePicker1.Date))+')';
         Qcomanda.SQL.Add(Comanda);

         try
           Qcomanda.ExecSQL ;
         finally
            ShowMessage('Comanda a fost salvata cu succes ! ');

          end;


           end;

非常感谢。

【问题讨论】:

  • 您应该直接从连接表中的列而不是从 DbLookUpComboBox 中读取要插入 Tabel_Inchirieri 的值。
  • 旁注,您的代码目前存在 SQL 注入漏洞,请学习使用 documentation 中描述的参数,作为奖励,您不必处理格式化您的代码日期字符串...

标签: sql delphi


【解决方案1】:

您没有说您使用的是什么 RDMS,但有一些方法可以完全在 SQL 中完成 应该至少与 MS Sql Server 和 MS Access 一起工作,这可能是 最常用的带有 ADO 的 RDMS。

如果您打算将复制操作填充到服务器上的新表中 你可以像这样使用 SQL

   SELECT
     [FieldList]
   INTO
     MyNewTable
   FROM
     [tables and join condition]

您可以轻松地在 Google 上搜索此示例,请参阅 f.i. http://www.vb-helper.com/howto_ado_select_into.html

如果要将行复制到现有表中,可以使用

   INSERT INTO
     [tablename]
   SELECT
     [fieldlist]
   FROM
     [tables and join condition]

见 f.i. https://docs.microsoft.com/en-us/office/client-developer/access/desktop-database-reference/insert-into-statement-microsoft-access-sql

您可以在 Delphi 应用程序中执行这些 SQL 语句,或者,如果使用 MS SQL Server, 使用 SQL Server Management Studio。

与您建议的代码不同,这两种方法都可以一次性复制所有选定的记录,而无需逐条记录、逐列的复制操作,并且您应该会发现任何一种方法都非常快客户端逐条记录复制。但是,如果涉及 非常 大量记录,则需要小心:一次性完成所有记录意味着它们可能被包裹在一个巨大的服务器端事务中,这可能会耗尽服务器的资源,因此在这种情况下,如果可行的话,最好将复制分成一系列较小的批次。

【讨论】:

  • 我只想加一句警告。这种查询在大多数情况下都很好,具体取决于插入的记录数。在有 1 亿条记录的表上运行 INSERT INTO XXX SELECT YYY 不会有好的结果。
  • @Graymatter:谢谢,但是在 1 亿条记录上使用 OP 的代码也不会很好地结束,但当然还有其他原因。无论如何,我会在我的回答中添加一个警告。
  • 我同意。我已经投票了,因为它是正确的答案。我更担心的是其他开发人员会搜索并复制并粘贴他们看到的第一个答案,而不了解他们所做的事情的后果。
猜你喜欢
  • 2018-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
相关资源
最近更新 更多