복붙노트

[SQL] C # .NET을 사용하여 .SQL 스크립트 파일을 실행하는 방법

SQL

C # .NET을 사용하여 .SQL 스크립트 파일을 실행하는 방법

나는 확실히이 질문에 이미 대답 된거야,하지만 나는 검색 도구를 사용하여 답을 찾을 수 없습니다.

C #을 사용하여 나는 .SQL 파일을 실행하고 싶습니다. 는 SQL 파일은 여러 줄에 걸쳐 깨진 일부는 여러 SQL 문이 포함되어 있습니다. 나는 그러나 나는 ExecuteNonQuery는 정말이 작업을 수행 할 수 있도록 설계되었습니다 생각하지 않는다 ... 파일에 읽기 시도하고 ODP.NET을 사용하여 파일을 실행했습니다.

그래서 나는 인 UseShellExecute의 놀았어요 사실 SQLPLUS로 설정 결코 종료와 프로세스를 양산 그러나하지 않는 한 ... 프로세스를 산란을 통해 SQLPLUS를 사용했습니다. 여기에 있지 않음 작업하는 코드입니다.

Process p = new Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.FileName = "sqlplus";
p.StartInfo.Arguments = string.Format("xx/xx@{0} @{1}", in_database, s);
p.StartInfo.CreateNoWindow = true;

bool started = p.Start();
p.WaitForExit();

내가 참으로 인 UseShellExecute를 설정하지 않는 한 WaitForExit는 .... 반환하지 않습니다. 인 UseShellExecute의 부작용은 더 리디렉션 출력을 캡처 할 수 없습니다.

