我有一个连接到AdoDataset的网格。我想用join SQL从两个表中读取记录,但将记录保存在一个表中。
读取数据:
adodataset.commandtext := 'select * from Table1 left join Table2 on Table1.ID = Table2.ID';
adodataset.Open;我只想在post时保存Table1字段
发布于 2021-07-20 12:07:37
您可以使用DBGrid.Columns的ReadOnly属性。例如,如果您有这样的查询:
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';更新:
正如评论中所建议的,在DataSet级别设置所需的字段ReadOnly是一个好主意:
ADODataSet1.FieldByName('ID_1').ReadOnly := True;
ADODataSet1.FieldByName('Table2_Value').ReadOnly := True;发布于 2021-07-20 20:12:34
首先,命令文本中的查询示例是错误的/不明确的。我不知道您想执行什么操作,但我猜您想要更改/保存表中的数据。在这种情况下,为什么不在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, []); 发布于 2021-07-20 01:52:04
为什么不使用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;https://stackoverflow.com/questions/68441939
复制相似问题