怪怪怪,ODBC与BDE直接驱动结果不一样?(50分)

  • 主题发起人 主题发起人 3h
  • 开始时间 开始时间
3

3h

Unregistered / Unconfirmed
GUEST, unregistred user!
<B>以下均采用本站的离线库为数据源(BigRich.mdb)。</b>

Query1的各项设置如下:
<b>DateBaseName</b>: MyRGDB
<b>SQL</b>:
Select * from Letters
Where (Subject like '%Delphi%') or (Content like '%Delphi%')
Order By DateTime DESC

DateBase1的设置如下:
<b>DateBaseName</b>: MyRGDB
已经ODBC中设置了一项BigRigh以驱动MDB的数据库,当DataBase1的数据库别
为选定为此ODBC DSN时,Query1工作正常,能发现数百条记录。
为以使程序工作更高效,想用BDE直接驱动MDB的数据库,于是Params设置了:
<b>DataBase Name=d:/bigrich.mdb
UserName=
PassWord=</b>
并且选定它的驱动类型是MSACCESS。
DataBase1的Connect通过了,Query1.Open也没有问题,但Query1.RecordCount = 0,
它的结果倒是不对的,为空?? 恢复成ODBC又正常!

这是我想做的一个ISAPI的一部分,编译成DLL后,ODBC的没有问题,但很慢,
直接驱动时第一次执行正常,第二次系统出错,说什么VxD什么错误,请重新
Setup等,要Y还是N。真够@$#@$#,必须重启,否则不能继续。
<Font color="red">
想知道原因,还有解决办法。</font>
<b>我使用的是 Delphi 5,而且已建立主索引ID,索引Subject,Content不能建索引,
因为它是备注字段。</b>
 
这个可能就和为什么用ADO访问SQL7的VARCHAR字段和用BDE的访问结果不同是同样
的原因吧! :(

如果你用本地数据库写ISAPI,你最好不要用BED去连 .
 
3h:
告诉你一个很恶心的消息:
Access的通配符是'*',
所以你的程序会。。。。。

哈哈哈哈(此处省略1M字)
 
>>Access的通配符是'*'
不准确,应该是DAO用的通配符是'*'
但是难道BDE的MSACCESS驱动使用DAO吗????
 
越想越好笑,
哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈!!!!!!

Like在Access中的具体用法
copy 自<font color=red>M$ Access Help关于<B>Like运算符(Jet SQL参考)</B></font>:
在下面的列表中说明如何使用 Like 运算符来测试不同样式的表达式。
----------------------------------------------------------------------符合的种类 样式 符合(返回 True ) 不符合(返回 False )
----------------------------------------------------------------------多个字符 a*a aa,aBa,aBBBa aBC
*ab* abc,AABB,Xab aZb,bac
特殊字符 a[*] aa*a aaa
多个字符 ab* abcdefg,abc cab,aab
单一字符 a?a aaa,a3a,aBa aBBBa
单一数字 a#a a0a,a1a,a2a aaa,a10a
字符范围 [a-z] f,p,j 2,&
范围之外 [!a-z] 9,&,% b,a
非数字 [!0-9] A,a,&,~ 0,1,9
组合字 a[!b-m]# An9,az0,a99 abc,aj0
 
cAkk:
测试如下:
1、BDE Administrator->Configuration->Drivers->Native->M$Access
DLL32设置为IDDAO32.dll(缺省就是这样)

建Access的Alias,Open失败,错误信息:
Cannot load an IDAPI service library,
File:C:/Windows/M$Apps/DAO/DAO3032.dll

2、DLL32设置为IDDA3532.DLL
Open成功,执行SQL语句时Like运算符的通配符为:
多个字符:'*'
单个字符:'?'
单个数字:'#'
 
上述两个DLL都在BDE的安装目录下找到了,
用TDump查看后,在exports部分都看到下面这个函数:

Exports from idda3532.dll
.....
00001190 2 0015 <font color=red>DaoDrvInit</font>
.....


Exports from iddao32.dll
.....
00001190 2 0002 <font color=red>DaoDrvInit</font>
.....


所以嘛,还是有理由笑的!
哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈!!!!!!
 
这么说BDE的MSACCESS驱动用的是DAO驱动?? wo kao! 那还不如直接用DAO呢!

哈哈.
 
>>那还不如直接用DAO呢!
什么话!
用BDE程序可以统一么,
换数据库就不用改程序了
 
什么话!
不用改? 那么这个"*"和"%"的区别不用改?
 
写一个函数不就得了!

我以前的老板雄心万丈,
要求程序可以在所有数据库上运行,
所以。。。。。

我真老实,什么非标准的SQL语句、函数、存储过程都不敢用,
连数据类型都只用最基本,
后来发现真TMD SB!

老板的话千万不能听,
只要你成功地让他以为自己很了不起就行了!
 
现在我已改为用 ADO 了,速度比ODBC快多了。
不过很奇怪的是,在ODBC或BDE下正常使用的参数,如

Selec Count(*) from letters where roomis=:ID

这样的方式,在ADO中报错。将它的此参数名称改为空,值改为0可以使用,
但统计结果为0!没办法只能用:

Selec Count(*) from letters where roomis=3

这样子。大家有何高见?
 
>>在ADO中报错
详细的SQL?
错误信息?


>>值改为0可以使用,但统计结果为0
数据库里有数么??
我怀疑
 
1,似乎是说参数不对什么的。这样一改才没事,怪。
2,难道YYSUN的离线库有问题? :)

Hi, all,
我用ISAPI写了一个大富翁论坛的论坛模式离线浏览器,大家看看。
由此进(现在我的FTP正在上传,最好过一会儿再去):
<a href="http://glowing.yeah.net" target="_blank"><img src="http://www.nease.net/~glowing/gif/linkicon.gif" alt="Delphi心得网站,一个全新概念的Delphi技术网站" border="1" width="400" height="40"></a>
 
试一试:
Selec Count(*) AS cn from letters where roomis=:ID

另外,同意蚯蚓. 片面的追求通用是得不偿失的.以前我也是只用ODBC,
而且只用标准的SQL语句,虽然通用,但是速度慢.
现在我才不管什么通用不通用,就用DAO,速度快多了.以后如果要换数据库,
改程序就是了,反正"闲着也是闲着". :-)
 
DataBase Name=d:/bigrich.mdb
UserName=
PassWord=
这样的写法就不对,我用的也是Delphi5,把你的代码发过来(包括数据库),我看看(不要发工程里的*.~??、*.dcu、*.exe、*.dof、*$$$、*.dsk等无用的文件,省得
浪费空间。
starlyq@cowitel.com.cn
 
finish.
If you need my program,
You can download from my homepage: Http://glowing.yeah.net
Good Luck to all.
 
后退
顶部