delphi3.0+SQLServer6.5(100分)

  • 主题发起人 主题发起人 DeckYou
  • 开始时间 开始时间
D

DeckYou

Unregistered / Unconfirmed
GUEST, unregistred user!
用delphi3.0+SQLServer6.5,出现许多错误,主要是用TTable无法显示Memo字
段;改用Tquery后又无法增删数据!等等;请问用Delphi连接SQLServer6.5需
要做那些设置?是否二者配合有问题?
急!
 
Delphi + SQL Server 配合使用Memo字段是可以显示的,不过确实存在
许多问题,主要是记录锁的阻塞。
这种情况对于使用TTable构件最为明显,而对于其他比较大的Query(一
次不能返回所有的记录)也存在这种情况。
产生原因是由于SQL Server处理Cursor的方式决定的。Delphi对于数据
库当前记录指针的移动是采用Cursor方式实现的,而当一次读取的记录数
到达所内定的上限时,SQL Server 采用了给当前页加共享锁的方式来
处理这种情况,而由于SQL Server采用的锁机制是页锁,一次性地将整个
数据页面内的所有记录全部锁定,这样的话当其他用户甚至于是本用户自身
需要修改这些被锁定的记录时,就会产生锁阻塞,对于Delphi而言,在经过
一段时间后显示Lock Time Out的异常。
如果你选用了SQL Server,不小心编程,数据量增大时就一定会产生这种情
况,甚至M$自己的VB, VC都不同程度的有这种情况存在。
在编程中应该注意以下情况:
1. 只使用TQuery, 而且或者把Query返回的记录数局限于一个较小的数目内(
如几十条),或者在 Query的SQL语句中加上NOLOCK(这样可能产生脏读情况)
2. 修改记录可以使用Cached Update及Update SQL结合使用
3. Grid这个东西如果在使用Query的情况下是可以用的,不过很麻烦,因为
Query的Insert和Update后记录并不能放到正确的位置上,只有通过
Query的重新打开后才能实现,不过想定位到当前记录又十分慢。

这些务必牢记,这可是我血的教训。 .....

Delphi连SQL 6.5很简单:
设置BDE中的DatabaseName, ServerName就可以了。
 
谢谢Delphi!但还是有很多疑问:
*请问Sql Server一个数据表只能有一个BLOB字段吗?
*Delphi连接的表有多个text字段时似乎有问题?
*当数据库很大时,如何在不影响功能的情况下限制Query返回的记录数(常需浏览大量数据)?
*请写出Cache Update和Update SQL结合的具体形式?
*query在UpdateApply后似乎只有重新执行Open后才能看到新加的数据,有无其他
更高效的办法?
 
我用D3+SQL 6.5做过大项目,SQL Server是可以使用多个Bolb字段的,
我曾经用TTable连接一个表,2000条记录,5个Text字段,关键要设置
MSSQL Driver 的BOLB SIZE 和BOLB TO CACHE两个属性,
BLOB SIZE=32
BLOB TO CACHE=64000
可以满足大部分使用
但是BDE处理MSSQL的效率不高,尤其是记录较多较大时,占用内存较多,
我试过微软的ADO/OLE DB,其效率非常高。您可以使用ADONIS这个控件,
非常不错!ADO/OLE DB使用了MSSQL未公开的秘密。




 
Delphi使用SQL6.5最好使用TDatabase+Tquery+Tupdatesql的方式,在tquery的updateobject属性中设置为TupdateSQL的名字,在Tquery的databasename 属性设为TDatabase的Databasename属性,在Tdatabase可设置BDE、USer、password等连接用参数;
将Tquery的cacheupdate设为True,在SQL属性中输入简单的类似‘Select * form (tablename)'的SQL查询语句,双击TupdateSQL控件可自动产生有关修改的SQL语句;
通过以上设置后Tquery可象普通的Table 一样使用(插入、删除、修改、浏览),运行时可在SQL中输入相应的查询语句;
在SQL6.5或类似的数据库服务器中直接使用Ttable没有优势可言,应尽量使用SQL查询语句的Tquery;

 
请问那有ADONIS控件?
 
