복붙노트

[SQL] 어떻게 C #을에서 .SQL을 실행할 수 있습니까?

SQL

어떻게 C #을에서 .SQL을 실행할 수 있습니까?

일부 통합 테스트를 위해 나는 데이터베이스에 연결하고 GO 문을 포함하여 실제로 실행에 시험에 필요한 스키마를 가진 .SQL 파일을 실행합니다. 어떻게 .SQL 파일을 실행할 수 있습니까? (또는 이동이 완전히 잘못된 방법이다?)

이 코드를 보여주는 MSDN 포럼에 게시물을 발견했습니다 :

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

하지만 마지막 줄에이 오류 받고 있어요 :

나는 갈 곳에서 다운로드 할 DLL이하는 말했지만, 그 소리가 매우 해키했다. 에 청소기 방법이 있나요? 그것을 할 수있는 또 다른 방법이 있나요? 내가 뭘 잘못하고 있죠?

난 비주얼 스튜디오 2008와 함께이 일을 해요, SQL 서버 2008, 닷넷 3.5SP1 및 C # 3.0.

해결법

  1. ==============================

    1.

    using Microsoft.SqlServer.Management.Common;
    using Microsoft.SqlServer.Management.Smo;
    

    당신은 쿼리를 실행하기 위해 SMO를 필요가 없습니다. 대신 SqlCommand 개체를 사용해보십시오. 이러한 사용하여 문을 제거합니다. 쿼리를 실행하려면이 코드를 사용 :

     SqlConnection conn = new SqlConnection(sqlConnectionString);
     SqlCommand cmd = new SqlCommand(script, conn);
     cmd.ExecuteNonQuery();
    

    또한, SMO에 대한 프로젝트 참조를 제거합니다. 참고 : 리소스를 제대로 정리하는 것이 좋습니다.

    ADO.NET 라이브러리는 'GO'키워드를 지원하지 않습니다. 귀하의 옵션은 다음과 같습니다 :

    사실,이 경우에는, 나는 SMO가 최선의 선택이 될 수 있다는 생각하지만, 당신은 DLL이 발견되지 않은 이유를 추적해야합니다.

  2. ==============================

    2.MSVCR80는 비주얼 C ++ 2005 런타임입니다. 당신은 런타임 패키지를 설치해야 할 수 있습니다. 자세한 내용은 http://www.microsoft.com/downloads/details.aspx?FamilyID=200b2fd9-ae1a-4a14-984d-389c36f85647&displaylang=en를 참조하십시오.

    MSVCR80는 비주얼 C ++ 2005 런타임입니다. 당신은 런타임 패키지를 설치해야 할 수 있습니다. 자세한 내용은 http://www.microsoft.com/downloads/details.aspx?FamilyID=200b2fd9-ae1a-4a14-984d-389c36f85647&displaylang=en를 참조하십시오.

    (난 당신이 뭘 하려는지 더 적합하다고 생각)을 DLL 문제와 매트 Brunell의 답변을 해결뿐만 아니라, 이러한 SQL 스크립트를 실행 (SQL 클라이언트 도구 설치에서)에 SQLCMD 명령 행 도구를 사용할 수 있습니다. 그냥 당신이 경로 위치와 함께 투쟁하지 않도록 그것은 당신의 경로에의합니다.

    이 때문에처럼 플레이 것입니다 :

    실제 명령

    SQLCMD -S myServer -D myDatabase -U myUser -P myPassword -i myfile.sql
    

    매개 변수 (경우 중요한) :

    S: server
    d: database
    U: User name, only necessary if you don't want to use Windows authentication
    P: Password, only necessary if you don't want to use Windows authentication
    i: File to run
    

    코드가 SQL 파일을 실행합니다 :

    var startInfo = new ProcessStartInfo();
    startInfo.FileName = "SQLCMD.EXE";
    startInfo.Arguments = String.Format("-S {0} -d {1}, -U {2} -P {3} -i {4}",
                                        server,
                                        database,
                                        user,
                                        password,
                                        file);
    Process.Start(startInfo);
    

    함께 SQLCMD 도구에 대한 자세한 내용은 http://msdn.microsoft.com/en-us/library/ms162773.aspx를 참조하십시오.

  3. ==============================

    3.자동으로 코드에서 생성 된 데이터베이스 스크립트를 실행하기 위해 동일한 필요를 가졌, 나는 GO 문을 제거하고 (@MattBrunell에 의해 제안) 별도의 명령에 스크립트를 분할 할 수있는 SQL 스크립트를 구문 분석 착수했다. 이동 문을 제거하는 것은 쉬웠다하지만이 여러 명령문을 망쳐 이후 분할 "\ 연구 \ n"의 문은 일을하지 않았다. 몇 가지 다른 방법 테스트, 나는 꽤 스크립트가 전혀 별도의 명령으로 분할 될 필요가 없습니다 것을 발견 놀랐습니다. 난 그냥 모든 "GO"문을 제거하는 SqlCommand에 (댓글 포함) 전체 스크립트를 보내 :

    자동으로 코드에서 생성 된 데이터베이스 스크립트를 실행하기 위해 동일한 필요를 가졌, 나는 GO 문을 제거하고 (@MattBrunell에 의해 제안) 별도의 명령에 스크립트를 분할 할 수있는 SQL 스크립트를 구문 분석 착수했다. 이동 문을 제거하는 것은 쉬웠다하지만이 여러 명령문을 망쳐 이후 분할 "\ 연구 \ n"의 문은 일을하지 않았다. 몇 가지 다른 방법 테스트, 나는 꽤 스크립트가 전혀 별도의 명령으로 분할 될 필요가 없습니다 것을 발견 놀랐습니다. 난 그냥 모든 "GO"문을 제거하는 SqlCommand에 (댓글 포함) 전체 스크립트를 보내 :

      using System.Data.SqlClient;
    
      using(SqlConnection connection = new SqlConnection(connectionString))
      using(SqlCommand command = connection.CreateCommand())
      {
        string script = File.ReadAllText("script.sql");
        command.CommandText = script.Replace("GO", "");
        connection.Open();
        int affectedRows = command.ExecuteNonQuery();
      }
    

    "> ... 스크립트를 생성 데이터베이스 - -> 작업"이 코드는 SQL 서버 2008 R2와 함께 테스트에 의해 생성 된 스크립트가되었습니다. 아래는 스크립트의 명령의 몇 가지 예입니다 :

    USE [MyDatabase]
    
    ALTER TABLE [MySchema].[MyTable] DROP CONSTRAINT [FK_MyTable_OtherTable]
    DROP TABLE [MySchema].[MyTable]
    
    SET ANSI_NULLS ON
    SET QUOTED_IDENTIFIER ON
    
    /****** Object:  Table [MySchema].[MyTable]    Script Date: 01/23/2013 13:39:29 ******/
    CREATE TABLE [MySchema].[MyTable](
        [Id] [int] IDENTITY(1,1) NOT NULL,
        [Subject] [nvarchar](50) NOT NULL,
        [Body] [nvarchar](max) NOT NULL,
     CONSTRAINT [PK_MyTable] 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]
    
    SET IDENTITY_INSERT [MySchema].[MyTable] ON
    INSERT [MySchema].[MyTable] ([Id], [Subject], [Body]) VALUES (1, N'MySubject', N'Line 1
    Line 2
    Line 3
    Multi-line strings are also OK.
    ')
    SET IDENTITY_INSERT [MySchema].[MyTable] OFF
    

    나는 스크립트를 분할해야하는 이상 단일 SqlCommand를, 일부 최대 길이가있을 수 있습니다 같아요. 문제없이 실행 내 스크립트, 1800 문 주위에 포함되어 있으며 520 KB입니다.

  4. ==============================

    4.당신은 .SQL 파일의 매우 기본적인 스크립트로이 실행 봤어? 어쩌면 하나 개의 행을 삽입하거나 임의의 테이블을 생성 무엇인가? 매우 쉽게 확인하는 것입니다 뭔가? 당신이 파일을 읽는 제외하고 하드는 SQL을 코딩처럼 본질적으로,이 코드입니다. 당신이 아주 간단한 파일 작업을 얻을 수 있다면, 나는 파일 구조 자체 가능성이 뭔가 잘못이 있다고 말할 것입니다. 포스트는 해당 파일에있을 수 없습니다 수 있는지에 관한 몇 가지 규정이 있다는 사실을 언급했다. 아무것도 경우, 문제 해결을 시작하기에 좋은 장소입니다.

    당신은 .SQL 파일의 매우 기본적인 스크립트로이 실행 봤어? 어쩌면 하나 개의 행을 삽입하거나 임의의 테이블을 생성 무엇인가? 매우 쉽게 확인하는 것입니다 뭔가? 당신이 파일을 읽는 제외하고 하드는 SQL을 코딩처럼 본질적으로,이 코드입니다. 당신이 아주 간단한 파일 작업을 얻을 수 있다면, 나는 파일 구조 자체 가능성이 뭔가 잘못이 있다고 말할 것입니다. 포스트는 해당 파일에있을 수 없습니다 수 있는지에 관한 몇 가지 규정이 있다는 사실을 언급했다. 아무것도 경우, 문제 해결을 시작하기에 좋은 장소입니다.

  5. ==============================

    5.당신이에 관심이있을 수 있습니다 : http://geekswithblogs.net/thomasweller/archive/2009/09/08/automating-database-script-execution.aspx

    당신이에 관심이있을 수 있습니다 : http://geekswithblogs.net/thomasweller/archive/2009/09/08/automating-database-script-execution.aspx

    자동으로 SQL-스크립트를 실행하는 범용 '테스트 픽스처'를 제공한다. 사용 가능한 샘플 코드도 있습니다, 그리고 종속성은 어떠한 특별한 어셈블리가없는 ...

  6. ==============================

    6.프로젝트에 대한 참조를 다음을 추가하면, 원래의 코드는 잘 작동합니다.

    프로젝트에 대한 참조를 다음을 추가하면, 원래의 코드는 잘 작동합니다.

    나는 SQL 2008 Express를 사용합니다.

    통로: C : \의 Program Files (x86) \ Microsoft SQL Server를 \ 100 \ SDK \ 어셈블리 \

    파일 : microsoft.sqlserver.smo.dll, microsoft.sqlserver.connectioninfo.dll 및 Microsoft.SqlServer.Management.Sdk.Sfc.dll

  7. from https://stackoverflow.com/questions/1449646/how-can-i-execute-a-sql-from-c by cc-by-sa and MIT license