关于Diamond Access(50分)

  • 主题发起人 主题发起人 PaulBlue
  • 开始时间 开始时间
P

PaulBlue

Unregistered / Unconfirmed
GUEST, unregistred user!
另外,我在学习用Diamond Access的时候,发现有几种数据格式Delphi支持不了(或者
DAO有问题?),例如dbBigInteger,dbChar,dbTimeStamp等等,为什么?
 
有意思,详细一点
 
用DAO的CreatField('fieldname',dbChar,0)运行报无效的数据类型(错误信息由底层API
^此处无论填什么值都出错
给出)
后来看源码中关于数据类型的定义,发现大多数有此问题的字段都定义成ftUnknown?
 

procedure TForm1.PrepareProfiles;
var db: Database;
td: TableDef;
begin
if __DBEngine35 = nil then CreateEngine (Dao35, '');
db := __DBEngine35.CreateDatabase (ExtractFilePath (Application.ExeName)
+ 'User.mdb', ';LANGID=0x0804;CP=936;COUNTRY=0;pwd=123', 0);
td := db.CreateTableDef ('UserInfo', 0, '', '');

td.Fields.Append(td.CreateField ('UID', dbLong,0)); //用户唯一性索引
td.Fields['UID'].Set_Attributes(dbAutoIncrField);

//DELPHI 支持的DAO数据格式
td.Fields.Append(td.CreateField ('dbBoolean',dbBoolean,0));
td.Fields.Append(td.CreateField ('dbByte',dbByte,0));
td.Fields.Append(td.CreateField ('dbInteger',dbInteger,0));
td.Fields.Append(td.CreateField ('dbLong',dbLong,0));
td.Fields.Append(td.CreateField ('dbCurrency',dbCurrency,0));
td.Fields.Append(td.CreateField ('dbSingle',dbSingle,0));
td.Fields.Append(td.CreateField ('dbDouble',dbDouble,0));
td.Fields.Append(td.CreateField ('dbDate',dbDate,0));
td.Fields.Append(td.CreateField ('dbBinary',dbBinary,0));
td.Fields.Append(td.CreateField ('dbText',dbText,0));
td.Fields.Append(td.CreateField ('dbLongBinary',dbLongBinary,0));
td.Fields.Append(td.CreateField ('dbMemo',dbMemo,0));

//以下数据类型都会出错
//td.Fields.Append(td.CreateField ('dbGUID',dbGUID,0));
//td.Fields.Append(td.CreateField ('dbBigInt',dbBigInt,3));
//td.Fields.Append(td.CreateField ('dbVarBinary',dbVarBinary,0));
//td.Fields.Append(td.CreateField ('dbChar',dbChar,2));
//td.Fields.Append(td.CreateField ('dbNumeric',dbNumeric,4));
//td.Fields.Append(td.CreateField ('dbDecimal',dbDecimal,0));
//td.Fields.Append(td.CreateField ('dbFloat',dbFloat,0));
//td.Fields.Append(td.CreateField ('dbTime', dbTime,0));
//td.Fields.Append(td.CreateField (' dbTimeStamp',dbTimeStamp,0));

db.TableDefs.Append (td);

db.Close;
end;
 
