如何用ClientDataSet执行SQL语句? ( 积分: 50 )

  • 主题发起人 主题发起人 天使鬼差
  • 开始时间 开始时间

天使鬼差

Unregistered / Unconfirmed
GUEST, unregistred user!
如果不设置DataSetProvider的AllowCommandText可以在ClientDataSet执行SQL语句吗?
只是要改变Where条件后面的语句,用ClientDataSet的参数可能不行,因为条件有变动....
还有不知道设置了ClientDataSet的参数之后能不能查询出所有记录,就是返回所有记录..?
哪位"大虾"了解的,在此先行谢过!
 
如果不设置DataSetProvider的AllowCommandText可以在ClientDataSet执行SQL语句吗?
只是要改变Where条件后面的语句,用ClientDataSet的参数可能不行,因为条件有变动....
还有不知道设置了ClientDataSet的参数之后能不能查询出所有记录,就是返回所有记录..?
哪位"大虾"了解的,在此先行谢过!
 
>>如果不设置DataSetProvider的AllowCommandText可以在ClientDataSet执行SQL语句吗?
[green]不可以![/green]
>>只是要改变Where条件后面的语句,用ClientDataSet的参数可能不行,因为条件有变动
[green]行![/green]
>>不知道设置了ClientDataSet的参数之后能不能查询出所有记录,就是返回所有记录
[green]什么意思?这由你的where条件决定![/green]
 
to yeskert1
>>只是要改变Where条件后面的语句,用ClientDataSet的参数可能不行,因为条件有变动
[green]行![/green]
怎么做呢。。?
 
假设:ADOQuery1-->DataSetProvider1--ClientDataset1
其中ADOQuery1的SQL是带参数的,且在ADOQuery1里也正确设置了参数的类型等信息!
设计时右键点击ClientDataset1,弹出的菜单有Fetch Params,点击则自动提取参数信息
在运行时可以直接调用ClientDataset1.FetchParams。之后:
对ClientDataset1的操作一般是:
1、close;
2、设置参数;
3、open;
 
to yeskert1:
这不是我要的结果。。。
>>不知道设置了ClientDataSet的参数之后能不能查询出所有记录,就是返回所有记录
我的意思是:假设有张单据,需要可以显示审核,未审核,全部的.
如果设置了SQL参数,就没办法显示全部记录

>>只是要改变Where条件后面的语句,用ClientDataSet的参数可能不行,因为条件有变动....
我的意思是:假设这是张学生表(编号,名字,性别,年龄),初始显示所有记录.每个字段都可以作为查询字段,如果只查询编号,就没有其它地条件。
Example:
Select * from 学生表 where 编号=:编号
如果查询多个字段就是并的关系
Example:
Select * from 学生表 where 编号=:编号 and 性别=:性别
这种情况参数字段不固定,据我理解应该不能在后端数据集写参数吧..
不知道有没有其它的解决方式(DataSetProvider的AllowCommandText和过滤除外)
 
欢迎加入Borland 程序员联盟,参与群里技术讨论!群号1805366
 
要做这样的事情你可以不通过ClientDataSet来实现,你可以在定义TLB接口的时候定义一个方法,专门用来执行你的SQL语句。然后在你需要执行你的SQL的时候用Appserver来执行。
DcomConnection.Appserver.GetData(..........).;
 
kkkchenA说的对,现在也没更好办法,我也这样做的.例于:command 就是你要传进来要执行的sql语句.要得到什么就写什么,最好写成通用的.谁有更好方法请赐教.
procedure TMediaHRSrv.OpenSQL(Command: WideString);//定义在TLB接口的.
begin
with AQuerydo
begin
Close;
SQL.Clear;
SQL.Add(Command);
Open;
end;
end;
 
要不看看这个????
http://www.delphibbs.com/keylife/iblog_show.asp?xid=12571
KeyLife富翁笔记
作者?: jianguobu
标题?: ado+clientdataset做的C/S主从表的例子
 
to KkkchenA:
Thank you!
你的意思是说通过中间层执行SQL,返回Data给ClientDataSet,而不通过ClientDataSet是这样吗。。?
刚接触N层不久,什么都不懂。问的问题可能没有深度请见谅...
 
