C# 按要求的顺序执行SQL脚本
我需要创建一个小实用程序来在SQLServer2008R2上执行sql文件,我已经尝试了以下代码C# 按要求的顺序执行SQL脚本,c#,.net,sql-server-2008-r2,C#,.net,Sql Server 2008 R2,我需要创建一个小实用程序来在SQLServer2008R2上执行sql文件,我已经尝试了以下代码 private static void ExecuteScripts() { string sqlConnectionString = "UID=sa;password=passw0rd;Data Source=somesqlserver\\db01"; DirectoryInfo info = new DirectoryInfo(@"c:\dxsh\); F
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
我只需要按此顺序执行文件,请帮助如果您知道要执行文件的顺序,只需按您期望的顺序获取文件:
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
这样,您不需要在程序中硬编码文件名,但仍然可以保证顺序,只需在执行脚本之前对文件名进行排序。我想您不希望将文件名硬编码到代码中 在这种情况下,您应该重命名文件,使其按字母顺序排列,这可以通过在文件名前加一个数字(如01、02等)轻松实现,这样第一个文件将是
01 1.8_DatabaseAndUsers.sql
等等
Directory.GetFiles()
应按字母顺序返回文件,但您可以使用以下代码检索文件名并将其添加到列表中,然后按字母顺序显式排序:
// Get a list of files and add them to a list
List<string> fileList = new List<string>();
foreach (string item in Directory.GetFiles(@"c:\dxsh", "* 1.8*"))
fileList.Add(item);
fileList.Sort();
// Go through each file in the list order
for (int i = 0; i < fileList.Count; i++)
{
string filename = fileList[i];
string script = File.ReadAllText(filename);
// Run your code
}
//获取文件列表并将其添加到列表中
List fileList=新列表();
foreach(Directory.GetFiles(@“c:\dxsh”,“*1.8*”)中的字符串项)
文件列表。添加(项);
Sort();
//按列表顺序浏览每个文件
for(int i=0;i
我建议您将文件重命名为1.8.1_xx,1.8.2_xxx。。。按照文件的顺序名称排序并执行。感谢您的回答,但是是否有更通用的方法让文件按要求的顺序执行,我有9个DB,每个DB都有8到9个sql文件要执行。你能给我一个逻辑上的建议吗names@CSharped:我已经做到了这一点-在文件名本身中包含顺序,然后您可以对它们进行排序(例如,使用LINQ的OrderBy
方法,或Array.sort
)