关于ACCESS数据库创建的问题,100分,解决问题马上结贴!!!!!!!!!(100分)

  • 主题发起人 主题发起人 cg1120
  • 开始时间 开始时间
C

cg1120

Unregistered / Unconfirmed
GUEST, unregistred user!
请问我是用下面的方法创建ACCESS数据库的,怎么通过这个数据库在里面建一张表呢?
AppPath:=ExtractFileDir(Application.ExeName);
CreateAccess:=CreateOleObject('ADOX.Catalog');
CreateAccess.Create('Provider=Microsoft.Jet.OLEDB.3.51;Data Source='+AppPath+'/'+tablename+'.mdb');
 
Use SQL to create the table.
 
用adoconnnection和这个数据库相连,
然后用adoquery创建表,在他的sql属性中写
sql.text := 'create table 表名 (aaa int,bbb,float)'
 
用adoconnnection连接数据库,然后用adoquery来执行如下面的语句:
CREATE TABLE [TableName] (
[FieldName1] int not null,
[FieldName2] varchar(20) null,
[FieldName3] float ,
)
 
用adoconnnection连接后报错"文件以在使用中"
 
CreateAccess做完了,应该要Free掉吧
 
我free了的啊,程序在ADOConnection2.Connected:=true;时报错
 
试试用这个函数
function ConnectAccessDB(Ado:TAdoConnection;DBFileName:string):boolean;
begin
ado.close;
ado.ConnectionString :=
'Provider=Microsoft.Jet.OLEDB.4.0;'+
'User ID=Admin;'+
'Data Source='+DBFileName+';'+
'Persist Security Info=False';
try
ado.open;
result := true;
except
result := false;
end;
end;
 
我这里没有问题:
var
CreateAccess: Variant;
begin
CreateAccess:=CreateOleObject('ADOX.Catalog');
CreateAccess.Create('Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:/Test0524.mdb');
ADOConnection1.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:/Test0524.mdb';
ADOConnection1.Connected := True;
ADOConnection1.Execute('create table Test(ID Integer)');
ADODataSet1.CommandText := 'select * from Test';
ADODataSet1.Open; //打开后就直接可以在DBGrid里编辑数据了。
end;
 
可是我的报错"文件已经被使用"
 
你既然知道CreateOleObject('ADOX.Catalog'),
怎么会不知道CreateOleObject('ADOX.Table')呢

你要做的是
CreateAccess:=CreateOleObject('ADOX.Catalog');
CreateAccess.Create('Provider=Microsoft.Jet.OLEDB.3.51;Data Source='+AppPath+'/'+tablename+'.mdb');
CreateAccess.ActiveConnection := ...//活动连接 _Connection 接口
NewTable := CreateOleObject('ADOX.Table');
NewTable.Name = 'NEW_TABLE';
CreateAccess.Tables.Append(NewTable); //创建完毕

ADOX非常强大,具体内容到 msdn.microsoft.com上看看,又非常详细的例子
 
就是呀,ADOX中的ADOXTABLE对象,在VB中的帮助十分的详细.
 
那创建字段呢?
 