to app2001:
Thank you!
绑定数据集方式的主从表,问题多多。。。
  不能改主表编号等一序列问题。。。
这种方式不大可行。。。
 
没错,其实我们还可以定义很多接口来实现我们要用的东西。
光用ClientDataSet的基本功能对于服务器的业务封装没什么好处的。
呵呵,你还可以扩展你的调用接口实现很多其他东西呢,例如服务器回调客户端的函数什么的。
 
to KkkchenA
你这一说就触到我这个初学者点子上了.一直有个问题压在胸口上的: 1.几乎所有人都说,多层中,在客户端尽量做成瘦客户端,只做显示,发出动作的工作,业务逻辑封装在中问层.具本怎么个做法,不明白?.2.是不是把每个表都做为一个类,把添加,修改,删除写一个过程或函数了,这样代码量就翻了几翻?
我现在的做法,只是写一些function 和proc,然后客户调用执行.还有一些地方跟写c/s没什么区别.请赐教! 非常感谢.
 
我们要封装的是“业务”,而不是对某个表的操作。
还有,我们没有必要把所有的东西都要进行同样的封装,要根据你的业务需要来决定是不是需要封装。
举个例子:
某单据上,你要录入供应商的名字,如果单纯是记录性的,该录入不会引起其他的互动,或者说你不需要对他做太多的控制,那么你对这样的操作没必要去封装。
但是,如果你想在你的单据中应用访问者模式,根据不同的供应商来启用不同的处理方式的话,那么对于这样的需求你就有必要进行封装。
对于OO的设计,我也是初学者,也许说得不对。
 
怎么能在ClientDataSet执行sql语句呢,这不切实际啊
你怎么不用ClientDataSet得到客户端的参数,传输到DataSetProvider,让应用程序服务器来执行查询,把查询的结果通过DataSetProvider.data返回给ClientDataSet不就行了,这样网络传输也少很多。DataSetProvider有一个事件的参数能得到ClientDataSet传输过来的数据,名字不记得了,参数名好象是Owner,是一个数组类型。。。也就是能取得多个参数
推荐看一下李维的书,上面说的都挺好的。。。。。。。。
 
请教一下各位你们都是怎么处理的:
如显示单据审核,未审核,所有的....(过滤除外)
这种情况一定要设DataSetProvdier的AllowCommandText吗。。?
那么岂不是基本上的DataSetProvider都要设置AllowCommandText,
或者后端放三对数据集和DataSetProvider,ClientDataSet切换DataSetProvider.
这就更麻烦了。。

不知道各位都是怎么处理这些的,谢谢各位!
 
请教一下各位你们都是怎么处理的:
如显示单据审核,未审核,所有的....(过滤除外)
这种情况一定要设DataSetProvdier的AllowCommandText吗。。?
那么岂不是基本上的DataSetProvider都要设置AllowCommandText,
或者后端放三对数据集和DataSetProvider,ClientDataSet切换DataSetProvider.
这就更麻烦了。。

不知道各位都是怎么处理这些的,谢谢各位!
 
相信大部分人都会使用CommandText来处理这样的需求,我没有找到不使用CommandText的理由。CommandText可以让我自己定义SQL,让我只取我需要的部分,而不是一下把全部的数据都在服务器端打开。如果是在一个数据量巨大的表中,你的DataSet打开的时间都够你等的了(或者是超时)。在我的一个测试中,我要从有一个1000w条记录的表中取数据,如果不用CommandText来定义我的SQL的话,肯定是超时的。后来我用Top关键字改写了CommandText
改成下面的形式
Select Top PackSize * From Table Where KeyField>KeyValue order by KeyField
基本上,取数据的时候感觉不到需要等待。
 
我想也是.客户端只做一个取数据的动作,具休要得到什么样数据所做的查询动作都在中间层做.不过我一直有个问题,客户端一个clientdataset,服务器端一定要一个DataSetProvider对应吗?不需要的话怎么做,实在不明白?
 
后退
顶部