1

我需要创建一个小实用程序来在 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 

我只需要按此顺序执行文件,请帮助

4

2 回答 2

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

这样您就不需要在程序中对名称进行硬编码,但您仍然可以保证顺序,只需在执行脚本之前对文件名进行排序即可。

于 2013-08-06T10:23:07.760 回答
0

我想您不希望将文件名硬编码到您的代码中。

在这种情况下,您应该重命名文件,使它们按字母顺序排列,这可以通过在它们的名称前加上一个数字(例如 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
}
于 2013-08-06T10:27:11.233 回答