2010-02-12 88 views
10

我有一个sql脚本来创建一个新的数据库,我需要创建我们的产品时安装。为此,我需要使用c#启动脚本。 DB是sql-server 2005 express。 PLZ帮助....如何使用C#运行sql脚本

SQL脚本如下:

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

花花公子,使用SMO作为一个提到的旁观者,并做到这一点。 – 2010-02-12 09:01:24

回答

5
+1

,但在你给出的链接中,它清楚地表明它只会在脚本没有GO语句时才起作用......我的脚本是用于创建新数据库的...它包含多个GO .. – HotTester 2010-02-12 07:51:04

+0

也看看第二个链接,这是在这里问的,第三个链接也提到了解决方法。 – 2010-02-12 07:53:16

+0

据我所知(我不是100%肯定,但非常确定),在T-Sql中没有像“GO语句”那样的东西。它是由管理工作室支持的功能,而不是SQL语言本身。 这些工具将脚本分成多个脚本,并让SQL服务器依次执行每个脚本。 因此,SQL服务器永远不可能执行包含GO语句的脚本。您必须自己将其分成多个脚本。 – Pete 2010-02-12 07:57:41

9

Here是从后MSDN解释如何使用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

我认为这将窒息的GO语句 – 2010-02-12 11:11:31

+0

应该指出的是,FileInfo.OpenText方法返回一个StreamReader。你想确保你正在处理那个。 – rossisdead 2011-05-04 01:10:48

+0

@RuneGrimstad它不会在GO上窒息。这是使用SQL Server管理程序集而不是标准的SqlCommand。 – 2013-10-12 13:07:36

7

当我需要运行包含GO语句的sql脚本时,我通常会将整个文件读入一个字符串中,并使用GO作为分隔符将其分割成一个字符串数组。

我然后连接到数据库,以便运行每条语句。

这很容易,效果很好。只要确保在运行所有语句时保持数据库连接处于打开状态。你也可以考虑在交易中全部运行它们。

+0

是整个过程时间和慢 ? – HotTester 2010-02-12 08:13:35

+1

MSSQL事务处理“足够”以回滚“alter table”之类的东西吗? – 2010-02-12 08:45:38

+0

@HotTester:我已经用这种方式运行了一些大型脚本,它们的运行速度可能会像从SQL管理控制台运行一样快。 – 2010-02-12 11:12:36