2012-10-03 52 views
2

我想執行文件夾中的所有sql文件。我在this question找到答案很有幫助。我可以使用他們的命令,並按預期工作。如何在C#代碼中編寫此DOS命令?

我想從C#代碼運行它。我嘗試了一些方法,但我無法得到結果。以下是我嘗試過的代碼,但沒有成功。

Process process = new Process(); 
Process process = new Process(); 
process.StartInfo.UseShellExecute = false; 
process.StartInfo.RedirectStandardOutput = true; 
process.StartInfo.RedirectStandardError = true; 
process.StartInfo.CreateNoWindow = true; 
process.StartInfo.FileName = "cmd.exe"; 
process.StartInfo.Arguments = string.Format("for %f in ({2}/*.sql) do sqlcmd /S {0} /d {1} /U {3} /P {4} /E /i {5}", 
sqlServerName, databaseName, folder, sqlUserName, sqlPassword, @"""%f"""); 
process.StartInfo.WorkingDirectory = @"C:\"; 
process.Start(); 
process.WaitForExit(); 

我想知道我怎麼可以將這個DOS命令for %f in (*.sql) do sqlcmd /S <servername> /d <dbname> /E /i "%f"成C#代碼

回答

0

如果你想運行的所有命令組合在一起那麼簡單的方法是創建batch文件
和使用本 -

Process myProcess = new Process(); 
myProcess = Process.Start(@"Test.bat"); 

但是,如果你想運行一些命令然後一些C#代碼然後再次一些命令等
那麼你將需要multipl E批處理文件,這將是混亂的方式。

1

此代碼可以幫助...

var SqlFile = @"..."; 
var Command = new SqlCommand 
{ 
    CommandType = CommandType.Text, 
    Connection = new SqlConnection() 
}; 
Command.Connection.Open(); 
foreach (var CommandText in File.ReadAllText(SqlFile).Replace("GO", ";").Split(';')) 
{ 
    Command.CommandText = CommandText; 
    Command.ExecuteNonQuery(); 
} 
Command.Connection.Close(); 
+0

+1爲正確的方式,但你可以張貼更多的解釋爲什麼這種方式更好。 –

+0

:(由於'Select'行'刪除+1',如果腳本包含一個'GO',或者它裏面有'GO',將會刪除您的代碼 –

+0

使用時,我們會刪除一條命令,但正如您所說GO是問題,所以我們應該檢查之前和之後的新行字符(或)使用ReadAllLines並用GO代替行; – Amir

2

如果您使用的是C#,你應該在C#中使用可用的工具給你。 Sql Server有一個包含在Sql Server安裝中的SDK。

您需要添加至少Microsoft.SqlServer.Smo.dllMicrosoft.SqlServer.ConnectionInfo.dll才能使用以下代碼。

ServerConnection connection = new ServerConnection(sqlServerName, sqlUserName, sqlPassword); 
Server server = new Server(connection); 
Database database = server.Databases[databaseName]; 

foreach (var sqlFile in Directory.EnumerateFiles(folder, "*.sql")) 
{ 
    //Parses the file and runs the batches 
    database.ExecuteNonQuery(File.ReadAllText(sqlFile)); 
} 

這將會讀取每個文件,掰開文件批次(GO語句),然後運行查詢。

+0

我試過你的代碼,但它引發了一個異常 - 「ExecuteNonQuery數據庫失敗'xx'。 「你知道問題是什麼嗎? – Anonymous

+0

是否有內部異常? –

+0

單擊」將異常的詳細信息複製到剪貼板「,然後編輯您的問題幷包含複製錯誤中的文本。 –