用ado连接Acess2000数据库 当向多个表写入数据为什么那么慢(100分)

  • 主题发起人 主题发起人 longshine
  • 开始时间 开始时间
L

longshine

Unregistered / Unconfirmed
GUEST, unregistred user!
各位大虾:
当循环向多个表写入数据时,如果不加延时,就会出现表被锁定的情况,请问这是怎么回事
怎么解决?着急解决,非常感激?

 
利用access的“模块”
或ado的Transaction
 
用 第三方控 件

DiamondAccess , 很快. 我一直在用.

发布时也很 方便 .
 
山猫,
DiamondAccess 这个控件哪里有下,是做什么用的,介绍一下啊。mdc1975@21cn.com
 
DiamondAccess 是专为提供联接ACCESS数据库提供的引擎,速度比较快
在www.51delphi.com有下载
 
>>当循环向多个表写入数据时,如果不加延时,就会出现表被锁定的情况,
我没有这种情况,也就是说我没用延时。

还有,一般操作Access 都用DiamondAccess 控件。
 
DiamondAccess 是一 个 控件 集, 是一个 牛人

用 Delphi 对 DAO 数据引擎 做的 封装.

这个 控件集 包 括有 DAOdatabase, DAOQuery, DAOTable 等 .

由于 DAO 是 MS 专门开发出来 操作 ACCESS 数据 库的.

所以. 用 DAO 操作 ACCESS 是 最快的, 也是最好的, 希望 操作 ACCESS 都 用他.

这个控件包的 官方 地址是 http://www.islamov.com/diamond/ 最新版 2.1

是 最新, 最全的 程序 , 源代码, 及 问题 讨论. ( 不过, 得注册 , 还要 钱.)

我是 在一个别的地下来的. 你要, 我就 E-mail 给你. 有注册 码的 注册 版 .

this_is_tomcat@21cn.com
 
》》提问者,
问题解决否???
 
为了安装的通用性 所以我还是想使用ado连接acess

下面我把我碰到的问题再详细说明一下:
一个acess数据库中有多个表,而且这多个表是相互关联的
比如有三个表客户表 帐户表 合同表 客户表中的有一个字段为cust_id, 帐户表和合同表都
要用到cust_id, 而合同表又要用到帐户表中的account_id
因此这三个表写入有先后顺序 依次为客户表 帐户表 合同表

对于这三个表的处理 我使用了三个类来实现 每个类封装了ADOQUERY组件,(也就是说没有把
adoquery显式的放在窗体上,不知道这样又没有什么问题?)


//下面就是一个客户表处理的类
unit TCustomer;

interface
uses
ADODB;

type
TCustAcpt = class
private
ADOQuery: TADOQuery;

public
m_sCustId : string;
m_sStateId : string;
..............

function WriteCustomInfo() : integer;

constructor Create;//(AOwner: TComponent); override;
destructor Destroy; override;

end;
implementation

{ TCustAcpt }


constructor TCustAcpt.Create;
begin
inherited Create;//(AOwner);
ADOQuery := TADOQuery.Create(nil);
ADOQuery.ConnectionString := sConnectionString;
end;

destructor TCustAcpt.Destroy;
begin
ADOQuery.Free;
inherited Destroy;
end;


function TCustAcpt.WriteCustomInfo: integer;
var
m_sSQL : string;
m_sTableName : string;

begin

m_sTableName := 't_customer';
m_sSQL := 'insert into ' + m_sTableName +
'(cust_id, state_id, acpt_route_id, cus_type_id, ......) values ' +
'(:cust_id, :state_id, :acpt_route_id, :cus_type_id, .......)';
ADOQuery.SQL.Clear;
ADOQuery.SQL.Add(m_sSQL);
ADOQuery.Parameters.ParamByName('cust_id').Value := m_sCustId ;
ADOQuery.Parameters.ParamByName('state_id').Value := m_sStateId ;
ADOQuery.Parameters.ParamByName('acpt_route_id').Value := m_sAcptRouteId ;
ADOQuery.Parameters.ParamByName('cus_type_id').Value := m_sCusTypeId ;
.............
ADOQuery.ExecSQL;

ADOQuery.Close;

end;

end.




同样定义了两个帐户和合同表处理的类 TAcntAcpt TCntrctAcpt


当我循环向数据库中写记录的时候 如果不延时就会出现表锁定的情况
tCust : array of TCustAcpt;
tAcnt : array of TAcntAcpt;
tCntrct : array of TCntrctAcpt;

for i:=0 to n do
begin
tCust = TCustAcpt.create;
tAcnt = TAcntAcpt.create;
tCntrct = TCntrctAcpt.create;
tCust.WriteCustomInfo;//写入客户信息
tAcnt.WriteAccountInfo;//写入帐户信息
tCntrct.WriteCntrctInfo;//写入合同信息
sleep(500); //如果不加这句话表就会被锁定 出现 无法读取记录;正被另一用户锁定
//我很奇怪 我只是向表中写入数据 又没读数据 为什么会说无法读记录呢?
//为什么会被锁定呢?
tCust.free;
tAcnt.free;
tCntrct.free;
end;



这个程序实现起来 会出现表被锁定的情况 写入数据也很慢 这是为什么?
 
//我很奇怪 我只是向表中写入数据 又没读数据 为什么会说无法读记录呢?
//为什么会被锁定呢?
因为锁有多种类型,读有读的锁,写有写的锁。。。

>>这个程序实现起来 会出现表被锁定的情况 写入数据也很慢 这是为什么?
因为你不应该把Creat 和 free放在循环中。我想锁也许和这个有关。。。
 
后退
顶部