问题描述:
我要在VB中做SQLServer的数据库、数据表初始化操作,要用存储过程做,其中利用存储过程建立新数据库的操作我已经实现了,现在问题出现在这里:我需要在新建立的数据库中建立存储过程,我实现些好了一个SQL脚本,在SQL查询分析器中运行完全正常,现在我要在VB中通过某种方式执行这个SQL脚本,我查了以前的一些帖子,也找了别的一些资料,大体就是以下集中实现方法:
1. 利用SQL Server自带的osql工具,它的帮助文件说要用ODBC实现,不过我用ADO对象从ODBC连到SQLServer之后,执行脚本时未提示错误,但数据库中完全不存在本应该建立起来的存储过程,迷惑。
2. 首先将脚本读入一个string里面,然后用ADO对象的Execute方法执行它,可是我的脚本文件读入String变量中之后根本无法执行,报错。
3. 我认为最好的方法:利用sql-dmo组件,它的管理功能极其强大,所以我认为它一定可以很好地执行脚本,有人说用SQLServer对象的ExecuteImmediate方法,有人说用ExecuteWithResult,但我尝试之后都不行,而且我查的半天也没发现用什么其他方法最合适。
现在想请大家帮忙出出主意,看怎么解决比较好,下面会给出我的代码。***********
希望大家对自己的言论负责,因为查了很多以前的帖子发现似乎有些朋友是信口说出一种方法,根本没有经过检验,跟别人带来很大的麻烦,同时也对那些对自己给出的每一行代码都做过严格测试的朋友献上我最最真诚的敬意和感谢,无论你们是否帮过我,我都很感谢你们,谢谢!
***********代码:
VB中利用osql执行脚本的方法:            With adoConn
                .ConnectionString = "Driver={SQL Server}; Server=(local); Database=ScienceResearch; TrustedConnection=yes"
                .CommandTimeout = 10
                .CursorLocation = adUseClient
                .Open
            End With
            
            adoConn.BeginTrans
            adoConn.Execute ("master.dbo.xp_cmdshell 'osql /d ScienceResearch /i " & App.Path & "\tsql\createtblproc.sql'")
            If Err.Number <> 0 Then
                adoConn.RollbackTrans '回滚
            Else
                adoConn.CommitTrans '提交
            End If建立存储过程的SQL脚本:
-- =============================================
-- Create procedure basic template
-- =============================================
-- creating the store procedureIF EXISTS (SELECT name 
   FROM   sysobjects 
   WHERE  name = 'sp_InitDatabase' 
   AND    type = 'P')
    DROP PROCEDURE sp_InitDatabase
GOCREATE PROCEDURE sp_InitDatabase
AS
BEGIN
BEGIN TRANSACTION

--删除以前存在的表
IF EXISTS (SELECT name 
   FROM   sysobjects 
   WHERE  name = 'Personnel' 
   AND    type = 'U')
     DROP TABLE Personnel
IF @@error <> 0 GOTO E_Gen_Error IF EXISTS (SELECT name 
   FROM   sysobjects 
   WHERE  name = 'Awards' 
   AND    type = 'U')
     DROP TABLE Awards
IF @@error <> 0 GOTO E_Gen_Error IF EXISTS (SELECT name 
   FROM   sysobjects 
   WHERE  name = 'Papers' 
   AND    type = 'U')
     DROP TABLE Papers
IF @@error <> 0 GOTO E_Gen_Error IF EXISTS (SELECT name 
   FROM   sysobjects 
   WHERE  name = 'Projects' 
   AND    type = 'U')
     DROP TABLE Projects
IF @@error <> 0 GOTO E_Gen_Error IF EXISTS (SELECT name 
   FROM   sysobjects 
   WHERE  name = 'Publications' 
   AND    type = 'U')
     DROP TABLE Publications
IF @@error <> 0 GOTO E_Gen_Error IF EXISTS (SELECT name 
   FROM   sysobjects 
   WHERE  name = 'Pub_Houses' 
   AND    type = 'U')
     DROP TABLE Pub_Houses
IF @@error <> 0 GOTO E_Gen_Error IF EXISTS (SELECT name 
   FROM   sysobjects 
   WHERE  name = 'Departments' 
   AND    type = 'U')
     DROP TABLE Departments
IF @@error <> 0 GOTO E_Gen_Error

--重新创建新表
CREATE TABLE Departments(
Dept_ID char(10) PRIMARY KEY,
Dept_Desc varchar(50) NOT NULL,
Dept_Phone varchar(20),
Dept_Addr varchar(50)
)
IF @@error <> 0 GOTO E_Gen_Error CREATE TABLE Personnel(
Pn_ID char(10) PRIMARY KEY,
Pn_Name varchar(20) NOT NULL,
Sex char(2),
Tech_Title varchar(20),
Unit varchar(50),
Pn_DeptID char(10) FOREIGN KEY REFERENCES Departments(Dept_ID) ON UPDATE CASCADE ON DELETE NO ACTION,
Birthday datetime,
Department varchar(30),
Nationality varchar(20),
Political_Back varchar(16),
Employment_Time datetime,
Working_Nature varchar(10) )
IF @@error <> 0 GOTO E_Gen_Error

CREATE TABLE Projects(
Pj_ID char(10) PRIMARY KEY,
Pj_Name varchar(100) NOT NULL,
Pj_Class varchar(30),
Account varchar(20),
Contact_Time datetime,
Deadline datetime,
Total_Funds money,
Recieved_Funds money,
Waiting_Funds money,
Members_ID binary,
Members_Function binary,
Total_Members int
)
IF @@error <> 0 GOTO E_Gen_Error

CREATE TABLE Papers(
Pp_ID char(10) PRIMARY KEY,
Pp_Name varchar(100) NOT NULL,
Pp_Class varchar(10),
Pp_Rank varchar(50),
Publication varchar(100),
Pp_Time datetime,
Influence varchar(10),
Members_ID binary,
Members_Rank binary,
Total_Members int
)
IF @@error <> 0 GOTO E_Gen_Error

CREATE TABLE Pub_Houses(
Pub_House_ID char(10) PRIMARY KEY,
PH_Name varchar(100) NOT NULL,
PH_Phone varchar(20),
PH_Addr varchar(50)
)
IF @@error <> 0 GOTO E_Gen_Error

CREATE TABLE Publications(
Pub_ID char(10) PRIMARY KEY,
Pub_Name varchar(100) NOT NULL,
Pub_Class varchar(10),
Pub_Time datetime,
Pub_House_ID char(10) FOREIGN KEY REFERENCES Pub_Houses(Pub_House_ID) ON UPDATE CASCADE ON DELETE NO ACTION,
Members_ID binary,
Members_Words binary,
Total_Members int,
Total_Words int
)
IF @@error <> 0 GOTO E_Gen_Error

CREATE TABLE Awards(
Awd_ID char(10) PRIMARY KEY,
Awd_Name varchar(50) NOT NULL,
Awd_Class varchar(20),
Awd_DeptID char(10) FOREIGN KEY REFERENCES Departments(Dept_ID) ON UPDATE CASCADE ON DELETE NO ACTION,
Awd_Time datetime,
Members_ID binary,
Members_Rank binary,
Total_Members int
)
IF @@error <> 0 GOTO E_Gen_Error--全部正常,执行初始化操作
COMMIT TRANSACTION
RETURN

E_Gen_Error:
PRINT 'ERROR!!!'
ROLLBACK TRANSACTION
RETURN
END
GO*************************
希望大家帮帮我,非常非常感谢,祝各位好运!:)