在delphi里怎样运行sqlserver 生成的脚本,重新生成数据库(或代码恢复备份的数据库) (100分)

  • 主题发起人 主题发起人 ugvanxk
  • 开始时间 开始时间
U

ugvanxk

Unregistered / Unconfirmed
GUEST, unregistred user!
sqlserver20000
由sqlserver 生成的脚本,怎么运行通过delphi
isql 也可以,通过shellexecute 调用完成功能
或创建数据库,把备份的数据还原
 
连接到Master 上操作其他的库
 
在query里就可以的啊。
query1.Close;
Query1.Sql.Clear;
Query1.SQL.LoadFromFile('filename');
Query1.ExecSql;
 
楼上的,不行吧,像if exists这样的语句就会出错,我试过,直接把SQL Server的SQL脚本
复制到query中,不能执行。
 
filename 是不是sql生成的脚本
 
to zhengyue:是的
to YoungSun:不是吧。。。。。。。。。。。。
 
if Exists是可以的,不过go语句是不行的,会出错,还有注释,也会有问题,所以需要编程分析一下文件.
每一个go语句的地方断一次,并用Query执行一次,我以前做过一个进销存系统就是在系统第一次启动的
时候调入脚本分析并创建数据库.
 
我想用ISQL可以吧,可以查以下ISQL的使用参数
 
