[SQL] C # .NET을 사용하여 .SQL 스크립트 파일을 실행하는 방법
SQLC # .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.
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.나는 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.프레임 워크 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.배치 파일에 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.이것은 나를 위해 작동합니다 :
이것은 나를 위해 작동합니다 :
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.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.제가 설명서를 읽어 대답을 해결하기 위해 관리 :)
제가 설명서를 읽어 대답을 해결하기 위해 관리 :)
은 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.배려에 두 지점이 있습니다.
배려에 두 지점이 있습니다.
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.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.나는이 작업을 수행 할 수있는 정확하고 유효한 방법을 찾을 수 없습니다. 그래서 하루 종일 후에, 나는 다른 소스와 작업을 완수하기 위해 노력에서 달성이 혼합 된 코드와 함께.
나는이 작업을 수행 할 수있는 정확하고 유효한 방법을 찾을 수 없습니다. 그래서 하루 종일 후에, 나는 다른 소스와 작업을 완수하기 위해 노력에서 달성이 혼합 된 코드와 함께.
하지만 여전히 예외는 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 { } } }
from https://stackoverflow.com/questions/650098/how-to-execute-an-sql-script-file-using-c-sharp by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 어떻게 ID 값을 얻기 위해 INSERT 문 OUTPUT 절을 사용합니까? (0) | 2020.03.16 |
---|---|
[SQL] 오라클에서 대소 문자를 구분 검색 (0) | 2020.03.16 |
[SQL] MySQL의 테이블 열 이름을 얻기? (0) | 2020.03.16 |
[SQL] 어떻게 무작위 SQL에서 행을 선택하려면? (0) | 2020.03.16 |
[SQL] COUNT (*) 대 수 (1) 대 수 (PK) : 더 나은 무엇입니까? [복제] (0) | 2020.03.16 |