ADO问题,很急。(200分)

  • 主题发起人 千中元
  • 开始时间

千中元

Unregistered / Unconfirmed
GUEST, unregistred user!
Table: TAdoTable;
initialization
begin
TComObjectFactory.Create(ComServer, TOurNSHandler, Class_OurNSHandler,
'OurNSHandler', 'OurNSHandler', ciMultiInstance, tmApartment);
Table := TAdoTable.Create(nil); -----在这里出现错误
Table.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Password="";Data Source=E:/刻录/控件/IE/App/namespace/db2.mdb;Persist Security Info=True';
Table.TableName:='TestProgram';
table.active := true;
end;
finalization
table.free;

出现的错误信息为:Raised a Exception class EOleSysError with message
"标记没有引用存储"

constructor TADOCommand.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FCommandObject := CreateADOObject(CLASS_Command) as _Command;
----跟踪错误,是在这一行
FParameters := TParameters.Create(Self, TParameter);
FParamCheck := True;
CommandType := cmdText;
CommandTextAlias := 'CommandText'; { Do not localize }
ComponentRef := Self;
end;


如果将TadoTable换成TTable (其他代码相应改动),则无此错误信息

 
有些问题还是不得不麻烦Soul的[:)]
类似dll中调用com,delphi在这里存在些bug
加两句即可:

initialization
begin
Succeeded(CoInitialize(nil));
TComObjectFactory.Create(ComServer, TOurNSHandler, Class_OurNSHandler,
'OurNSHandler', 'OurNSHandler', ciMultiInstance, tmApartment);
Table := TAdoTable.Create(nil);
// Table.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Password="";Data Source=E:/刻录/控件/IE/App/namespace/db2.mdb;Persist Security Info=True';
// Table.TableName:='TestProgram';
//Table.
// table.DatabaseName := ExtractFilePath(Application.ExeName);
// table.TableName := DatabaseFile;
table.active := true;
end;

finalization
table.free;
CoUninitialize;end.
 
有些问题还是得麻烦soul出马地[:)]
注意黑体字,加上即可
initialization
begin
Succeeded(CoInitialize(nil));
TComObjectFactory.Create(ComServer, TOurNSHandler, Class_OurNSHandler,
'OurNSHandler', 'OurNSHandler', ciMultiInstance, tmApartment);
Table := TAdoTable.Create(nil);
Table.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Password="";Data Source=E:/刻录/控件/IE/App/namespace/db2.mdb;Persist Security Info=True';
Table.TableName:='TestProgram';
table.active := true;
end;

finalization
table.free;
CoUninitialize;
end.
 
呵呵,老哥,这不是bug,是必须调用,com对象的使用必须调用CoInitialize,我说过很多
次的,有些时候不用调用是因为ComObj单元已经调用了这个函数,看看ComObj.pas文件就是了

http://www.delphibbs.com/delphibbs/dispq.asp?lid=958427
http://www.delphibbs.com/delphibbs/dispq.asp?lid=779287
 
我从来不用AdoExpress,bug太多
BetterAdo是最好的,最稳定的,bug最少的
 
我想还是不该在 initialization 部分写一些详细的代码,initialization 是在
程序启动时运行的,用来初始化一些全局变量的,在此处创建 Components 有可能
其所需要的一些常量还没有初始化,而导致了错误,例如 ADODB.pas 中的
OleCheck(CoGetMalloc(1, GlobalMalloc)); 甚至 TApplication 还没有获得 Handle



 
在调用com对象时需要声明CoInitialize,CoUninitialize
 
第一句 TComObjectFactory.Create 不知道有何用意?
 
多人接受答案了。
 
顶部