用 select fd1,fd2,fd3 from table1 where fd1='xxx' 这样的SQL语句得到的记录集有多条记录(fd1不是表的关键字)。把fd2,fd3绑到Form上的DBEdit控件上,想通过DBEdit控件编辑这记录集中多条记录的fd2,fd3的值。原以为通过DBEdit控件修改字段值时,TQuery控件会产生 update table1 set fd2='aaa',fd3='bbb' where fd1='xxx' 这样的SQL语句(注意:where fd1='xxx'),没想到自动产生的SQL语句竟然包括表中的主键字段,而主键字段不没有出现在原来的select语句中。 Database: MS SQL Server 2000
问:有什么办法让TQuery控件按 where fd1='xxx' 条件更新?
问:有什么办法让TQuery控件按 where fd1='xxx' 条件更新?
这样你可以比较容易的实现
upWhereAll,upWhereChanged,upWhereKeyOnly。它们控制了TQuery生成Update的方式。
你打开SQLServer的事件探查器,把TQuery分别设置这三种模式运行,即可看到它们生成代码的不同之处了。
如果要自己控制更新语句,可以加入一个TUpdateSQL组件,然后将TQuery的UpdateObject设置为这个组件。再分别为TUPdateSql设置插入、更新、删除的SQL语句即可(更详细的说明请参考TUpdateSql的帮助)。
2. 就是因为不想自己写update语句,才想看看有什么“捷径”
3. UpdateMode的三种模式都试过,全都会自动加上主键。
4. yjs_lh(长风浪子)说的TUpdateSQL与TQuery结合的办法以前没有试过,我准备好好试试。
帮助上说TUpdateSQL用于read-only的数据集的更新。可是这样的数据集不能被编辑,难道只能用非绑定数据源的类似TEdit的控件?否则,TUpdateSQL语句怎么得到新的字段值?请指点。
这样可以防止你修改多条,假如你不需要修改多条,完全可以只使用键值来组成where条件
代码如下:
var
pty : Property_;
pties : Properties;
pcount : integer;
begin
pties := ADOQuery.Recordset.Properties;
for pcount := 0 to pties.Count -1 do
begin
pty := pties.Item[pcount];
if pty.Name = 'Update Criteria' then
begin
pty.Value := 0;//只使用键值字段作为where条件1,使用所有字段2,默认设定3,略
end;
end;
end;
ClientDataset.fieldbyname('emp_no').updateflags:=[Pflnupdate]
//这样子段就不出现在update语句中。
怎样用Clientdatset代替Query你应该会吧
yjs_lh(长风浪子) 的做法可能也是必须包含键值字段的
现存问题1:TUpdateSQL控件用于更新只读的TDataSet(如TQuery),可如果TQuery的数据集是只读的,其绑定的TDBEdit控件也就不能编辑数据。不明白TUpdateSQL用在什么场合,矛盾!::TUpdateSQL就是用在更新TQuery的情况中。只要UpdateSQL书写得当,一般没有什么不可更新的TQuery。现存问题2:如果TQuery的查询语句适当(不使用多表、Distinct等),可以将其RequestLive设为true. 则在绑定TUpdateSQL控件后好像或发生2次更新,TUpdateSQL一次,TQuery自己还有一次,而且TQuery的更新会出错。无法解决!
::在这样的情况下,要么只用TUpdateSQL,要么只用RequestLive=true。我推荐前者。
这样比较好控制,并且易于维护!愚见,仅供参考。