有一个类似于此的问题,但是用户使用更先进的方式,所以我很困惑。
这是异常爆发的程序。特别是在ADOCon.connected行上。我正在使用dbgo stuff和Microsoft访问我的数据库。
我得到的例外是:EAcessViolation。我想知道我做了什么错误以及如何解决它。我已使用预先存在的数据库和新数据库运行该过程。当存在预先存在的数据库时,例外是第19行,而没有它在第14行。正如用户提到的,我已经阅读了文档但是我仍然对如何解决错误感到困惑。错误肯定在这里,因为这是我调用的第一个访问权限。
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,DB, ADODB,ComObj;
type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
var
ADOCom:TADOcommand;
ADOCon:TADOConnection;
ADOQ:TADOQuery;
nameDB:string;
db:OLEVariant;
begin
namedb:='Brill.accdb';
if not fileexists(namedb) then
begin
db:=createOLEObject('ADOX.Catalog');
db.create('Provider=Microsoft.ACE.OLEDB.12.0;Data Source='+nameDB+';');
db:=null;
ADOCon.connectionstring:='Provider=Microsoft.ACE.OLEDB.12.0;Data Source='+
nameDB+';';
ADOCon.connected:=True;
ADOCon.loginprompt:=False;
end
else
ADOCon.connectionstring:='Provider=Microsoft.ACE.OLEDB.12.0;Data Source='+
nameDB+';';
end.
答案 0 :(得分:1)
您的代码充满了错误。
当您在代码中声明特定类类型的变量时,您负责创建该类的实例并在使用它之前将其分配给变量,并在完成后清理它。
var
ADOCon: TAdoConnection;
ADOCom:TADOcommand;
ADOQ:TADOQuery;
begin
ADOCon := TADOConnection.Create(nil);
try
// Set up connection properties here
ADOQ := TADOQuery.Create(nil);
try
// Set up ADOQ properties and use query here
finally
ADOQ.Free;
end;
finally
ADOCon.Free;
end;
end;
此外,您对db: OleVariant
(以及与之相关的所有代码)的使用绝对没有任何作用。您获得一个实例,为该实例分配属性,然后将其丢弃,这意味着您可以完全删除该变量和与之相关的三行代码;他们服务于零。
当然,比上述任何一个更好的解决方案是在表单中添加TDataModule,在其上放置TADOConnection和TADOQuery,在Object Inspector或数据模块的OnCreate中设置属性。然后,您可以将该数据模块移动到可用表单列表中,将其移动到主表单之前创建,并可以从应用程序中使用该数据模块的任何位置进行访问,并且数据模块将在您退出应用程序时正确释放所有内容。它还将所有数据库代码与用户界面分开,大大清理了代码。