해결법

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

    1.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using Microsoft.SqlServer.Management.Smo;
    using Microsoft.SqlServer.Management.Common;
    using System.IO;
    using System.Data.SqlClient;
    
    public partial class ExcuteScript : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
        string sqlConnectionString = @"Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=ccwebgrity;Data Source=SURAJIT\SQLEXPRESS";
    
        string script = File.ReadAllText(@"E:\Project Docs\MX462-PD\MX756_ModMappings1.sql");
    
        SqlConnection conn = new SqlConnection(sqlConnectionString);
    
        Server server = new Server(new ServerConnection(conn));
    
        server.ConnectionContext.ExecuteNonQuery(script);
        }
    }
    
  2. ==============================

    2.나는 Microsoft.SqlServer.Management이 솔루션을 시도했지만 난 단지 .NET libs와 프레임 워크를 사용하여 다른 솔루션을 썼다 그래서 .NET 4.0와 잘 작동하지 않았다.

    나는 Microsoft.SqlServer.Management이 솔루션을 시도했지만 난 단지 .NET libs와 프레임 워크를 사용하여 다른 솔루션을 썼다 그래서 .NET 4.0와 잘 작동하지 않았다.

    string script = File.ReadAllText(@"E:\someSqlScript.sql");
    
    // split script on GO command
    IEnumerable<string> commandStrings = Regex.Split(script, @"^\s*GO\s*$", RegexOptions.Multiline | RegexOptions.IgnoreCase);
    
    Connection.Open();
    foreach (string commandString in commandStrings)
    {
        if (!string.IsNullOrWhiteSpace(commandString.Trim()))
        {
            using(var command = new SqlCommand(commandString, Connection))
            {
                command.ExecuteNonQuery();
            }
        }
    }     
    Connection.Close();
    
  3. ==============================

    3.프레임 워크 4.0 이상에이 작품. 지원하는 "GO". 또한, 오류 메시지, 라인 및 SQL 명령을 보여줍니다.

    프레임 워크 4.0 이상에이 작품. 지원하는 "GO". 또한, 오류 메시지, 라인 및 SQL 명령을 보여줍니다.

    using System.Data.SqlClient;
    
            private bool runSqlScriptFile(string pathStoreProceduresFile, string connectionString)
        {
            try
            {
                string script = File.ReadAllText(pathStoreProceduresFile);
    
                // split script on GO command
                System.Collections.Generic.IEnumerable<string> commandStrings = Regex.Split(script, @"^\s*GO\s*$",
                                         RegexOptions.Multiline | RegexOptions.IgnoreCase);
                using (SqlConnection connection = new SqlConnection(connectionString))
                {
                    connection.Open();
                    foreach (string commandString in commandStrings)
                    {
                        if (commandString.Trim() != "")
                        {
                            using (var command = new SqlCommand(commandString, connection))
                            {
                            try
                            {
                                command.ExecuteNonQuery();
                            }
                            catch (SqlException ex)
                            {
                                string spError = commandString.Length > 100 ? commandString.Substring(0, 100) + " ...\n..." : commandString;
                                MessageBox.Show(string.Format("Please check the SqlServer script.\nFile: {0} \nLine: {1} \nError: {2} \nSQL Command: \n{3}", pathStoreProceduresFile, ex.LineNumber, ex.Message, spError), "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                                return false;
                            }
                        }
                        }
                    }
                    connection.Close();
                }
            return true;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return false;
            }
        }
    
  4. ==============================

    4.배치 파일에 SQL 스크립트를 실행하는 명령을 넣어하는 것은 다음 코드 아래를 실행

    배치 파일에 SQL 스크립트를 실행하는 명령을 넣어하는 것은 다음 코드 아래를 실행

    string batchFileName = @"c:\batosql.bat";
    string sqlFileName = @"c:\MySqlScripts.sql";
    Process proc = new Process();
    proc.StartInfo.FileName = batchFileName;
    proc.StartInfo.Arguments = sqlFileName;
    proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
    proc.StartInfo.ErrorDialog = false;
    proc.StartInfo.WorkingDirectory = Path.GetDirectoryName(batchFileName);
    proc.Start();
    proc.WaitForExit();
    if ( proc.ExitCode!= 0 )
    

    이 (SQL 서버에 대한 샘플)와 같은 배치 파일 쓰기 뭔가

    osql -E -i %1
    
  5. ==============================

    5.이것은 나를 위해 작동합니다 :

    이것은 나를 위해 작동합니다 :

    public void updatedatabase()
    {
    
        SqlConnection conn = new SqlConnection("Data Source=" + txtserver.Text.Trim() + ";Initial Catalog=" + txtdatabase.Text.Trim() + ";User ID=" + txtuserid.Text.Trim() + ";Password=" + txtpwd.Text.Trim() + "");
        try
        {
    
            conn.Open();
    
            string script = File.ReadAllText(Server.MapPath("~/Script/DatingDemo.sql"));
    
            // split script on GO command
            IEnumerable<string> commandStrings = Regex.Split(script, @"^\s*GO\s*$", RegexOptions.Multiline | RegexOptions.IgnoreCase);
            foreach (string commandString in commandStrings)
            {
                if (commandString.Trim() != "")
                {
                    new SqlCommand(commandString, conn).ExecuteNonQuery();
                }
            }
            lblmsg.Text = "Database updated successfully.";
    
        }
        catch (SqlException er)
        {
            lblmsg.Text = er.Message;
            lblmsg.ForeColor = Color.Red;
        }
        finally
        {
            conn.Close();
        }
    }
    
  6. ==============================

    6.surajits 대답 추가 개선을 추가 :

    surajits 대답 추가 개선을 추가 :

    using System;
    using Microsoft.SqlServer.Management.Smo;
    using Microsoft.SqlServer.Management.Common;
    using System.IO;
    using System.Data.SqlClient;
    
    namespace MyNamespace
    {
        public partial class RunSqlScript : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
                var connectionString = @"your-connection-string";
                var pathToScriptFile = Server.MapPath("~/sql-scripts/") + "sql-script.sql";
                var sqlScript = File.ReadAllText(pathToScriptFile);
    
                using (var connection = new SqlConnection(connectionString))
                {
                    var server = new Server(new ServerConnection(connection));
                    server.ConnectionContext.ExecuteNonQuery(sqlScript);
                }
            }
        }
    }
    

    또한, 나는 내 프로젝트에 다음 참조를 추가했다 :

    C에서 여러 폴더가 있기 때문에 사용하는 것이에요 없습니다 : \ 프로그램 Files \ Microsoft SQL Server를하지만 내 응용 프로그램이 두 작품에서 나는 그 오른쪽 dll을 경우 아무 생각이 있습니다.

  7. ==============================

    7.제가 설명서를 읽어 대답을 해결하기 위해 관리 :)

    제가 설명서를 읽어 대답을 해결하기 위해 관리 :)

    은 MSDN에서이 추출물

    이에 코드를 켜;

    Process p = new Process();
    p.StartInfo.UseShellExecute = false;
    p.StartInfo.RedirectStandardOutput = true;
    p.StartInfo.FileName = "sqlplus";
    p.StartInfo.Arguments = string.Format("xxx/xxx@{0} @{1}", in_database, s);
    
    bool started = p.Start();
    // important ... read stream input before waiting for exit.
    // this avoids deadlock.
    string output = p.StandardOutput.ReadToEnd();
    
    p.WaitForExit();
    
    Console.WriteLine(output);
    
    if (p.ExitCode != 0)
    {
        Console.WriteLine( string.Format("*** Failed : {0} - {1}",s,p.ExitCode));
        break;
    }
    

    어떤 올바르게 종료합니다.

  8. ==============================

    8.배려에 두 지점이 있습니다.

    배려에 두 지점이 있습니다.

    1)이 소스 코드는 나를 위해 일한 :

    private static string Execute(string credentials, string scriptDir, string scriptFilename)
    { 
      Process process = new Process();
      process.StartInfo.UseShellExecute = false;
      process.StartInfo.WorkingDirectory = scriptDir;
      process.StartInfo.RedirectStandardOutput = true;
      process.StartInfo.FileName = "sqlplus";
      process.StartInfo.Arguments = string.Format("{0} @{1}", credentials, scriptFilename);
      process.StartInfo.CreateNoWindow = true;
    
      process.Start();
      string output = process.StandardOutput.ReadToEnd();
      process.WaitForExit();
    
      return output;
    }
    

    나는, 그래서 스크립트 내에서 그 서브 스크립트는 작업을 스크립트 디렉토리로 작업 디렉토리를 설정합니다.

    예를 들어, 호출 등 (:, "script.sql" "USR / 비밀번호 @ 서비스", "\ myscripts C")를 실행

    2) 당신은 문 EXIT하여 SQL 스크립트를 마무리해야한다;

  9. ==============================

    9.EntityFramework를 사용하면이 같은 솔루션으로 갈 수 있습니다. 나는 E2E 테스트를 초기화하는 코드를 사용합니다. 드 방지 SQL 주입 공격은, 확인 (매개 변수를 허용하는 ExecuteSqlCommand의 과부하 참조)이를 위해 사용자 입력 또는 사용 명령 매개 변수에 따라이 스크립트를 생성하지 않도록합니다.

    EntityFramework를 사용하면이 같은 솔루션으로 갈 수 있습니다. 나는 E2E 테스트를 초기화하는 코드를 사용합니다. 드 방지 SQL 주입 공격은, 확인 (매개 변수를 허용하는 ExecuteSqlCommand의 과부하 참조)이를 위해 사용자 입력 또는 사용 명령 매개 변수에 따라이 스크립트를 생성하지 않도록합니다.

    public static void ExecuteSqlScript(string sqlScript)
    {
        using (MyEntities dataModel = new MyEntities())
        {
            // split script on GO commands
            IEnumerable<string> commands = 
                Regex.Split(
                    sqlScript, 
                    @"^\s*GO\s*$",
                    RegexOptions.Multiline | RegexOptions.IgnoreCase);
    
            foreach (string command in commands)
            {
                if (command.Trim() != string.Empty)
                {
                    dataModel.Database.ExecuteSqlCommand(command);
                }
            }              
        }
    }
    
  10. ==============================

    10.나는이 작업을 수행 할 수있는 정확하고 유효한 방법을 찾을 수 없습니다. 그래서 하루 종일 후에, 나는 다른 소스와 작업을 완수하기 위해 노력에서 달성이 혼합 된 코드와 함께.

    나는이 작업을 수행 할 수있는 정확하고 유효한 방법을 찾을 수 없습니다. 그래서 하루 종일 후에, 나는 다른 소스와 작업을 완수하기 위해 노력에서 달성이 혼합 된 코드와 함께.

    하지만 여전히 예외는 ExecuteNonQuery를 생성 : CommandText 속성이 성공적으로 스크립트 파일을 실행되는 경우에도 초기화되지 않은 - 내 경우, 그것은 성공적으로 처음 시작시 데이터베이스와 삽입 데이터를 생성한다.

    public partial class Form1 : MetroForm
    {
        SqlConnection cn;
        SqlCommand cm;
        public Form1()
        {
            InitializeComponent();
        }
    
        private void Form1_Load(object sender, EventArgs e)
        {
            if (!CheckDatabaseExist())
            {
                GenerateDatabase();
            }
        }
    
        private bool CheckDatabaseExist()
        {
            SqlConnection con = new SqlConnection(@"Data Source=.\SQLEXPRESS;Initial Catalog=SalmanTradersDB;Integrated Security=true");
            try
            {
                con.Open();
                return true;
            }
            catch
            {
                return false;
            }
        }
    
        private void GenerateDatabase()
        {
    
            try
            {
                cn = new SqlConnection(@"Data Source=.\SQLEXPRESS;Initial Catalog=master;Integrated Security=True");
                StringBuilder sb = new StringBuilder();
                sb.Append(string.Format("drop databse {0}", "SalmanTradersDB"));
                cm = new SqlCommand(sb.ToString() , cn);
                cn.Open();
                cm.ExecuteNonQuery();
                cn.Close();
            }
            catch
            {
    
            }
            try
            {
                //Application.StartupPath is the location where the application is Installed
                //Here File Path Can Be Provided Via OpenFileDialog
                if (File.Exists(Application.StartupPath + "\\script.sql"))
                {
                    string script = null;
                    script = File.ReadAllText(Application.StartupPath + "\\script.sql");
                    string[] ScriptSplitter = script.Split(new string[] { "GO" }, StringSplitOptions.None);
                    using (cn = new SqlConnection(@"Data Source=.\SQLEXPRESS;Initial Catalog=master;Integrated Security=True"))
                    {
                        cn.Open();
                        foreach (string str in ScriptSplitter)
                        {
                            using (cm = cn.CreateCommand())
                            {
                                cm.CommandText = str;
                                cm.ExecuteNonQuery();
                            }
                        }
                    }
                }
            }
            catch
            {
    
            }
    
        }
    
    }
    
  11. from https://stackoverflow.com/questions/650098/how-to-execute-an-sql-script-file-using-c-sharp by cc-by-sa and MIT license