2012-10-03 55 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

单击”将异常的详细信息复制到剪贴板“,然后编辑您的问题并包含复制错误中的文本。 –