2010-12-07 7 views
2

私はASP.NET MVCアプリケーションを持っており、データベースアクセスのためにLinqToSqlを使用しています。SQLへのLinqのSQL CREATE DATABASEのExecuteCommand

私は自分のDBMS(SQL Server Express)にSQLスクリプトからデータベースを作成します。

私はスクリプトを実行してもSQL Server Management Studioは同じユーザー接続で動作しませんが、ExecuteCommandでLinqToSqlから実行すると、GO文を使用できないというエラーが表示されます。 GO文を削除してもう一度やり直すと、CREATE SCHEMAがバッチの最初の行になるはずです。

したがって、これらの問題がなくても、asp.net mvcからCREATE DATABASE文とCREATE SCHEMA文を含むsqlスクリプトを実行する他の(より良い)方法が混乱しています。

おかげで、

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

これらのタスクはスクリプトから実行する必要がありますか? SQL Server Management Objectsを使用すると、管理タスクにprogrammaticアクセスできます。例:creating a database

+0

私はSQL Server管理オブジェクトを介してそれらを実行することができますが、それらはASP.NET MVCから働くのですか? –

+0

SMOは他のライブラリと同じように参照することができます。 –

0

GOは有効なT-SQLコマンドではありません.SQL Server Management Studioが使用するコマンド区切り文字です。独自のコードから実行するSQLスクリプトではGOを使用できません。二つにそのスクリプトを分割している何をする必要

  • データベース(おそらくスキーマ)を作成し、最初のCREATE DATABASEスクリプト
  • テーブル
を作成する2番目のスクリプト

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); 
     } 
    } 
    } 
関連する問題