DLL中创建AdoQuery,主程序无法使用! ( 积分: 200 )

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

lfzxs

Unregistered / Unconfirmed
GUEST, unregistred user!
代码如下:
function CreateDataSet(AOwner: TComponent; aConn: wideString): TDataSet;
var
vAdo: TADOQuery ;
begin
Result := nil ;
vAdo := TADOQuery.Create(AOwner);
try
vAdo.ConnectionString := aConn ;
vAdo.SQL.Text := 'Select ''AAA'' ' ;
vAdo.Open ;
vAdo.Close ;
Result := vAdo ;
except
vAdo.Free ;
end;
end ;
调用时内存会出错
 
function CreateDataSet(AOwner: TComponent; aConn: wideString): TDataSet;
var
vAdo: TADOQuery ;
begin
Result := nil ;
vAdo := TADOQuery.Create(AOwner);
try
vAdo.ConnectionString := aConn ;
vAdo.SQL.Text := 'Select ''AAA'' ' ;// 有这样合法的SQL语句吗?
vAdo.Open ;// 不是合法SQL语句到这里就会出错。
vAdo.Close ;
Result := vAdo ; // 上面两行先打开后关闭,到这一步怎么会有数据呢?
except
vAdo.Free ;
end;
end ;
 
vAdo.SQL.Text := 'Select ''AAA'' ' ; 这个还是String 类型. 当然内存出错了.
请使用
uses Sharemem
 
to bbscom,kk2000:
vAdo.SQL.Text := 'Select ''AAA'' '
是测试ADO是否连接成功的,这句是可以在SQLServer中正常执行.

:DLL中只是负责创建一个DataSet,SQL语句的执行在主程序里做!
 
//问题出在 vAdo.Free ; 去掉这句就不会出现内存错误

function CreateDataSet(AOwner: TComponent; aConn: wideString): OleVariant;
var
vAdo: TADOQuery ;
DataSetProvider1 : TDataSetProvider;
begin
Result := nil ;
vAdo := TADOQuery.Create(AOwner);
DataSetProvider1 := TDataSetProvider.Create(nil);
try
vAdo.ConnectionString := aConn ;
DataSetProvider1.DataSet := vAdo;
vAdo.SQL.Text := ...;
vAdo.Open ;
Result := DataSetProvider1.Data;
except
vAdo.Close ;
FreeAndNil(DataSetProvider1);
FreeAndNil(vAdo);
end;
end ;
 
我在主程序是这样调用的:
var
vDataSet: TDataSet ;
begin
vDataSet := createDataSet(Self,aConn) ;
vDataSet.Close ;
with vDataSet as IProviderSupport do
begin
PSSetCommandText('Select * from S_Area'); //设置SQL语句
end ;
vDataSet.open;
打开后可以得到数据集的条数,但用DBGride显示的话就会内存出错,不知道是不是Dll和主程序地址转换有什么问题?!
 
主程序和dll处于不同的内存管理器下,有两份不同的rtti,
你可以在主程序和dll的工程文件第一个位置都引用Sharemem单元。这样主程序和dll就会处于同一个内存管理器下工作。
 
因为
vAdo := TADOQuery.Create(AOwner);
有问题。你看看Delphi的释放机制吧。
 
CoInitialize(nil);
CoUninitialize;
 
ufo!,说的对!
 
接受答案了.
 
后退
顶部