2010-12-07 17 views
2

Ich habe eine ASP.NET MVC-Anwendung und ich verwende LinqToSql für den Datenbankzugriff.Linq zu SQL ExecuteCommand für CREATE DATABASE

Ich möchte eine Datenbank von einem SQL-Skript in mein DBMS (SQL Server Express) erstellen.

Wenn ich mein Skript kein SQL Server Management Studio ausführen funktioniert es mit der gleichen Benutzerverbindung, jedoch, wenn ich es von LinqToSql mit ExecuteCommand ausführen gibt es Fehler über Ich kann nicht GO-Anweisungen verwenden. Wenn ich GO-Anweisungen entferne und es erneut versuche, heißt es, CREATE SCHEMA sollte die erste Zeile des Stapels sein.

Daher bin ich verwirrt, gibt es eine andere (bessere) Möglichkeit, das SQL-Skript, das CREATE DATABASE und CREATE SCHEMA-Anweisungen enthält, von asp.net mvc ohne diese Probleme auszuführen.

Danke, cas sakal

Hier wird der Inhalt des Skripts ist;

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 

Antwort

0

Müssen diese Aufgaben von einem Skript ausgeführt werden? Sie könnten SQL Server Management Objects verwenden, die Ihnen programmatic Zugriff auf Verwaltungsaufgaben gibt. z. B. creating a database

+0

ich sie durch SQL Server Management Objects können laufen, aber funktionieren sie von ASP.NET MVC? –

+0

Ich sehe nicht warum nicht, SMO kann nur wie jede andere Bibliothek referenziert werden. –

0

GO ist kein gültiger T-SQL-Befehl - es ist ein Befehlstrennzeichen, das von SQL Server Management Studio verwendet wird. Sie können GO nicht in SQL-Skripten verwenden, die Sie aus Ihrem eigenen Code ausführen möchten.

Was Sie tun müssen, ist das Skript in zwei aufgeteilt:

  • ein erstes CREATE DATABASE Skript, das die Datenbank (und möglicherweise Schema) erstellt
  • ein zweites Skript, das die Tabelle erstellen, wird

Sie müssen beide nacheinander mit dem ExecuteCommand Aufruf ausführen.

2

Dies funktioniert für mich:

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