2010-12-07 3 views
2

저는 ASP.NET MVC 응용 프로그램이 있으며 데이터베이스 액세스를 위해 LinqToSql을 사용하고 있습니다.Linq to SQL CREATE DATABASE에 대한 ExecuteCommand

SQL 스크립트에서 내 DBMS (SQL Server Express)로 데이터베이스를 만들고 싶습니다.

SQL 서버 관리 Studio에서 SQL Server Management Studio를 실행하면 동일한 사용자 연결로 작동하지만 ExecuteCommand으로 LinqToSql에서 실행하면 GO 명령문을 사용할 수 없다는 오류가 발생합니다. GO 문을 제거하고 다시 시도하면 CREATE SCHEMA가 배치의 첫 번째 줄이어야한다고 표시됩니다.

따라서 이러한 문제없이 asp.net mvc에서 CREATE DATABASE 및 CREATE SCHEMA 문을 포함하는 다른 (더 나은) SQL 스크립트를 실행하는 방법이 있는지 혼란 스럽습니다.

덕분에, CA는 여기에

스크립트의 내용입니다 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 서버 관리 개체를 통해 실행할 수 있습니다하지만 그들은 ASP.NET MVC에서 작동합니까? –

+0

왜 그런지 모르겠다. SMO는 다른 라이브러리와 마찬가지로 참조 할 수있다. –

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); 
     } 
    } 
    }