我需要创建一个小实用程序来在SQL SERVER 2008R2上执行sql文件,我试过以下代码
private static void ExecuteScripts()
{
string sqlConnectionString = "UID=sa;password=passw0rd;Data Source=somesqlserver\\db01";
DirectoryInfo info = new DirectoryInfo(@"c:\dxsh\);
FileInfo[] fileInfos = info.GetFiles("1.8*");
foreach (var fileInfo in fileInfos)
{
string script = fileInfo.OpenText().ReadToEnd();
var conn = new SqlConnection(sqlConnectionString);
var server = new Server(new ServerConnection(conn));
server.ConnectionContext.ExecuteNonQuery(script);
}
}
我将在文件夹
中包含以下文件1. 1.8_DatabaseAndUsers.sql
2. 1.8_TablesAndTypes.sql
3. 1.8_Views.sql
4. 1.8_KeysAndIndex.sql
5. 1.8_ProceduresAndFunction.sql
我只需按此顺序执行文件,请帮助
答案 0 :(得分:3)
如果您知道要执行文件的顺序,只需按照预期的顺序获取文件:
string[] files = { "1.8_DatabaseAndUsers.sql", "1.8_TablesAndTypes.sql", ... };
foreach (var file in files)
{
// Simpler way of reading files (and doesn't leave the file handle open)
string text = File.ReadAllText(file);
// using statement to avoid leaking resources
using (var conn = new SqlConnection(...))
{
var server = new Server(new ServerConnection(conn));
server.ConnectionContext.ExecuteNonQuery(script);
}
}
基本上,您不应该依赖GetFiles
返回文件的顺序 - 如果您想按特定顺序使用这些文件,请自行执行。
另一种选择是使用GetFiles
,但要确保文件名可以正确排序,例如。
1.8_01_DatabaseAndUsers.sql
1.8_02_TablesAndTypes.sql
1.8_03_Views.sql
1.8_04_KeysAndIndex.sql
1.8_05_ProceduresAndFunction.sql
这样您就不需要对程序中的名称进行硬编码,但您仍然可以保证顺序,只需在执行脚本之前对文件名进行排序即可。
答案 1 :(得分:0)
我认为您不希望将文件名硬编码到代码中。
在这种情况下,您应该重命名文件,使其按字母顺序排列,这可以通过在其名称前面放一个数字(例如01,02等)来轻松实现,因此第一个文件将是{ {1}}等等。
01 1.8_DatabaseAndUsers.sql
应按字母顺序返回文件,但您可以使用以下代码检索文件名并将其添加到列表中,然后将其显式排序为字母顺序:
Directory.GetFiles()