2010-02-12 49 views
10

Ho uno script sql per creare un nuovo database che devo creare quando il nostro prodotto è installato. Per questo ho bisogno di accendere lo script usando C#. DB è sql-server 2005 express. Plz help ....Come eseguire uno script sql utilizzando C#

lo script SQL è la seguente:

USE [master] 
GO 
/****** Object: Database [Jai] Script Date: 02/12/2010 11:01:25 ******/ 
CREATE DATABASE [Jai] ON PRIMARY 
(NAME = N'Jai', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\Jai.mdf' , SIZE = 3072KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB) 
LOG ON 
(NAME = N'Jai_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\Jai_log.ldf' , SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10%) 
COLLATE SQL_Latin1_General_CP1_CI_AS 
GO 
EXEC dbo.sp_dbcmptlevel @dbname=N'Jai', @new_cmptlevel=90 
GO 
IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled')) 
begin 
EXEC [Jai].[dbo].[sp_fulltext_database] @action = 'disable' 
end 
GO 
ALTER DATABASE [Jai] SET ANSI_NULL_DEFAULT OFF 
GO 
ALTER DATABASE [Jai] SET ANSI_NULLS OFF 
GO 
ALTER DATABASE [Jai] SET ANSI_PADDING OFF 
GO 
ALTER DATABASE [Jai] SET ANSI_WARNINGS OFF 
GO 
ALTER DATABASE [Jai] SET ARITHABORT OFF 
GO 
ALTER DATABASE [Jai] SET AUTO_CLOSE OFF 
GO 
ALTER DATABASE [Jai] SET AUTO_CREATE_STATISTICS ON 
GO 
ALTER DATABASE [Jai] SET AUTO_SHRINK OFF 
GO 
ALTER DATABASE [Jai] SET AUTO_UPDATE_STATISTICS ON 
GO 
ALTER DATABASE [Jai] SET CURSOR_CLOSE_ON_COMMIT OFF 
GO 
ALTER DATABASE [Jai] SET CURSOR_DEFAULT GLOBAL 
GO 
ALTER DATABASE [Jai] SET CONCAT_NULL_YIELDS_NULL OFF 
GO 
ALTER DATABASE [Jai] SET NUMERIC_ROUNDABORT OFF 
GO 
ALTER DATABASE [Jai] SET QUOTED_IDENTIFIER OFF 
GO 
ALTER DATABASE [Jai] SET RECURSIVE_TRIGGERS OFF 
GO 
ALTER DATABASE [Jai] SET ENABLE_BROKER 
GO 
ALTER DATABASE [Jai] SET AUTO_UPDATE_STATISTICS_ASYNC OFF 
GO 
ALTER DATABASE [Jai] SET DATE_CORRELATION_OPTIMIZATION OFF 
GO 
ALTER DATABASE [Jai] SET TRUSTWORTHY OFF 
GO 
ALTER DATABASE [Jai] SET ALLOW_SNAPSHOT_ISOLATION OFF 
GO 
ALTER DATABASE [Jai] SET PARAMETERIZATION SIMPLE 
GO 
ALTER DATABASE [Jai] SET READ_WRITE 
GO 
ALTER DATABASE [Jai] SET RECOVERY FULL 
GO 
ALTER DATABASE [Jai] SET MULTI_USER 
GO 
ALTER DATABASE [Jai] SET PAGE_VERIFY CHECKSUM 
GO 
ALTER DATABASE [Jai] SET DB_CHAINING OFF 
+0

amico, usa SMO come un astander menzionato e fallo con esso. –

risposta

5
+1

ma nel link da te indicato dice chiaramente che funzionerà solo se lo script non ha l'istruzione GO ...... il mio script è per la creazione di un nuovo database ... contiene più GO .. – HotTester

+0

dare un'occhiata al secondo link, che è stato chiesto qui su SO, e il terzo link menziona anche soluzioni alternative per questo. –

+0

Per quanto ne so (non sono sicuro al 100%, ma piuttosto sicuro), non esiste una "istruzione GO" in T-Sql. È una funzionalità supportata dallo studio di gestione, non dal linguaggio SQL stesso. Gli strumenti suddividono lo script in più script e consentono al server SQL di eseguire ogni script a turno. Pertanto non sarà mai possibile che il server SQL esegua uno script contenente istruzioni GO. Dovrai dividerlo in più script tu stesso. – Pete

9

Here è un post da MSDN spiega come farlo usando SMO:

using System.Data.SqlClient; 
using System.IO; 
using Microsoft.SqlServer.Management.Common; 
using Microsoft.SqlServer.Management.Smo; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string sqlConnectionString = "Data Source=(local);Initial Catalog=AdventureWorks;Integrated Security=True"; 
      FileInfo file = new FileInfo("C:\\myscript.sql"); 
      string script = file.OpenText().ReadToEnd(); 
      SqlConnection conn = new SqlConnection(sqlConnectionString); 
      Server server = new Server(new ServerConnection(conn)); 
      server.ConnectionContext.ExecuteNonQuery(script); 
     } 
    } 
} 
+2

Penso che questo si strozzerà sulle istruzioni GO –

+0

Dovrebbe far notare che il metodo FileInfo.OpenText restituisce uno StreamReader. Vorresti assicurarti di eliminarlo. – rossisdead

+0

@RuneGrimstad Non si strozzerà su GO. Ciò sta utilizzando gli assembly di gestione di SQL Server invece dello standard SqlCommand. –

7

Quando ho bisogno di eseguire gli script SQL che contengono dichiarazioni GO Io di solito leggere l'intero file in una stringa e dividerlo in una matrice di stringhe utilizzando GO come delimitatore.

Quindi mi collego al database ed eseguo ogni istruzione in ordine.

È abbastanza semplice e funziona bene. Assicurati di mantenere aperta la connessione del tuo database durante l'esecuzione di tutte le istruzioni. Inoltre, potresti considerare di eseguirli tutti in una transazione.

+0

è l'intero processo che richiede tempo e lento ? – HotTester

+1

MSSQL transazionale è "sufficiente" per il rollback di "alter table" e simili? –

+0

@HotTester: Ho eseguito alcuni script di grandi dimensioni in questo modo e verranno eseguiti più o meno con la stessa rapidità con cui vengono eseguiti da SQL Management Console. –

Problemi correlati