L
listhano
Unregistered / Unconfirmed
GUEST, unregistred user!
利用ACCESS数据库,用TADOQuery控件,返回数据集。
我要问的问题是:当打开少量的TADOQuery数据集,程序运行正常;如果打开多个数据集,运行程序就会出错(可能是正用内存太多的缘故吧)。请问下面的程序怎样做才能关闭TADOQuery数据集(即用完一个,关闭一个)?
==============================
{***这是数据层的数据集***}
unit uClassTab;
interface
uses
SysUtils,Classes,ADODB;
type
TTab=class(TObject)
public
CunQry:TADOQuery;
procedure AllQry(AllQryName:string);
procedure TabShow(ShowName:string);
end;
implementation
procedure TTab.AllQry(AllQryName:string);
var
cnn:TADOConnection;
const
strA='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=';
strB=';Persist Security Info=False';
mdbName='ClimateNMDat.mdb';
begin
CunQry:=TADOQuery.Create(nil);
cnn:=TADOConnection.Create(nil);
cnn.ConnectionString:=strA+ExtractFilePath(ParamStr(0))+mdbName+strB;
cnn.LoginPrompt:=false;
with CunQry do
begin
Connection:=cnn;
Close;
SQL.Clear;
SQL.Add('select * from '+AllQryName+' order by year');
open;
end;
end;
procedure TTab.TabShow(ShowName:string);
begin
AllQry(showName);
end;
=========================
{***这是界面层应用情况***}
{***返回的是树状节点值(其目的是为了查找数据库中的数据表。
即R0101、R0102、R0103...R1001、R1002、R1003...***)
function TfrmMain.tvTTreeNode:string;
var
parent,child:string;
begin
if (tv.Selected.Parent.Index<9) and (tv.Selected.Parent.Index>=0) then
parent:='0'+IntToStr(tv.Selected.Parent.Index+1);
//tv是TTreeView;
if tv.Selected.Parent.Index>=9 then
parent:=IntToStr(tv.Selected.Parent.Index+1);
if (tv.Selected.Index<9) and (tv.Selected.Index>=0) then
child:='0'+IntToStr(tv.Selected.Index+1);
if tv.Selected.Index>=9 then
child:=IntToStr(tv.Selected.Index+1);
if (StrToInt(parent)>=0) and (StrToInt(child)>=0) then
Result:='R'+parent+child
else
Result:='R0101';
end;
//当改变树状(即TTreeView)焦点(节点)时显示不同的数据集
procedure TfrmMain.tvChange(Sender: TObject;
Node: TTreeNode);
begin
tvSelect(tvTTreeNode);
end;
//在dbg(TDBGrid控件)中显示数据集
procedure TfrmMain.tvSelect(strName:string);
var
s:TTab;
begin
s:=TTab.Create;
s.TabShow(stRName);
//<----当多次改变树状节点时这里就产生错误(就是找不到数据库中表了 即R****我想这个可能与打开多个数据集有关)
ds.DataSet:=s.CunQry;
//ds:是TDataSource;
dbg.DataSource:=ds;
//dbg:是TDBGrid;
end;
========================
s.TabShow(stRName);
当多次改变树状节点时这里就产生错误(就是找不到数据库中表了 即R****我想这个可能与打开多个数据集有关);我想到释放数据集,在这个过程中
procedure TTab.AllQry(AllQryName:string);
这样释放数据集?
大概是这种结构有问题,请高手给一个合理的结构。
谢谢!
我要问的问题是:当打开少量的TADOQuery数据集,程序运行正常;如果打开多个数据集,运行程序就会出错(可能是正用内存太多的缘故吧)。请问下面的程序怎样做才能关闭TADOQuery数据集(即用完一个,关闭一个)?
==============================
{***这是数据层的数据集***}
unit uClassTab;
interface
uses
SysUtils,Classes,ADODB;
type
TTab=class(TObject)
public
CunQry:TADOQuery;
procedure AllQry(AllQryName:string);
procedure TabShow(ShowName:string);
end;
implementation
procedure TTab.AllQry(AllQryName:string);
var
cnn:TADOConnection;
const
strA='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=';
strB=';Persist Security Info=False';
mdbName='ClimateNMDat.mdb';
begin
CunQry:=TADOQuery.Create(nil);
cnn:=TADOConnection.Create(nil);
cnn.ConnectionString:=strA+ExtractFilePath(ParamStr(0))+mdbName+strB;
cnn.LoginPrompt:=false;
with CunQry do
begin
Connection:=cnn;
Close;
SQL.Clear;
SQL.Add('select * from '+AllQryName+' order by year');
open;
end;
end;
procedure TTab.TabShow(ShowName:string);
begin
AllQry(showName);
end;
=========================
{***这是界面层应用情况***}
{***返回的是树状节点值(其目的是为了查找数据库中的数据表。
即R0101、R0102、R0103...R1001、R1002、R1003...***)
function TfrmMain.tvTTreeNode:string;
var
parent,child:string;
begin
if (tv.Selected.Parent.Index<9) and (tv.Selected.Parent.Index>=0) then
parent:='0'+IntToStr(tv.Selected.Parent.Index+1);
//tv是TTreeView;
if tv.Selected.Parent.Index>=9 then
parent:=IntToStr(tv.Selected.Parent.Index+1);
if (tv.Selected.Index<9) and (tv.Selected.Index>=0) then
child:='0'+IntToStr(tv.Selected.Index+1);
if tv.Selected.Index>=9 then
child:=IntToStr(tv.Selected.Index+1);
if (StrToInt(parent)>=0) and (StrToInt(child)>=0) then
Result:='R'+parent+child
else
Result:='R0101';
end;
//当改变树状(即TTreeView)焦点(节点)时显示不同的数据集
procedure TfrmMain.tvChange(Sender: TObject;
Node: TTreeNode);
begin
tvSelect(tvTTreeNode);
end;
//在dbg(TDBGrid控件)中显示数据集
procedure TfrmMain.tvSelect(strName:string);
var
s:TTab;
begin
s:=TTab.Create;
s.TabShow(stRName);
//<----当多次改变树状节点时这里就产生错误(就是找不到数据库中表了 即R****我想这个可能与打开多个数据集有关)
ds.DataSet:=s.CunQry;
//ds:是TDataSource;
dbg.DataSource:=ds;
//dbg:是TDBGrid;
end;
========================
s.TabShow(stRName);
当多次改变树状节点时这里就产生错误(就是找不到数据库中表了 即R****我想这个可能与打开多个数据集有关);我想到释放数据集,在这个过程中
procedure TTab.AllQry(AllQryName:string);
这样释放数据集?
大概是这种结构有问题,请高手给一个合理的结构。
谢谢!