2010-12-07 160 views
2

我有一個ASP.NET MVC應用程序,我正在使用LinqToSql進行數據庫訪問。Linq to Sql ExecuteCommand for CREATE DATABASE

我想從一個SQL腳本創建一個數據庫到我的DBMS(SQL Server Express)。

當我運行我的腳本沒有SQL Server Management Studio中它與同一用戶的連接,但是,當我從LinqToSql與ExecuteCommand運行約我無法使用GO語句它確實給錯誤。如果我刪除GO語句並再次嘗試,它說CREATE SCHEMA應該是批處理的第一行。

因此,我很困惑,有沒有其他(更好)的方式來運行SQL腳本,其中包含CREATE DATABASE和CREATE SCHEMA語句,從asp.net mvc沒有這些問題。

感謝, CAS sakal

這裏是腳本的內容;

USE [master] 
GO 
CREATE DATABASE [TESTDB] 
CREATE SCHEMA [base] AUTHORIZATION [dbo] 
GO 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE TABLE [base].[TestTable](
[Id] [uniqueidentifier] NOT NULL, 
[Name] [nvarchar](100) NOT NULL, 
[IsActive] [bit] NOT NULL, 
CONSTRAINT [PK_TestTable] PRIMARY KEY CLUSTERED 
(
[Id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,  ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 
GO 

回答

0

GO不是有效的T-SQL命令 - 它是SQL Server Management Studio使用的命令分隔符。您不能在您想要從您自己的代碼執行的SQL腳本中使用GO

你需要做的是,劇本分成兩個:

  • 第一CREATE DATABASE腳本,創建數據庫(以及可能的模式)
  • 將創建表第二個腳本

您需要使用ExecuteCommand調用一個接一個執行。

2

這個工作對我來說:

using (var db = CreateContext()) { 
    if (db.DatabaseExists()) 
     db.DeleteDatabase(); 
    db.CreateDatabase(); 
    using (var sr = new StreamReader("prepareDatabase.sql")) { 
     var commands = sr.ReadToEnd().Split(new string[] {"GO\r"}, System.StringSplitOptions.RemoveEmptyEntries); 
     foreach (var cmd in commands) { 
     db.ExecuteCommand(cmd); 
     } 
    } 
    }