摘抄,从里面你能够得到基本的东西,上面说得其实也很全了,全做灌水了。
procedure CreateNewDatabase(DatabaseFileName: string);
var
cat: OleVariant;
begin
if FileExists(DatabaseFileName) then
begin
if MessageBox(Application.Handle, PChar('Database ' + DatabaseFileName + ' has existed!' + #13#10
+ 'Delete this database and create a new database ?'), 'Database Exists',
MB_YESNO + MB_ICONWARNING + MB_DEFBUTTON2) = mrNo then
exit;
if not DeleteFile(DatabaseFileName) then
begin
MessageBox(Application.Handle,
PChar('Cannot delete database ' + DatabaseFileName),
'Delete Database Error!', MB_OK + MB_ICONERROR);
exit;
end;
end;
cat := CreateOleObject('ADOX.Catalog');
cat.Create('Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + DatabaseFileName);
if ConnectDatabase(DatabaseFileName) then
begin
adoquryClass.Close;
adoquryClass.SQL.Text := 'Create Table FaqClass ' +
'(' +
'ClassID INT not null,' +
'ClassTitle char(100) not null,' +
'ParentClassID INT not null,' +
'ClassType TINYINT DEFAULT 0' +
')';
adoquryClass.ExecSQL;
adoquryClass.Close;
adoquryClass.SQL.Text := 'Create UNIQUE Index ClassIDIndex ON FaqClass (ClassID)';
adoquryClass.ExecSQL;
adoquryClass.Close;
adoquryClass.SQL.Text := 'Create Index ClassTitleIndex ON FaqClass (ClassTitle)';
adoquryClass.ExecSQL;
adoquryClass.Close;
adoquryClass.SQL.Text := 'Create Index ParentClassIDIndex ON FaqClass (ParentClassID)';
adoquryClass.ExecSQL;
adoquryClass.Close;
adoquryClass.SQL.Text := 'Create Index ClassTypeIndex ON FaqClass (ClassType)';
adoquryClass.ExecSQL;
adoquryMemo.Close;
adoquryMemo.SQL.Text := 'Create Table FaqMemo' +
'(' +
'MemoID INT not null,' +
'ParentClassID INT not null,' +
'MemoTitle char(100) not null,' +
'MemoText TEXT,' +
'MemoPublic BIT DEFAULT 0,' + //缺省是不公开
'MemoLastModifyTime DATETIME' +
')';
adoquryMemo.ExecSQL;
adoquryMemo.Close;
adoquryMemo.SQL.Text := 'Create UNIQUE Index MemoIDIndex ON FaqMemo (MemoID)';
adoquryMemo.ExecSQL;
adoquryMemo.Close;
adoquryMemo.SQL.Text := 'Create Index ParentClassIDIndex ON FaqMemo (ParentClassID)';
adoquryMemo.ExecSQL;
adoquryMemo.Close;
adoquryMemo.SQL.Text := 'Create Index MemoTitleIndex ON FaqMemo (MemoTitle)';
adoquryMemo.ExecSQL;
adoquryMemo.Close;
adoquryMemo.SQL.Text := 'Create Index MemoPublicIndex ON FaqMemo (MemoPublic)';
adoquryMemo.ExecSQL;
adoquryMemo.Close;
adoquryMemo.SQL.Text := 'Create Index MemoLastModifyTimeIndex ON FaqMemo (MemoLastModifyTime)';
adoquryMemo.ExecSQL;
end;
end;
 
对Tintin说的不错,可以使用CreateOleObject(ADOX.Table)进行创建,也可以使用下面的
进行创建:
procedure TDM.CreateMDB(DBName: string); // 系统需要安装 MADAC
var
CreateAccess: OleVariant;
begin
CreateAccess := CreateOleObject('ADOX.Catalog');
CreateAccess.Create('Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + DBName);
end;

procedure TDM.DataModuleCreate(Sender: TObject);
var
sfile: string;
begin
SCreen.Cursor := crHourGlass;
try
//CurDir 是一个全局变量,存储路径
if not DirectoryExists(CurDir + 'Data') then
ForceDirectories(CurDir + 'Data');
Sfile := CurDir + 'Data/youdb.mdb';
if not FileExists(Sfile) then
begin
try
CreateMDB(Sfile);
except
Application.MessageBox('数据库创建失败!', '系统信息', 0);
Exit;
end;
ADOConn.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;' +
'Data Source=./Data/youdb.mdb;Mode=Share Deny None;Extended Properties="";' +
'Jet OLEDB:System database="";Jet OLEDB:Registry Path="";' +
'Jet OLEDB:Database Password="";Jet OLEDB:Engine Type=5;' +
'Jet OLEDB:Database Locking Mode=1;Jet OLEDB:Global Partial Bulk Ops=2;' +
'Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password="";' +
'Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;' +
'Jet OLEDB:Don''t Copy Locale on Compact=False;' +
'Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False';
end;
end;
try
ADOConn.Connected := True;
except
Application.MessageBox('数据库连接失败!', '系统信息', 0);
Exit;
end;
with AdoQuery do
begin
Close;
SQL.Add('create table 表名 (aaa int,bbb,float)');
ExecSQL;
end;
finally
Screen.Cursor := crDefault;
end;
end;

 
to yzhshi兄的代码用的是OLEDB.4.0,如果你用OLEDB.3.51就会报错,不信
你试试,我是要创建ACCESS97能打开的数据库。
 
'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + DBName
该一下嘛
1、将4.0去掉
'Provider=Microsoft.Jet.OLEDB;Data Source=' + DBName
2、改成3.51的
'Provider=Microsoft.Jet.OLEDB3.51;Data Source=' + DBName
3、改成3.5
'Provider=Microsoft.Jet.OLEDB.3.5;Data Source=' + DBName
4、不要这句话
'Data Source=' + DBName
估计应该有一个可以的。

 
我早就试过了,不然我也不会来问大家了
 
呵呵,我上面的5各分别实验过?我这里没有3.51的环境,不过估计应该有一个可以的。
 
我这里也没有3.5,用4.0的是没问题
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
后退
顶部