老兄,我来了,但是我不懂 :-(
 
Diamond Access 使用的是Access数据库,Access数据库的数据类型、操作语法
与Delphi常用的DBase/Paradox有区别,这方面多想想。
 
各位老大,谁有Diamond Access for bcb5的啊,我的是trial版,无原码,有限制的啊
 
出错的那些类型就不能在DELPHI中使用了吗?
 
你列的这几种,
//td.Fields.Append(td.CreateField ('dbGUID',dbGUID,0));
//td.Fields.Append(td.CreateField ('dbBigInt',dbBigInt,3));
//td.Fields.Append(td.CreateField ('dbVarBinary',dbVarBinary,0));
//td.Fields.Append(td.CreateField ('dbChar',dbChar,2));
//td.Fields.Append(td.CreateField ('dbNumeric',dbNumeric,4));
//td.Fields.Append(td.CreateField ('dbDecimal',dbDecimal,0));
//td.Fields.Append(td.CreateField ('dbFloat',dbFloat,0));
//td.Fields.Append(td.CreateField ('dbTime', dbTime,0));
//td.Fields.Append(td.CreateField (' dbTimeStamp',dbTimeStamp,0));

Access数据库中,不用查书我知道就没有Char,Guid,VarBinary,
象Float,Access中要么Single,要么Double,也没有。
另外,即使同一个Double(仅仅是“比如”),在Delphi和Access(VB)中也可能
定义不同,建议你好好检查一下,八成以上就是这个原因。
 
另:
Diamond Access是通过DAO操纵Access数据库的,DAO不认识、Access数据库里没有
的数据类型,你让它如何创建?
 
总算看到有人会答了,那些数据格式都是MSDN中描述的DAO所支持的数据格式,
也许我对DAO的地位不是很清楚,我一直认为DAO是ONLY FOR ACCESS,所以才
会钻到死胡同里,可是GUID类型好像ACCESS支持,我后来用ADO就创建成功了,
不过写法有点不同,中文名称叫啥俺记不清了.

对了,这么看来DAO和ODBC是同一级别的API了,是吗?而ADO对于支持OLE DB的
数据库应该也算同一级别,对于通过ODBC等其他数据源来连接就要高一个
层次了,各位,我有说错吗?
 
我知道得也不清楚,随便说说
我觉得DAO和ODBC不是同一层次的API,事实上DAO不是API啊
dao是面向数据库的一种对象模型,就象Delphi中的TField,TQuery那套结构
它与底层的数据库驱动是无关的
但是由于dao对MS jet做过优化,所以dao最适合配合jet使用,用来连接access数据库
但是dao也可以连接其他的数据库,以及连接odbc
以前VB都是通过dao来连接数据库的,不过从vb6开始ado取代了dao
应该是ado才是和dao同一层次的吧

>而ADO对于支持OLE DB的数据库应该也算同一级别,对于通过ODBC等其他
>数据源来连接就要高一个层次了
前半句应该没错,但是dao也可以连接odbc的
列个表大致是这样:
dao-jet-db
dao-odbc-db
ado-ole db-db
ado-odbc-db

具体到Diamond,它设计出来就是专门为了连接access数据库的,至于
能不能连接dao支持的其他数据库,我就不知道了
如果diamond不能支持dao支持而access不支持的格式,我想也是正常的。
 
Diamond Access不可能将所有的DAO功能很完善地转化过来,比如说左兄说的对ODBC、
其他数据库如FoxPro、Excel等,实现了那些功能,需要看看她的帮助了。

关于DAO、ODBC、ADO的关系,MSDN里就有很多描述,不需多说了。

Delphi5内建有ADO,访问MS的数据库如Access/SQL Server/FoxPro等使用起来很不错,
当然,访问本地数据库,DAO功能更完善,基于DAO差不多能作出一个Access来,问题是
Diamond Access将它实现了多少(还要兼顾Delphi特性)。

总的来说,访问通道是:Delphi==>DiamondAccess==>DAO==>*.MDB文件,任何一个环节
有问题都不行。GUID既然能创建,Access支持,那问题可能出在"翻译"上,DAO接到(甚
至有没有接到)的dbGUID是哪在部分定义的,她会如何解释。

我以前用VB的,做了不少程序,曾希望用Diamond Access延续以前的工作,后来放弃了。

如果不是特底层的数据库操作,使用ADO足够了,如果是,那还是使用BDE支持的数据库
吧,或者带引擎的第三方数据库,这样可以减去不少麻烦。
 
难得有两位熟悉DAO的高手参加讨论,这里我想更
进一步讨论一下DAO、ADO和ACCESS.

在左兄的最新离线阅读器2.0的说明文档中,我读到以下片段

〉仅支持DAO 3.6和Access 2000文件格式,请安装Access 2000,
〉并将原有的离线数据库转换为Access 2000文件格式。
〉如果一定要使用Access97格式,可以在源码中,
〉将DAODB1控件的DAOVersion属性改为DAO35,重新编译。


觉得左兄对DAO3.6有些误解,DAO3.5和3.6都支持ACCESS97,顶多
DAO3.5不支持ACCESS2000,在左兄推出2.0版之前,我就一直在
用基于左兄的1.3版自己改进的阅读器,使用DAO3.6+ACCEE97论坛数据库
(也是DIAMOND 1.90)

所以左兄怂恿大家安装ACCESS2000有点太劳民伤财了,ACCESS2000性能
不比ACCESS97强,相反由于ACCESS2000采用UNICODE存储字符,所以ACCESS97
数据库转换成ACCESS2000后起码大小要多出20%以上,10月6日版带全索引的
ACCESS97的MDB是85MB,而用ACCESS2000转换后起码有110M-130M!!,就算
ACCESS2000再怎么优化引擎也不可能弥补由于体积增大而带来的性能损失。

另外,也许左兄还没有研究过,其实用户机器中安装的DAO版本是3.5还是3.6
是可以判断出来的,这样就可以在初始化数据库引擎之前先判断,然后设定
调用正确的版本,就可以保证程序对自动适应不同的环境运行,感觉上DAO3.6
比DAO3.5要快一点点,而且又能支持ACCESS2000,当然应该优先使用,好像
新装的Win98SE和WinMe都已经带有DAO3.6,但是Win98第一版和NT4就不带,
判断方法如下:

Reg.RootKey := HKEY_LOCAL_MACHINE;
if Reg.KeyExists('/Software/CLASSES/CLSID/{00000100-0000-0010-8000-00AA006D2EA4}')
then DAO_Version := V36
else
if Reg.KeyExists('/Software/CLASSES/CLSID/{00000010-0000-0010-8000-00AA006D2EA4}')
then DAO_Version := V35

如果DAO3.6和DAO3.5同时存在,应该优先选用DAO3.6,仅当DAO3.5、3.6都不存在
时,才有必要拒绝继续运行程序,其余的情况都可以让程序运行下去。

以上观点是本人实践得出,如有谬误,欢迎指教!

还有个问题:在NT4中对论坛数据库(10.6,26万条记录)按content字段
用DIMOAND1.90+DAO35执行(DAO3.6没试)
select * from letters where content like '*DAO*'
(后来安装OFFICE97中的完整ACCESS97执行上面的查询居然也内存溢出!)
或用ADO执行
select * from letters where content like '%DAO%'
都会报内存溢出(没有测试mODBC,估计一样)
但是在98中不会有问题,究竟是什么原因造成的呢?
装了NT的朋友不信试一试。
 
不好意思,是我弄错了,多谢老兄提醒
因为我自己是用access2000的,所以从没想过DAO 3.6还会支持access97

判断当前DAO版本我也是想过的,没有做出来的原因纯粹是因为偷懒,呵呵
感谢提供方法,升级时我一定加上

你说的问题我也遇到过,我的系统是win2k+access2000
无论DAO 3.6还是ado都报内存溢出
但是如果数据库足够小(使用最早的一个数据包,32000多条记录,16M),
该功能却完全正常
因此我怀疑可能的确是内存不够的问题,但有人说即使是256M内存也一样报错
呵呵,只好有待高明了


 
可是在Win98里不论是 64M或128M的机器都没这个问题啊!
 
最近使用DAO,遇到一小问题,特请教:
我想使用DAO创建ACCESS数据库,程序如下,运行后发现,当系统中DAO版本是3.6时,创建的ACCESS数据库是ACCESS2000格式,无法用ACCESS97打开,为了程序的通用性,我想统一使用ACCESS97格式,但是不知道怎么设置参数,手头又没有DAO3.6的SDK(MSDN中只有DAO3.51的SDK),所以特向前辈请教,谢谢!

function TSysDM.CreateMailDb: Boolean;
var
dbengine : OLEVariant;
db : OLEVariant;
begin
result := true;
try
if DAO_Version = V36 then
dbengine := CreateOleObject('DAO.DBEngine.36')
else
dbengine := CreateOleObject('DAO.DBEngine.35');
db := dbengine.CreateDatabase ('C:/mail.mdb',';LANGID=0x0804;CP=936;COUNTRY=0;pwd=123;', 2);//dbEncrypt=2
db.close;
except
result := false;
end;
end;
 
太好了, 各位用 Diamond Access 的高手都在, 我问一个菜一点的问题.

如何能用BatchMove1控件把 Diamond Access 中控件 table 中的数据传入一个一般的table 中?

也就是说, 不过 odbc , 把 .mdb 中的数据 传 到别的 table 中去 ( 可能是 paradox 或别的)
 
PaulBlue:如果你还要继续讨论请定期提前你的帖子,如果不想继续讨论请结束帖子。
 
本人从上个星期到前天一直在研究Diamond Access,用这玩意编个小程,我用的是1.97,
直到昨晚上,才又重新改成用ADO做 ,累死我了,想知道原因吗?呵呵。
臭虫太多,我忍无可忍了。
 

Similar threads

后退
顶部