高手都哪里去了?三层结构中异步存取问题? (100分)

M

micro73

Unregistered / Unconfirmed
GUEST, unregistred user!
开发环境:前台win98+delphi6 update packet 2+ado,
后台win2k server + ms sql2000 server
在后台有一数据库,内有多个表(数据由其它数据库转换而来)。
中间层用TAdoDataSet通过TAdoConnection与后台连接,采用少量多次
和异步传输(设定ExecuteOptions为[eoAsyncFetch,eoAsyncFetchNonBlocking]),
出现其中一个表(员工资料)不能使用异步传输的现象。客户端代码如下:
procedure TWorkerForm.DispAllRecords;
begin
with MainDataModule.ClientDataSet2 do
begin
Close;
CommandText:='select * from 员工资料';
try
Open;
except
//......
end;
end;
end;
经过反复测试,有如下现象:
1、select * from 员工资料 //在TDbGrid中无任何记录显示
2、select top 49 * from 员工资料 //有时可以正常显示记录
3、select top 50 * from 员工资料 //超过49不能正显示记录
4、select * from 计件工资 //当表名不为“员工资料”时可以正常显示所有记录
5、若直接使用TAdoTable,可以正常所有记录
6、若取消使用异步传输,即ExecuteOptions为空,可以正常显示所有记录
7、怀疑是ADO的问题,重装MDAC2.6后问题依旧。
各位高手帮我看看是什么问题?
 
异步的ADO,建议使用BetterADO控件,delphi自己带的有问题,6。0打补丁同样有问题
 
那真是奇怪, 没见过. 不过顺便说声, 表名一般还是用字母的好一点,
 
跟kkyy的看法一樣!
幫UP!
 
BetterADO控件是个什么样的控件哦,能介绍介绍吗?
Delphi封闭ADO 真是做的不好/
 
跟kkyy的看法一樣!
 
>>BetterADO控件是个什么样的控件哦,能介绍介绍吗?
自己在google搜索以下吧
 
up 奇怪的问题
 
你是否将ClientDataset的PackRecords 的值进行了设置,
你将PackRecords设为-1看一下,顺便将FetchonDemand 设为TRUE试一下。
OK?
 
DELPHI 对中文字段和中文表名的支持很不好啦!我吃过苦头的,后来全部重新改过来!
 
to liujunzhang:
>>你是否将ClientDataset的PackRecords 的值进行了设置,
>>你将PackRecords设为-1看一下,顺便将FetchonDemand 设为TRUE试一下。
我采用的是少量多次取数和异步传输方法,当然是设置了PackRecords的值,而且
在发贴之前我已经将它改成-1去测试,到现在也没改回去,但还是不行。

to ndch:
>>DELPHI 对中文字段和中文表名的支持很不好啦!我吃过苦头的,后来全部重新改过来!
因我的数据是从同一sql server中的其它数据库中转换而来,如果将原有数据全部改换的话,
就没有问题,但是现在我只能要部分数据。
若是因为是对中文字段和中文表名支持不好,为什么同一个表全部转换是可以而部分转换
时又不行。况且其它所有的表都没问题?
 
有新的发现,所有记录较多的表显示的都是第1001条开始的记录。
而我的“员工资料”表测试用的是不到1000条记录。
会不会是因为我在中间层设定了CacheSize为1000和异步传输的问题?
 
经过多次测试和查看以前的贴子,可以肯定是异步传输的问题。
按李维《高级篇》中第三章的例子做也有同样的问题,但在TAdoDataSet的
OnFetchComplete中增加AdoDataSet1.Requery; DbGrid1.Refresh;两句后
问题解决,不知在三层结构中如何实现?
请各位高手指点!
 
不错,不错,在这里学了不少东西。
 
可能和缓冲有关。
你可以试试在 open; 后加一条 Last; 很可能就行了!!!!
另外文件名最好不要用中文

 
to jsxjd:
我试过了,不行。

来自:micro73, 时间:2002-11-20 18:51:00, ID:1446083 | 编辑
经过多次测试和查看以前的贴子,可以肯定是异步传输的问题。
按李维《高级篇》中第三章的例子做也有同样的问题,但在TAdoDataSet的
OnFetchComplete中增加AdoDataSet1.Requery; DbGrid1.Refresh;两句后
问题解决,不知在三层结构中如何实现?
请各位高手指点!

 
注意此句!!!!!!!!!!
adFetchAsync [red]指示 CacheSize 属性指定的初始数量之后的行应异步提取。[/red]


Execute 方法 (ADO Command)


执行在 CommandText 属性中指定的查询、SQL 语句或存储过程。

语法

对于按行返回的 Command:

Set recordset = command.Execute( RecordsAffected, Parameters, Options )

对于不按行返回的 Command:

command.Execute RecordsAffected, Parameters, Options

返回值

返回 Recordset 对象引用。

参数

RecordsAffected 可选,长整型变量,提供者向其返回操作所影响的记录数目。

Parameters 可选,变体型数组,使用 SQL 语句传送的参数值。(用该参数传送时输出参数将不返回正确值。)

Options 可选,长整型值,指示提供者如何对 Command 对象的 CommandText 属性赋值。该值可为下列常量之一:

常量 说明
adCmdText 指示提供者应将 CommandText 赋值为命令的文本定义,如 SQL 语句。
adCmdTable 指示 ADO 应生成 SQL 查询以便从 CommandText 命名的表中返回所有行。
adCmdTableDirect 指示提供者应从 CommandText 命名的表中返回所有行。
adCmdStoredProc 指示提供者应将 CommandText 赋值为存储过程。
adCmdUnknown 指示 CommandText 中的命令类型未知。
adExecuteAsync 指示命令应异步执行。
adFetchAsync [red]指示 CacheSize 属性指定的初始数量之后的行应异步提取。[/red]


本列表中前 4 个常量的详细说明请参见 CommandType 属性。

说明

使用 Command 对象的 Execute 方法可执行在对象的 CommandText 属性中指定的查询。如果 CommandText 属性指定按行返回查询,执行所产生的任何结果都将存储在新的 Recordset 对象中。如果该命令不是按行返回查询,则提供者返回关闭的 Recordset 对象。某些应用程序语言允许忽略该返回值(如果不需要任何 Recordset)。

如果查询带有参数,将使用 Command 对象中参数的当前值,除非通过 Execute 调用传送的参数覆盖它们。可以在调用 Execute 方法时通过省略某些参数的新值来覆盖参数子集。指定参数的次序与其在方法中被传送的次序相同。例如,如果有 4 个(或更多)参数并且希望只为第一个和第四个参数传送新值,则可以将 Array(var1,,,var4) 作为 Parameters 参数传送。

注意 在 Parameters 参数中传送时输出参数将不返回正确的值。

该操作结束后将产生 ExecuteComplete 事件。
 
to jsxjd:
你说的是ado的原生对象吧,在delphi中如何实现呢?能举个例子吗?我试了好久都不
成功。你不会告诉我在delphi中直接操纵ado的原生对象吧?
等问题解决了,我会另外开贴给分,决不食言。
 
顶部