TClientDataSet使用SQL语句时为何必须设置TSQLDataSet为Close???(10分)

  • 主题发起人 主题发起人 zqssoft
  • 开始时间 开始时间
Z

zqssoft

Unregistered / Unconfirmed
GUEST, unregistred user!
用TClientDataset直接执行SQL语句,为何必须设置连接的TSQLDataSet为Close,才能成功。而不写TSQLDataSet.Close就会报错:提示不能在打开的SQLDataSet上操作!
下面的句子,刚开始我写时,没有写注释的第二句,结果就报错。
请熟悉的大侠给予解答,谢谢。
begin
self.ClientDataSet1.Close;
// self.SQLDataSet2.Close;
self.ClientDataSet1.CommandText:='insert into main (title) values (''QQQQQQQQQQQQQQQ'')';
self.ClientDataSet1.Execute;
end;
 
当你将 ClientDataSet与 SQLDataSet联合在一起用的时候,中间肯定需要用一个DataSetProvider, Provider的意思,就是数据包供给者。此时ClientDataSet与 SQLDataSet(如果同时打开的话)已经是两个不同的数据集了,你可以用两个DATASOURCE,两个表格分别显示对照看看。看一个的修改,会不会导致另一个随之更改。
明白了这点,就容易了,既然是两个独立的数据集,当然SQLDataSet要被ClientDataSet借用时,必须自已要先闲着没事。 其实,平时你要取数据,直接用ClientDataSet的Open或者Close,不要对SQLDataSet操作就行了, 此时 DBXExpress+SqlDataSet实际上起的就是连接数据的作用。

之于如果是单纯的执行无返回结果的SQL语句,建议不用这你的这种形式,直接用 SBX.Excute('Insert ....') 或者 SqlQuery 也可以,你这样折腾远了。
 
楼上大哥,谢谢你的回答,但还有几个地方我没有看明白,请做一下补充说明,谢谢。
1.用两个DATASOURCE+DBGrid,连接分别显示SQLDataSet和ClientDataSet中的数据,但是SQLDataset中的数据显示不出来啊,提示错误,只读数据集。这样的话,如何修改其中一个,观察第二个的变化呢?
2.当要添加和修改记录时,到底是直接用ClientDataSet.Append,或.Edit方法快呢,还是用SQLQuery.SQL.Add(Insert into...),然后再SQLQuery.Execute;这样的SQL语句形式来得快呢?当一个表中的数据量越来越大时。
3.你说的单纯执行无返回结果的SQL,直接用 SBX.Excute('Insert ....') ,请问SBX具体是哪个控件啊,我怎么找不到。
4.如果我们做一个可以查询,添加,修改,删除记录的程序,到底界面上要用上DBExperss中哪些控件,ClientDataSet+SQLDataset+DataProvider?还是一个TSQLQuery即可,然后让其硬性执行相关的SQL语句即可,到底那种更有效率,更方便。
 
请看例子:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3909991
 
1.用两个DATASOURCE+DBGrid,连接分别显示SQLDataSet和ClientDataSet中的数据,但是SQLDataset中的数据显示不出来啊,提示错误,只读数据集。这样的话,如何修改其中一个,观察第二个的变化呢?
不好意思,忘记SQLDataSet是只读的了。 你可以同时用OPEN打开SQLDataSet和ClientDataSet,然后修改ClientDataSet,看SQLDataSet会不会变,哪怕用了ClientDataSet.ApplyUpdate. 其实有ClientDataSet.oPEN后,你把SQLDATASET释放掉都不会影响数据,因为此时数据是保持在ClientDataSet.Data 的数据包里了。
2.当要添加和修改记录时,到底是直接用ClientDataSet.Append,或.Edit方法快呢,还是用SQLQuery.SQL.Add(Insert into...),然后再SQLQuery.Execute;这样的SQL语句形式来得快呢?当一个表中的数据量越来越大时。
那要看你的使用方法了,如果数据是要用户一笔笔输入,再提交保存的,那从编程效率和速度综合考虑,肯定是用数据感知元件,然后Append,然后再ApplyUpdate好。但有时会碰到一些事件触发,往数据库里添加大量数据的话,那一般来说是用Sql语句直接添加要快。
3.你说的单纯执行无返回结果的SQL,直接用 SBX.Excute('Insert ....') ,请问SBX具体是哪个控件啊,我怎么找不到。 
写错了,你用的是DBExpress连接,应该是SQLConnection.Execute('Sql语句')
4.如果我们做一个可以查询,添加,修改,删除记录的程序,到底界面上要用上DBExperss中哪些控件,ClientDataSet+SQLDataset+DataProvider?还是一个TSQLQuery即可,然后让其硬性执行相关的SQL语句即可,到底那种更有效率,更方便。
这个同第二个问题差不多,这个问题很复杂的。到底怎么用效率高的问题。我自已测试过一些,个人经验如下:(声明下,DBEXPRESS简称DBX)
1、DBX对于局域网,单表字段长度短,但字段数多的应用,具有较长的性能。 但在公网上直连,以及字段不多,单字段字节长(如TEXT字段多,内容也多,或者IMAGE字段类型)时,性能没ADO好。
2、到底是用DBX.excute('Insert ...')效率高,还是 Query.Append(我指是是ADOQUERY,SQLQUERY是只读的)高,还是与上面的有关,因为CONNTECTION是要花时间的,在批量快速添加时,如果单条记录数据包大小较小的话,还是先缓冲到数据集里,然后再批量提交性能较好,具体缓冲几条性能才是最高的,要根据表数据结构自已测试。但是如果从单条记录比较的话, 那肯定是DBX.excute高!
 
接受答案了.
 
后退
顶部