【问题标题】:How read records from multi table with tadodataset delphi and save in a table when post如何使用 tadodataset delphi 从多表中读取记录并在发布时保存在表中
【发布时间】:2021-07-19 14:10:06
【问题描述】:

我有一个连接到 AdoDataset 的网格。我想用连接 SQL 从两个表中读取记录,但将记录保存在一个表中。

读取数据:

adodataset.commandtext := 'select * from Table1 left join Table2 on Table1.ID = Table2.ID';
adodataset.Open;

我只想在发布时保存 Table1 字段

【问题讨论】:

  • 您显示的代码有什么问题?你有构建错误吗?输出错误?崩溃?还有什么?请阅读help pages,接听SO tour,阅读How to Ask,以及this question checklist。最后,请了解如何编辑您的问题以改进它们。
  • 您只是从 Table1 (select * from table1) 中选择字段,所以我不明白您的问题。您从数据集中读取数据并将其写入新数据,就像您处理任何其他数据一样。网上很多地方都有关于在 Delphi 中使用数据库的教程,Delphi 帮助文件中也有教程。
  • 除了@KenWhite 所说的,考虑使用 SELECT INTO 或 INSERT Into 完全在 SQL 中填充新表(请参阅stackoverflow.com/questions/6947983/insert-into-vs-select-into)。

标签: delphi delphi-7


【解决方案1】:

您可以使用DBGrid.ColumnsReadOnly 属性。例如,如果您有这样的查询:

ADODataSet1.CommandText := 'SELECT * FROM Table1 JOIN Table2 ON Table1.ID = Table2.ID';

那么你的DBGrid 会是这样的:

然后,您可以通过这些代码在设计时或运行时将第 3 列和第 4 列设为只读:

  DBGrid1.Columns[2].ReadOnly := True;
  DBGrid1.Columns[3].ReadOnly := True;

另请注意,如果您只想从Table1 中删除记录,那么您应该在ADODataSet1 处于活动状态时运行此代码:

ADODataSet1.Properties['Unique Table'].Value := 'Table1';

更新:

按照 cmets 的建议,将所需字段 ReadOnly 设置为 DataSet 级别是个好主意:

  ADODataSet1.FieldByName('ID_1').ReadOnly := True;
  ADODataSet1.FieldByName('Table2_Value').ReadOnly := True;

【讨论】:

  • 您应该永远尝试通过设置 DBGrid 的属性来设置 SQL 结果集的属性。
  • 但是您认为通过将这些字段设置为只读以及您打算何时执行此操作,您会取得什么有用的效果?
  • @MartynA 据我了解:OP 只希望 Table1.Fields 可编辑,而不希望 Table2.Fields 可编辑。所以我没有通过使用 TADODataSet 找到更好的解决方案
  • 不,OP 说“我只想在发布时保存表 1 字段”,而不是“我只希望表 1 字段可编辑”,根本不是一回事。
【解决方案2】:

首先,命令文本中的查询示例是错误的/不明确的。我不知道您要执行什么,但我猜您想更改/保存表中的数据。在这种情况下,为什么不在sql中执行更新呢?假设您有一个名为“id”的主键字段,并且您想用另一个值保存一个名为“name”的字段。

var 
  id, NewName: string;
//...
begin
  //...
  id := adodataset.fieldbyname('id').AsString; 
  adodataset.connection.execute(
    'UPDATE table1 SET name = ' + quotedstr(NewName) + ' WHERE id = ' + quotedstr(id)
  ); 
  // refresh the records by closing and reopening the adodataset
  adodataset.close; 
  adodataset.open;
  // move to the wanted record
  adodataset.Locate('id', id, []); 
  

【讨论】:

    【解决方案3】:

    为什么不使用 TAdoQuery ?

       Qry.Close;
       Qry.SQL.Clear;
       Qry.SQL.Add("select * from Table1 left join Table2 on Table1.ID = Table2.ID");
       Qry.Open;
       while not Qry.EOF do
       begin
          [do stuff]
          Qry.Next;
       end;
    

    【讨论】:

    • 如果 Qry 包含 1000 万条记录怎么办?
    • 您可以在服务器端使用 CursorLocation。不确定这与 Omid 提出的问题有什么关系。他会对 TAdoDataset 有同样的问题....
    猜你喜欢
    • 1970-01-01
    • 2016-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多