这样吧,下面是我试过的脚本,不能执行的
if exists (select * from sysobjects where id = object_id(N'[dbo].[FileList]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[FileList]
GO

if exists (select * from sysobjects where id = object_id(N'[dbo].[ResList]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[ResList]
GO

if exists (select * from sysobjects where id = object_id(N'[dbo].[SortList]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[SortList]
GO

if exists (select * from sysobjects where id = object_id(N'[dbo].[UserList]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[UserList]
GO

CREATE TABLE [dbo].[FileList] (
[FileId] [int] IDENTITY (1, 1) NOT NULL ,
[ResId] [int] NOT NULL ,
[fName] [varchar] (50) NOT NULL ,
[fPath] [varchar] (255) NULL ,
[IsFolder] [bit] NULL ,
[fSize] [int] NULL ,
[LastTime] [datetime] NULL ,
[HasChild] [bit] NULL ,
[fNote] [varchar] (8000) NULL ,
[UpNode] [int] NULL ,
[PostUser] [int] NULL ,
[UserLimit] [varchar] (50) NULL
)
GO

CREATE TABLE [dbo].[ResList] (
[ResId] [int] IDENTITY (1, 1) NOT NULL ,
[ResName] [varchar] (30) NOT NULL ,
[SortId] [int] NOT NULL ,
[ResNote] [varchar] (8000) NULL ,
[PostUserId] [int] NOT NULL ,
[PostDate] [datetime] NULL ,
[HasFile] [bit] NOT NULL ,
[UserLimit] [varchar] (50) NULL
)
GO

CREATE TABLE [dbo].[SortList] (
[SortId] [int] IDENTITY (1, 1) NOT NULL ,
[SortName] [varchar] (30) NOT NULL ,
[SortNote] [varchar] (8000) NULL ,
[IsTop] [bit] NULL ,
[UpNode] [int] NULL ,
[HasChild] [bit] NULL ,
[HasRes] [bit] NULL
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[UserList] (
[UserId] [int] IDENTITY (1, 1) NOT NULL ,
[UserName] [varchar] (10) NULL ,
[UserPwd] [varchar] (10) NULL ,
[IsAdmin] [bit] NOT NULL
)
GO
即使把前面的if exists和go这部分删除,后面的如CREATE TABLE [dbo].[UserList]还是不能
正确执行。大家看一看呢。
 
好久没用sqlserver了,都看不懂了:)
我建议你在isql中执行一下,看能不能正确执行,我觉得如果能被正确执行,那在query
中一样是可以的。
 
我以前见过个帖子,
isql -S 服务器名 -d master -U sa -P -i c:/aa.sql
注意大小写,但我试了一下不可以,不知是不是因为我的服务器名为yuntong-jsq 中间有-
isql/? 请大家试一下,然后用shellexecute调用

恢复备份的数据库也行
 
to YoungSun:如果说CREATE TABLE [dbo].[UserList]不能执行的话,
可能说明这个表已经存在,
如果
if exists (select * from sysobjects where id = object_id(N'[dbo].[UserList]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[UserList]

CREATE TABLE [dbo].[UserList] (
[UserId] [int] IDENTITY (1, 1) NOT NULL ,
[UserName] [varchar] (10) NULL ,
[UserPwd] [varchar] (10) NULL ,
[IsAdmin] [bit] NOT NULL
)
是在同一Query中同一次ExecSQL,而UserList表又已经存在,则会出错,
因为在Query同一次ExecSQL的SQL语句不分先后的(因为不能用GO)
所以需要在go语句的地方分断,每一段分别加入Query.SQL,并ExecSQL一次。

Query1.SQL.Text:='if exists (select * from sysobjects where id = object_id(N''[dbo].[UserList]'') and OBJECTPROPERTY(id, N''IsUserTable'') = 1)
drop table [dbo].[UserList]';
Query1.ExecSQL;
Query1.SQL.Text:='CREATE TABLE [dbo].[UserList] (
[UserId] [int] IDENTITY (1, 1) NOT NULL ,
[UserName] [varchar] (10) NULL ,
[UserPwd] [varchar] (10) NULL ,
[IsAdmin] [bit] NOT NULL
)
';
Query1.ExecSQL;
 
看看我的:
http://www.playicq.com/dispdoc.php?t=&id=1533

上面的语句是正确的,不知道你具体是如何调用的?
 
因为unicode的影响,选择时去掉就好了,或用osql
在delphi里有没有恢复备份的数据库方法
 
远帆:
你的那个东东有源码吗?
 
sorry,暂时不想公开源码。
 
谢谢各位,特别是aizb,我去掉GO后,并分步执行,就正确了。
 
这是我几年前做的程序,找了好久才找到,可优化不少。

//数据库升级程序段放在此处。
if FileExists(ExtractFilePath(ParamStr(0))+'./Update.DAT') then
begin
Try
FormMessage:=TFormMessage.Create(Self);
FormMessage.AizbProgress1.Visible:=True;
try
//升级数据库!!!!
FormMessage.Label1.Caption:='正在检查数据库的完整性!请稍候!...';
FormMessage.Show;
FormMessage.Update;
AssignFile(InFile, ExtractFilePath(ParamStr(0))+'./Update.Dat');
ReSet(InFile);
m:=0;
While not Eof(InFile) do
begin
Readln(InFile,s);
m:=m+length(s);
end;
FormMessage.AizbProgress1.MaxValue:=m;
ReSet(InFile);
m:=0;
While not Eof(InFile) do
begin
Readln(InFile,s);
AssignFile(OutFile,'C:/Update.SQL');
Rewrite(OutFile);
while (UpperCase(Trim(s))<>'GO') and (not Eof(InFile)) do
begin
Writeln(OutFile,s);
Readln(InFile,s);
Inc(m,length(s));
FormMessage.AizbProgress1.Progress:=m;
FormMessage.Refresh;
end;
CloseFile(OutFile);
TempQuery.SQL.Clear;
TempQuery.SQL.LoadFromFile('C:/Update.SQL');
if Trim(TempQuery.SQL.Text)<>'' then
TempQuery.ExecSQL;
end;
CloseFile(InFile);
if FileExists('C:/Update.SQL') then
DeleteFile('C:/Update.SQL');
finally
FormMessage.Free;
end;
except
on E:exception do
begin
Application.MessageBox(PChar('数据库升级过程出错!请与**公司'+#13#10+
'当地办事处或**软件代理商联系!'+#13#10+
'出错信息:'+#13#10+
E.Message),'提示:',MB_OK_Error);
MustAbort:=True;
MyAbort;
end;
end;
END else
begin
Application.MessageBox('数据库升级文件不存在!请与**公司当地办事处或**软件代理商联系!','提示:',MB_OK_Error);
MustAbort:=True;
MyAbort;
end;
 
osql -E -i xxx.sql

delphi中用winexec或者shellexecute调一下就OK了
或者把那句代码放入*.bat中,delphi中只需要调一下bat就可以了。
 
有SqlServerAPI,不过要在服务器上执行。
 
后退
顶部