数据库: sql server准备写一个程序做数据库的升级, 有很多数据库升级的脚本, 都是一个个sql文件.通过调用这些脚本, 对数据库进行升级, 可能会Create table, alter table, create PROCEDURE等等.
有什么好的办法?
准备了很多数据库升级的脚本, 比如下面是041122.sql/* ------------------------------------------------------------ DESCRIPTION: Synchronization Script for Object(s) AUTHOR: [Insert Author Name] DATE: 2004-11-22 13:47:50 ------------------------------------------------------------ */SET NOEXEC OFF
SET ANSI_WARNINGS ON
SET XACT_ABORT ON
GO
-- =======================================================
-- Synchronization Script for: [dbo].[DAILY_INV]
-- =======================================================
Print '[dbo].[DAILY_INV] is identical so no merge script will be generated'
GOCREATE TABLE [dbo].[DAILY_INV] (
[DAILY_INV_ID] varchar(22) NOT NULL,
[DAILY_INV_NO] varchar(16) NOT NULL,
[CREATE_DATE] datetime NOT NULL,
[CREATE_USER_ID] varchar(16) NOT NULL,
[BILL_DATE] datetime NULL,
)
GOALTER TABLE [dbo].[DAILY_INV] ADD PRIMARY KEY ([DAILY_INV_ID])
GO
有什么好的办法?
准备了很多数据库升级的脚本, 比如下面是041122.sql/* ------------------------------------------------------------ DESCRIPTION: Synchronization Script for Object(s) AUTHOR: [Insert Author Name] DATE: 2004-11-22 13:47:50 ------------------------------------------------------------ */SET NOEXEC OFF
SET ANSI_WARNINGS ON
SET XACT_ABORT ON
GO
-- =======================================================
-- Synchronization Script for: [dbo].[DAILY_INV]
-- =======================================================
Print '[dbo].[DAILY_INV] is identical so no merge script will be generated'
GOCREATE TABLE [dbo].[DAILY_INV] (
[DAILY_INV_ID] varchar(22) NOT NULL,
[DAILY_INV_NO] varchar(16) NOT NULL,
[CREATE_DATE] datetime NOT NULL,
[CREATE_USER_ID] varchar(16) NOT NULL,
[BILL_DATE] datetime NULL,
)
GOALTER TABLE [dbo].[DAILY_INV] ADD PRIMARY KEY ([DAILY_INV_ID])
GO
解决方案 »
- delphi 多次浏览文件的记录
- 鼠标移动的问题
- 各位大虾能否发份完成端口的例子给我,谢谢,100分
- 不管多少分,求videocap6的列子。。。。。。。。。。。。。。。
- 大家帮忙啊,郁闷死我了!!
- 如果操作系统是Windows XP(且主题服务没有禁用)就use xpman,否则就use XPMenu?
- 在delphi中如何实现纵向显示text?
- 为什么用savetofile方法从oracle的blob类型字段读出来的文件都只有33或32K?(在线等待)
- 跪求——如何在Delphi中创建一个圆形窗体!我向里面写完代码运行的时候,总是出来Delphi一开始运行的那个FORM1,请问怎么解决呀!!
- 请问一个关于Timer控件的问题!
- 如何把设计好的报表格式保存在数据库中和从数据库中调出已设计好的报表格式,控件report build 开发工具delphi??
- 请问delphi7中的ftp组件tnmftp怎么找不到?
2, 创建一个adoquery;
3, 打开脚本文件, 把脚本里的脚本赋给一个字串sSQL AssignFile(sqlFile,sqlFileName);
Reset(sqlFile); while not Eof(sqlFile) do
begin
ReadLn(sqlFile,sTemp);
//如果是注释,或者数据库设置, 跳过
if LeftBStr(sTemp, 2) = '--' then continue;
if LeftBStr(sTemp, 3) = 'SET' then continue;
if LeftBStr(sTemp, 2) = 'GO' then continue;
if LeftBStr(sTemp, 2) = 'IF' then continue;
if LeftBStr(sTemp, 5) = 'Print' then continue;
sSQL := sSQL + sTemp;
end;
CloseFile(sqlFile); 4, 将sSQL赋给adoquery;
5, adoquery.ExecSQL这样觉得不是很爽.
这个不够专业吧.
--@myslt
create.......--@myslt
alter..当然方法和你的其实是一样的
StartUpInfo:TStartUpInfo;
proInfo:TProcessInformation;
begin
CreateProcess(nil,pchar('isqlw.exe -S servername -d databasename -U username -P password -i 041122.sql -o outputfilename'),
nil,nil,false,NORMAL_PRIORITY_CLASS,nil,nil,StartUpInfo,ProInfo);
while GetProcessVersion(ProInfo.dwProcessId)<>0 do sleep(10);
-- 执行结束
end
sCmd := 'osql /U ' + Trim(edtUser.Text)
+ ' /P ' + Trim(edtPassword.Text)
+ ' /b0 /S ' + Trim(edtServer.Text)
+ ' /d ' + Trim(edtDb.Text)
+ ' /i ' + sqlFileName
+ ' /o ' + sLogFile;
Winexec(@scmd[1], 0);执行成功了.但是还有个问题, 因为Osql是系统的程序, 我怎么来在我自己的程序里捕捉错误? 谢谢!
kasteboy(), 用isqlw和Osql来执行有什么差别? 另外, 你的代码我执行的时候好像会出错^_^