自己去研究研究DBI的API再说话吧,别什么都不做就认为什么东西对什么东西不对

解决方案 »

  1.   

    不知道是delphi是垃圾……
    还是……是垃圾?
      

  2.   

    总算解决了,找了个直接操作ODBC的VCL控件,总算不用可恶的DBI的API了,永别了,BDE
      

  3.   

    我拍案而起!!!!表示极度!!!!!!
    与其说DELPHI是垃圾,不如说你是垃圾,任何一门编程语言都有它存在的意义
    你用不清楚就不要乱说话,后面的人不要跟贴了,这是一个无用的贴
      

  4.   

    谁说Delphi是垃圾啦!大家误解我的意思了,作为做Windows的Application最快的开发工具,因为有庞大的VCL库的支持,所以Delphi是无法有其他语言可以相比的,我个人最常使用的语言就是Delphi,不过Delphi本身并不是完美的,就象VB,VC,CBB,乃至Java,没有一种语言没有人大家都认可的,综合的来说Borland公司的开发工具还是比MS的要好一些,开发速度和性能上综合考虑,我说一下我遇到的问题吧,我有一个有几千万条数据的表,我想遍历它的数据,就象平常一样用Tquery,然后用select把某些字段选了出来,当然打开速度非常慢,但是可以运行,然后Open,然后不停的Next,结果呢?意外发生了,到达一定记录时Application崩溃了,不是access violation错误,然后我打开任务管理器监视,然后重新运行,结果如我想象的,内存的使用随着Next一直在增长,也就是说我不能一直Next下去!!只有换方法了,我用BDE的API来做了个实验程序,打开DBI的游标后,循环中不停的调用DbiGetNextRecord,一直到DbiGetRecordCount的位置为止,但是结果仍然不是我想象的那样,内存使用也一直在增长,在一千万左右的时候Application终于崩溃了,关闭程序后内存使用马上就降下来了,我不清楚ODBC的API是怎么操作的,不过如果以这种现象来说Borland的公司的程序员太不付责任了,这样的数据库引擎怎么能够让我安心的使用呢?这是我用BDE中出现的一个问题,如果大家谁能够解决这个问题,我把我所有的分都给他(3xxx左右),BTW,前几天下载的odbc express不会出现内存使用的增长,不过可用物理内存也一直会下降,我只用了60万条数据测试,还没有出现崩溃
      

  5.   

    别用BDE就得了,换ADO。或者那么多替代BDE的控件呢。
      

  6.   

    真的,用ADO吧。(其实也不是BDE太烂,主要是ODBC)!
      

  7.   

    你怎么这么笨!你不会用ADO做数据库吗?这是大势所向!
      

  8.   

    光听见游人七嘴八舌说ADO如何如何好,小弟不幸使用了ADO一段时间,问题多多,头痛不已.
      

  9.   

    自己不会,不要耸人听闻!!!, BDE不喜欢跟你玩儿。
      

  10.   

    ADO我也试过了,问题跟BDE一样,用的是Delphi5自带的ADO控件,到1000万左右同样崩溃,有谁试过直接使用ADO的API没有?
      

  11.   

    回复shangshang(大雪有痕):
    小弟虽然不会BDE,不过对DBI的API还有一番研究,对单元db.pas也从头到尾仔细研究过,如果你认为自己会BDE,能不能把自己用BDE的心得写一些呀?现在小弟也想请教精通BDE的shangshang(大雪有痕),我有一个问题一直很困惑,TBatchMove控件是调用DBI中的DbiBatchMove来完成工作的,我一直想知道这个API的工作细节,你能帮小弟回答这个问题吗?如果你能回答,请给我回个帖子,把该API的细节告诉我好吗?
      

  12.   

    你的程序思路有一定问题,通常情况下一个巨大的表不应该全部选择后传送到客户端进行分析,这本身就和C/S的设计思路不符合。难道不能在服务器端通过SQL或者Store Procedure进行实现?
    如果实在要,我觉得不论BDE还是ADO,甚至将来的DBExpress都不适合进行这样的操作,
    应该直接使用嵌入式SQL或者Call Interface,不过恐怕得用BCB或者VC了。
      

  13.   

    各位兄台如果你能想办法从六千万条记录中
    没次只取出一定数量(count)满足你的条件的记录,
    而且你怎样移动游标都只显示count条记录的话,
    你们就不会在争了! 用set rowcount count(自定义)
    其中技巧自己多研究,有疑问跟我联系([email protected])
      

  14.   

    foxconn80,你他妈的有毛病呀,是不是屁眼长到鼻子下了?老远就闻到一股屎味,你要污染自己家里就算了,他妈的还不捂住鼻子下面的东西,到网上还到处喷?是不是觉得到处放有快感呀
      

  15.   

    to:falaly
    能不能具体介绍一下你说的方法。
      

  16.   

    detroit()
      我想我有能力拿你的3xxx,跟我聊聊就行!
    给我写信!我解决过这个问题!
      

  17.   

    如果满足你的查询条件的记录数有10万条
    而你不处理的话就会有问题!我想这很多人都碰到过! 
    而且有很多做数据库软件的人都不注意数据库的增长
    问题,总是在一个dbgrid中显示表中所有的记录,所以
    使用寿命会很短,一定时间后就会很慢!然后死掉!
    我的做法是:
    1:
    set rowcount :showcount  // 根据需要自定
    select * from TestTable
    where id>:firstid // 唯一,有序字段
    order by id
    set rowcount 0
    这样可以保证在dbgrid中永远只显示不大于showcount条记录
    2:
      把dbgrid的右边框用东东覆盖,加上几个speedbutton分别
    起到翻页和回首页及最后页的作用.  // 要保证界面有好
    3:
      做一个存储过程,在你点击翻页或其他移动游表的操作时执行
    返回上面SQL语句中的firstid参数.  //这是个难点,请多研究
      还有一定要保证当用户用键盘上的上下键是的翻页.
      

  18.   

    查询出这么多条记录纯粹是吃饱撑的,要浏览吗?谁有精力浏览1M条记录?
    要修改吗?为什么不直接用update的SQL语句?要统计吗,为什么不在服务器端通过Store Procedure实现?
      

  19.   

    to falaly:你虽然提供了一个思路,但是还是绕过去的,没有解决问题,举个例子,比如我需要一个数据库备份的工具或者数据库同步的工具,这个数据库的有那些表、表中有那些字段、那些字段是主键都是未知的,而且是不是复合主键也不知道(当然数据库的类型能够判断出来),怎么能用你说的那个ID来选择数据呢?而且,我不可能用打开多个BDE别名的方式,然后直接用Select Into,因为我还需要把这些数据导入到文件或者传输到其他机器上去,wolfop,你是不是天天都在跟业务打交道?没有仔细做过数据库的工具?谁说查询大数据量不可能?SQL Server数据如何Import或者Export出来的?象你那样,一来就认为没必要,你自己试一试做一个数据库数据的Import或者Export工具?要是你认为不一次打开数据查询,你才吃饱了撑的
      

  20.   

    作备份为什么不通过数据库自身的API实现,或者以Store Procedure的方法在数据库端实现。将所有数据库表的内容传递到客户端, 当然是有病。查询全部数据当然是可能,问题是有没有这个必要,就算有,你也应该用嵌入式SQL或者Call Interface实现。
    此外,不同的数据库有不同的方法限制,比如mysql可以用limit实现,Oracle可以用rownum<...实现,为什么不用。
    最后,提醒你,在数据库作备份的时候,你如果象用自己的方式实现,注意脏数据的问题,这也就是为什么很少人自己开发大型数据库的备份工具,而使用数据库自身的工具实现。
      

  21.   

    为什么不通过数据库自身的API实现:1、有那种数据库提供了完整的API列表呢,至少Interbase的API我找不到;2、你怎么知道用专用的API就一定可以实现?你作过某种数据库平台的API调用的实验吗?3、象Access,Paradox或者DBF怎么办,直接读取数据结构,然后构造自己的DataSet?
    以Store Procedure的方法在数据库端实现:如果我跟客户说我的备份工具要更改他的数据库,他不把我宰了才怪,更别说谈钱了
    很少人自己开发大型数据库的备份工具,而使用数据库自身的工具实现:很少有人做,难道就表示没有人有能力做吗?我是到CSDN来找高手来解决问题的,不是来争论有没有必要的,如果你自己认为精通数据库,怎么不帮我想想有什么折中的办法没有?在网上吵架,你不累吗?
      

  22.   

    所有的数据库都有完整的API列表,你自己不找怪谁?
    数据库备份牵涉的在线数据交易是否停止,对表是否要作排它锁定的问题。以你的实现方式,通过高级接口(BDE,ODBC)而不是数据库的专用接口实现数据库备份,结果是必然备份的数据有大量赃数据或者不完整。一Informix为例,如果你不用他的备份功能,简单地
    unload to aaa.txt
    select * from tablename。如果数据库还处于联机处理情况,很可能导致unload出的数据不完整。很少有人作的原因在进行备份需要牵涉到数据库底层,而很多数据库底层的东西你是不可能知道的。
    顺便说一句,Interbase 6.0有Source,你可以考虑通过底层的东西实现,总之想通过高层次的例如ODBC、BDE、ADO是不现实的。
    Access,Paradox或者DBF当然好办,这些数据库都是单机数据库,不可能初一长期的联机交易模式,而且表的容量不可能很大,简单地使用全表排他锁定,倒出。
    折衷的办法,当然是去好好查Interbase的文档,看看如何限制Select出来结果集合的范围。