2009-07-28 2 views
2

SQL 스크립트를 수동으로 구문 분석하고 각 구문을 개별적으로 실행해야합니까, 아니면 더 좋은 방법이 있습니까? 프로그래밍 방식으로 솔루션을 찾고있는 Iam은 이미이 작업을 수행 할 수있는 도구가 있음을 알고 있습니다. 솔루션이 sqlite뿐 아니라 모든 데이터베이스 시스템에서 작동하면 좋을 것입니다.C# : 프로그래밍 방식으로 SQL 스크립트를 데이터베이스로 가져 오는 방법?

+0

레코드를 데이터베이스로 가져 오시겠습니까? – jn29098

+0

스크립트의 출처를 물어 볼 수 있습니까? 이 정보는 대답에 영향을 줄 수 있습니다 ... Rob –

답변

2

나는이 SqlLite에 어떻게 적용되는지 모르겠지만, 나는 SQLSERVER에 다음과 같은 코드를 사용했습니다 :

protected virtual void ExecuteScript(SqlConnection connection, string script) 
{ 
    string[] commandTextArray = script.Split(new string[] { "GO" }, StringSplitOptions.RemoveEmptyEntries); // See EDIT below! 
    connection.Open(); 
    foreach (string commandText in commandTextArray) 
    { 
     if (commandText.Trim() == string.Empty) continue; 
     SqlCommand command = new SqlCommand(commandText, connection); 
     command.ExecuteNonQuery(); 
    } 
    connection.Close(); 
} 

(경고 : 나는 내 원래의 코드를 수정했습니다 조금 그래서 이것은이다 테스트되지 않은 코드)

ADO.NET을 통해 스크립트를 실행할 때 "GO"라는 단어가 문제가되므로 코드가 "GO"를 구분 기호로 사용하여 전체 스크립트에서 Split() 작업을 수행 한 다음 루프합니다. 명령 배열을 통해 한 번에 하나씩 실행합니다.

편집 :

즉 "GO"다른 단어의 일부로서 스크립트에 표시 될 수 아래 마크의 코멘트는 확실히 유효한 관심사입니다 @. 위의 코드를 작성했을 때 "GO"가 배치 구분 기호로만 나타나는지 확인하기 위해 스크립트를 검색했습니다. 다른 방법 (의도적 인 말장난)은 모든 스크립트를 편집하여 "GO"뒤에는 항상 같은 주석 (예 : "- SPLIT HERE!")이 올 수 있습니다. 구분 기호를 "GO - SPLIT HERE!"로 변경하십시오. 그러나 스크립트를 편집해야합니다. 또 다른 옵션은 Regex.Split()입니다.이 옵션을 사용하면 GO 전에 공백을 확인할 수 있습니다. 필자의 스크립트에서는 배치 분리 기호가 항상 고유 한 행을 사용합니다.

string[] commandTextArray = System.Text.RegularExpressions.Regex.Split(script, "\r\n[\t ]*GO"); 

결론 일괄 분리에 대한 일부 서식 일관성이 정확하게 스크립트를 분할 할 필요가 있다는 것입니다 : 같은 규칙 스크립트에 적용되는 경우, 다음과 같이 작동해야한다.

+0

따옴표, 주석, 대소 문자가 혼합 된 GO를주의하십시오. 예를 들어 다른 단어의 일부로 GO하십시오. –

+0

감사합니다. @ 마크, 좋은 의견입니다. 나는 나의 대답을 업데이트했다. – devuxer

+0

SqlCommand 명령 = 새 SqlCommand (스크립트, 연결); 은 이어야합니다. SqlCommand 명령 = 새 SqlCommand (commandText, 연결); – WowtaH

2

DbCommand.ExecuteNonQuery 메서드를 사용하면 데이터베이스에 대해 모든 SQL을 실행할 수 있습니다. 하는 SqlCommand와

샘플 : 그 여러 일괄 명령을 분할하기 때문에, 당신이 'GO'가 포함되어있는 경우 명령을 분할해야 할 수 있습니다 다른 답변에서 제안한 것처럼

var command = new SqlCommand("CREATE TABLE foo ...", connection); 
command.ExecuteNonQuery(); 

.

+0

빈 줄과 주석을 포함하여 여러 가지 다른 SQL 문이 포함 된 큰 문자열을 실행할 수 있습니까? – codymanix

+0

예, 변경하지 않고 SQL에 명령을 보냅니다. –

1

저는 SqlLite에 익숙하지 않지만 대부분의 RDBMS '는 세미콜론으로 끝내면 여러 문장을 보낼 수 있습니다. 일부는 MSSQL과 마찬가지로 개행 문자를 문장 종결 자로 받아들입니다. 세미콜론 + 개행 문자가 가장 행복해지며 올바른 형식의 코드도 생성됩니다.

MSSQL에서 일괄 분리 기호가있는 경우 일반적으로 "GO"입니다. 그런 다음 클라이언트가 구문 분석 한대로 작업을 조금 더해야합니다. MSSQL을 처리하는 데 coupleofsolutions이 있었지만, 이식성 (있는 경우)을 모르겠습니다. Haack이 최고의 출발점이라고 생각합니다.

+0

SQLite는 세미콜론을 허용합니다. – MyItchyChin

0

다음 코드에서 Config.Database.CreateCommandText는 데이터베이스에서 테이블과 인덱스를 만들기위한 세미콜론으로 분리 된 명령문의 모음입니다. 다음은 System.Data.SQLite를 사용하지 않고 DB를 생성합니다.내가 당국이의 대답에 동의 오전

private SQLiteCommand command; 
private SQLiteConnection connection; 

connection = new SQLiteConnection(Config.Database.ConnectionString.ToString()); 
connection.Open(); 

command = connection.CreateCommand(); 

SQLiteConnection.CreateFile(Config.Database.Path); 

command.CommandText = Config.Database.CreateCommandText; 

command.ExecuteNonQuery(); 
0

: 취급 "GO"SQL 스크립트의 구분 - SQL Server 폴더에서 찾을 수 있습니다 당신이 DDLs 필요합니다 http://weblogs.asp.net/jgalloway/archive/2006/11/07/Handling-_2200_GO_2200_-Separators-in-SQL-Scripts-2D00-the-easy-way.aspx 쉬운 방법을 "C : \ Program 파일 (x 86) \ 마이크로 소프트 SQL 서버 \ 100 \ SDK \ 어셈블리 \ "

Microsoft.SqlServer.ConnectionInfo.dll 
Microsoft.SqlServer.Management.Sdk.Sfc.dll 
Microsoft.SqlServer.Smo.dll 

도 필요 호환 Framwork, 그래서 당신의 설정 파일에이 줄을 추가합니다. 이 게시물에 주어진

<startup useLegacyV2RuntimeActivationPolicy="true"> 
    <supportedRuntime version="v4.0" /> 
</startup> 

대답은 더 세련 될 필요가있다. 예를 들어 예외 처리 및 롤백 가능 ... SQL 트랜잭션에 대한 자세한 내용은 http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqltransaction.aspx을 확인하십시오.

관련 문제