2

我想执行文件夹中的所有 sql 文件。我发现这个问题的答案很有帮助。我可以使用他们的命令,它按预期工作。

我想从 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# 代码中

4

3 回答 3

2

如果您使用的是 C#,则应使用 C# 中可用的工具。Sql Server 有一个 SDK,它包含在 Sql Server 的安装中。

您至少需要添加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语句),然后运行查询。

于 2012-10-03T06:02:48.157 回答
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();
于 2012-10-03T05:32:24.457 回答
0

如果您想一起运行所有命令,那么简单的方法是创建batch文件
并使用它 -

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

但是如果你想运行一些命令,然后是一些 C# 代码,然后是一些命令等等,
那么你将需要多个批处理文件,这将是一种混乱的方式。

于 2012-10-03T05:05:00.710 回答