我查看了论坛里以前的帖子,直到动态创建数据库了,但是还是不知道怎么立即就创建表(我的意思是在同一个过程里)。看到以前有帖子说是用ADOQuery或是ADOCommand,可是说得不是很明白,可能是我太笨了吧:(,怎么设置ADOQuery或是ADOCommand的ConnectionString属性呢(或是根本就不用设置,不设置会提示Connection和ConnectionString没有设置),我试过用刚刚创建的数据库,可是程序一执行就提示数据库不存在。希望大家能帮帮俺,都愁了一天了。
解决方案 »
- delphi下如何很容易的打印stringgrid
- delphi 调用webservices !
- About 'DataModule' And 'MDI'
- delphi 和oracle数据库乱码问题
- 如何把pByte类型转成String或者Char?
- 谁来推荐我一本好书?
- 这个语句怎么写?
- 如何用SQL语句把表中字段'A'有两条以上重复的记录给找出来?
- 怪,为什么我的专家分在减少?前两天还是217分,昨天变成202,今天却变成198?还有我的参与分怎么显不出来了?
- 各位大侠 请问在form 上可以既画前景又画背景吗(在同一区域)
- 在delphi中怎样操作dos?
- 请问如何获取CPU序列号?紧急!!我看了很多例子,还是不行!
你动态创建了数据库,那你一定知道你的服务器地址,数据库创建好了,因此你也知道了你的数据库名称,当然你肯定也知道连接数据库的用户及其密码,要不然你怎么创建数据可呢,因此四个必须的参数都有了,因此我建议你在你的窗体上放置一个ADOConnection,现在不要设置任何属性,待会儿再程序中设置,当然你也可以直接填充ADOQuery的ConnectionString,不过这样就利用不到ADOConnection的其它功能了,对吧?这样,在你的过程中创建好了数据库,下面该设置ADOConnection的连接字符串了:
ADOConnection1.ConnectionString:='Provider=SQLOLEDB.1;Persist Security Info=False;User ID='+<你的用户名称>+';Initial Catalog='+<你的数据库名称,你刚才创建的数据库>+';Data Source='+<你的SQL Server服务器地址,名称或者IP地址皆可>;
//下面我们假设用ADOCommand来创建表,当然用ADOQuery也可以。
ADOCommand1.Connection:=ADOConnection1;//设置Connection,这样无需设置ConnectionString了
ADOCommand1.CommandText:=<创建表的SQL语句,后面说明>;
ADOCommand1.Execute;//执行
创建表的SQL语句需要你自己写了,如果不知道,你可以借助SQL Server提供的工具,下面是我的程序动态创建一个临时表,你可以参考以下,用的是ADOQuery:
procedure initDataBase(qryTmp:TADOQuery;FieldCount:integer);//传入那一个组件用来执行
//SQL命令,以及创建表的字段数目,我这个表有点特殊,后面的字段是变化的并且有一定规律
var
I: Integer;
strSQL:string;
begin
strSQL:='';//初始化字符串,可以省去,仅仅是我的习惯
strSQL:='IF EXISTS(SELECT * FROM Tempdb.dbo.SYSOBJECTS WHERE NAME LIKE ''#MyTemp%'') '+
'DROP TABLE #MyTemp '+ //如果已经存在这个临时表,则删除
'CREATE TABLE #MyTemp ('+
'id int NOT NULL IDENTITY (1, 1) PRIMARY KEY NONCLUSTERED,'+
'score int NOT NULL,'+
'ExamID char(9) NOT NULL UNIQUE NONCLUSTERED';//创建三个固定字段,自增编号,
//学号,成绩
//下面利用一个循环,创建参数传递来的FieldCount个字段,从Column1到ColumnN,N=FieldCount
for I := 1 to FieldCount do // Iterate
begin
strSQL:=strSQL+',column'+inttostr(I)+' char(5) NULL';
end; // for
strSQL:=strSQL+') ON [PRIMARY]';
if qryTmp.Active then
qryTmp.Close;
qryTmp.SQL.Text:=strSQL;
qryTmp.ExecSQL; //执行
end;
以下代码在WIN2K,D6,MDAC2.6下测试通过,
编译好的程序在WIN98第二版无ACCESS环境下运行成功.
//在之前uses ComObj,ActiveX
//声明连接字符串
Const
SConnectionString = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;'
+'Jet OLEDB:Database Password=%s;';//=============================================================================
// Procedure: GetTempPathFileName
// Author : ysai
// Date : 2003-01-27
// Arguments: (None)
// Result : string
//=============================================================================
function GetTempPathFileName():string;
//取得临时文件名
var
SPath,SFile:array [0..254] of char;
begin
GetTempPath(254,SPath);
GetTempFileName(SPath,'~SM',0,SFile);
result:=SFile;
DeleteFile(PChar(result));
end;//=============================================================================
// Procedure: CreateAccessFile
// Author : ysai
// Date : 2003-01-27
// Arguments: FileName:String;PassWord:string=''
// Result : boolean
//=============================================================================
function CreateAccessFile(FileName:String;PassWord:string=''):boolean;
//建立Access文件,如果文件存在则失败
var
STempFileName:string;
vCatalog:OleVariant;
begin
STempFileName:=GetTempPathFileName;
try
vCatalog:=CreateOleObject('ADOX.Catalog');
vCatalog.Create(format(SConnectionString,[STempFileName,PassWord]));
result:=CopyFile(PChar(STempFileName),PChar(FileName),True);
DeleteFile(STempFileName);
except
result:=false;
end;
end;//=============================================================================
// Procedure: CompactDatabase
// Author : ysai
// Date : 2003-01-27
// Arguments: AFileName,APassWord:string
// Result : boolean
//=============================================================================
function CompactDatabase(AFileName,APassWord:string):boolean;
//压缩与修复数据库,覆盖源文件
var
STempFileName:string;
vJE:OleVariant;
begin
STempFileName:=GetTempPathFileName;
try
vJE:=CreateOleObject('JRO.JetEngine');
vJE.CompactDatabase(format(SConnectionString,[AFileName,APassWord]),
format(SConnectionString,[STempFileName,APassWord]));
result:=CopyFile(PChar(STempFileName),PChar(AFileName),false);
DeleteFile(STempFileName);
except
result:=false;
end;
end;//=============================================================================
// Procedure: ChangeDatabasePassword
// Author : ysai
// Date : 2003-01-27
// Arguments: AFileName,AOldPassWord,ANewPassWord:string
// Result : boolean
//=============================================================================
function ChangeDatabasePassword(AFileName,AOldPassWord,ANewPassWord:string):boolean;
//修改ACCESS数据库密码
var
STempFileName:string;
vJE:OleVariant;
begin
STempFileName:=GetTempPathFileName;
try
vJE:=CreateOleObject('JRO.JetEngine');
vJE.CompactDatabase(format(SConnectionString,[AFileName,AOldPassWord]),
format(SConnectionString,[STempFileName,ANewPassWord]));
result:=CopyFile(PChar(STempFileName),PChar(AFileName),false);
DeleteFile(STempFileName);
except
result:=false;
end;
end;2.ACCESS中使用SQL语句应注意的地方及几点技巧
以下SQL语句在ACCESS XP的查询中测试通过
建表:
Create Table Tab1 (
ID Counter,
Name string,
Age integer,
[Date] DateTime);
技巧:
自增字段用 Counter 声明.
字段名为关键字的字段用方括号[]括起来,数字作为字段名也可行.建立索引:
下面的语句在Tab1的Date列上建立可重复索引
Create Index iDate ON Tab1 ([Date]);
完成后ACCESS中字段Date索引属性显示为 - 有(有重复).
下面的语句在Tab1的Name列上建立不可重复索引
Create Unique Index iName ON Tab1 (Name);
完成后ACCESS中字段Name索引属性显示为 - 有(无重复).
下面的语句删除刚才建立的两个索引
Drop Index iDate ON Tab1;
Drop Index iName ON Tab1;ACCESS与SQLSERVER中的UPDATE语句对比:
SQLSERVER中更新多表的UPDATE语句:
UPDATE Tab1
SET a.Name = b.Name
FROM Tab1 a,Tab2 b
WHERE a.ID = b.ID;
同样功能的SQL语句在ACCESS中应该是
UPDATE Tab1 a,Tab2 b
SET a.Name = b.Name
WHERE a.ID = b.ID;
即:ACCESS中的UPDATE语句没有FROM子句,所有引用的表都列在UPDATE关键字后.
上例中如果Tab2可以不是一个表,而是一个查询,例:
UPDATE Tab1 a,(Select ID,Name From Tab2) b
SET a.Name = b.Name
WHERE a.ID = b.ID;访问多个不同的ACCESS数据库-在SQL中使用In子句:
Select a.*,b.* From Tab1 a,Tab2 b In 'db2.mdb' Where a.ID=b.ID;
上面的SQL语句查询出当前数据库中Tab1和db2.mdb(当前文件夹中)中Tab2以ID为关联的所有记录.
缺点-外部数据库不能带密码.
补充:看到ugvanxk在一贴中的答复,可以用
Select * from [c:\aa\a.mdb;pwd=1111].table1;
ACCESS XP测试通过在ACCESS中访问其它ODBC数据源
下例在ACCESS中查询SQLSERVER中的数据
SELECT * FROM Tab1 IN [ODBC]
[ODBC;Driver=SQL Server;UID=sa;PWD=;Server=127.0.0.1;DataBase=Demo;]
外部数据源连接属性的完整参数是:
[ODBC;DRIVER=driver;SERVER=server;DATABASE=database;UID=user;PWD=password;]
其中的DRIVER=driver可以在注册表中的
HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\
中找到
异构数据库之间导数据参见 碧血剑 的
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1691966ACCESS支持子查询ACCESS支持外连接,但不包括完整外部联接,如支持
LEFT JOIN 或 RIGHT JOIN
但不支持
FULL OUTER JOIN 或 FULL JOINACCESS中的日期查询
注意:ACCESS中的日期时间分隔符是#而不是引号
Select * From Tab1 Where [Date]>#2002-1-1#;
在DELPHI中我这样用
SQL.Add(Format(
'Select * From Tab1 Where [Date]>#%s#;',
[DateToStr(Date)]));ACCESS中的字符串可以用双引号分隔,但SQLSERVER不认,所以为了迁移方便和兼容,
建议用单引号作为字符串分隔符.
var
CreateAccess:OleVariant;
begin CreateAccess:=CreateOleObject('ADOX.Catalog');
CreateAccess.Create('Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\info.mdb');
end;
这是我建库的代码,没有用到用户名密码。 ADOConnection1.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=c:\info.mdb;
ADOCommand1.Connection:=ADOConnection1;
ADOCommand1.CommandText:='Create Table PersonalInfo('+
'Name char(8) NOT NULL'+
'Gender char(2) NOT NULL'+
'Tele char(15)'+'Mobile char(15)';
ADOCommand1.execute;
这是建表的代码,提示字段定义语法错误,应该怎么改呢。另外,如何判断在库info.mdb中是不是存在表PersonalInfo呢?