1. 在我记忆中一个Table绝对可以拥有多个Blob字段,
我现在没有机器验证。
2. 是不是有的Blob字段没有返回?BDE有一个设置在
Configuration/Drivers/Native/MSSQL内,叫
Blobs to Cache, 表示 BDE一次最多返回的Blob
字段数目,这个字段要根据实际情况设置,否则
庞大的数据表会返回非常缓慢。
3. 没有什么办法,只有少用Grid,多用单一记录的
显示界面,这样就可以一次只从DB中查询一条
记录了。还有一个办法是在Query打开后,执行
Query.FetchAll把所有记录全部取到客户端,
不过对于大的数据表时间很慢。
4. 例子如下:
Form内放一个TQuery, 一个TUpdateSQL构件,将
TQuery的UpdateSQL属性设置为TUpdateSQL,
CacheUpdate属性为True, 填写DatabaseName以及
SQL命令。双击UpdateSQL,生成Insert, Modify,
Delete的SQL命令。
你可以在TQuery的AfterPost, AfterDelete事件中
挂上下面语句:
Query.ApplyUpdates;
Query.CommitUpdates;
Query.Close;
Query.Open;
Query.Locate(...); //定位当前记录
这样每次一更新,自动会更新数据库。
也可以专门设置一个按钮,完成上面工作。
5. 没有别的法子。

其实在用过一段时间后,发现SQL Server 6.5并不是
一个非常好的选择。除了前面讲过的锁的问题外,前几天
我们的一个用户DBA又发现一个事情,一个数据库中的数据
表坏了,DBCC CheckDB没有法子修好,而且用Delphi查询
该库时居然使得SQL Server崩溃。 :(
还有一个建议,用第三方构件的前提是源码,否则有
问题都不知道出在什么地方。
 
非常谢谢诸位!
希望以后我们在用Delphi开发DB应用上多交流!
1 不知哪位网友能对开发应用时如何选择数据库系统提些建议和经验,以免大家
再走弯路?先替大家谢过他了!
2 用BDE误删了MS SQL的一个表,能否在MS SQL中恢复?
3 如何把MS SQL的一个DATABASE完整备份,一直到另一台机器?
4 前些日子我用delphi+Informix NT,发现当数据增多后(也就上千条),
速度越来越慢,怎么会这样呢?用Base库开发DB 应用反而问题很少,明明SQL数据库‘
更先进,怎么会反而不方便了呢?
程序员真是辛苦!
真心感谢各位的帮助!
 
1.我认为选择DBMS原则是够用就行,对于一般并非大型的企业用 xBase也不错,
对于SQL Server, Oracle等大型的DBMS因为其内在管理的复杂性在程序开发
完成交付后,企业内部仍然要培训DBA,这些在xBase中就没有这个问题。
Interbase其实对于规模不是非常大的企业也是一个较好的选择,它拥有
大型DBMS的几乎所有的特点,而且管理非常简单,就是性能差了一点。
无论从性能还是稳定性上看,OS还是Unix比较好,无论M$怎么吹,想一想
NT自己维持运行所需要的系统资源就可以明白这一点。Server要图形界面
干嘛。
DBMS所采用的锁方式对于并发度影响也是很大的,应该根据实际情况决定
页级锁是否可以满足要求(行级锁的DBMS在某些性能上比页级所慢许多)
2.如果没有备份,就只好:~~(
3.DUMP命令,格式我也记不清了,老兄可以使用Enterprise Mananger中
的Backup生成一条研究研究。
4.不会这样的,应该从老兄的程序和DBMS的设置上多找找问题。比如应该把
连续插入包含到一个Transcation中.... 大型DBMS的插入速度绝对没有
xBase快,不过查询嘛老兄用过就知道了,不能比。
 
感谢大家的帮助,我想分数如是分配:
delphi 50
LiangFeng 30
jzy 20
谢谢版主!
 

Similar threads

D
回复
0
查看
764
DelphiTeacher的专栏
D
D
回复
0
查看
669
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
886
DelphiTeacher的专栏
D
D
回复
0
查看
661
DelphiTeacher的专栏
D
后退
顶部