C#SQL Server脚本更改数据库问题

C#SQL Server脚本更改数据库问题,c#,sql-server,enterprise-library,C#,Sql Server,Enterprise Library,我需要运行c#应用程序文件中的sql脚本。 问题是它创建对象并在不同的数据库上执行命令 在脚本中,每次需要更改当前数据库时,它都会使用命令 使用[databasename] 由于有许多对象创建,它多次使用命令GO,因此我一直在读取文件,直到找到一个GO命令并在数据库中运行该语句;到目前为止还不错,但是在命令运行之后,连接返回到默认数据库(本例中为master),忽略最后一个USE语句 这是我用来读取文件和执行脚本的代码 似乎在执行sp_reset_conction的每个ExecuteNonQue

我需要运行c#应用程序文件中的sql脚本。 问题是它创建对象并在不同的数据库上执行命令

在脚本中,每次需要更改当前数据库时,它都会使用命令

使用[databasename]

由于有许多对象创建,它多次使用命令
GO
,因此我一直在读取文件,直到找到一个GO命令并在数据库中运行该语句;到目前为止还不错,但是在命令运行之后,连接返回到默认数据库(本例中为master),忽略最后一个USE语句

这是我用来读取文件和执行脚本的代码

似乎在执行sp_reset_conction的每个ExecuteNonQuery命令后都会清除连接(这是我在探查器中得到的)

有什么优雅而简单的方法来完成这个吗

谢谢

他的博客上有一篇关于测试工具和结果的文章。读起来好像他有一个和你描述的相似的问题

有两种方法可以做到这一点,你必须评估哪种方法最适合你,以及哪种方法是否有任何连锁效应

  • 明确地打开和关闭数据库连接。因此,您需要创建一个
    SqlConnection
    并对其调用
    open()
    ,而不仅仅是用
    SqlDatabase
    打开数据库
  • 只需在连接字符串中添加
    Connection Reset=False
    。但是,我不知道这种方法的优缺点,所以不知道是否有任何副作用,因为我知道这会禁用连接池。在应用程序/实用程序的上下文中,您将比我更清楚
  • 我建议阅读所有血淋淋的细节,然后做一点挖掘,看看哪一个对你最合适。

    他的博客上有一篇关于测试工具和结果的文章。读起来好像他有一个和你描述的相似的问题

    有两种方法可以做到这一点,你必须评估哪种方法最适合你,以及哪种方法是否有任何连锁效应

  • 明确地打开和关闭数据库连接。因此,您需要创建一个
    SqlConnection
    并对其调用
    open()
    ,而不仅仅是用
    SqlDatabase
    打开数据库
  • 只需在连接字符串中添加
    Connection Reset=False
    。但是,我不知道这种方法的优缺点,所以不知道是否有任何副作用,因为我知道这会禁用连接池。在应用程序/实用程序的上下文中,您将比我更清楚

  • 我建议阅读所有血淋淋的细节,然后做一点挖掘,看看哪一个最适合你。

    我会说解析出使用[数据库],并存储它。然后在所有查询字符串组合在一起后,将其添加到每个新查询字符串的开头。像这样:

        using (StreamReader reader = new StreamReader(databaseScriptFile)) 
          {
              DatabaseFactory.CreateDatabase(); 
              Database db = new SqlDatabase(connectionstring); 
              txbuilder = new StringBuilder(); 
              bool lastExecute = true;
              string useDB = "";   
              while (!reader.EndOfStream) 
              { 
                  text = reader.ReadLine();
                  if (text.Substring(0, 3) == "USE")
                  {
                      useDB = text;
                  }
                  else if (text.Trim().ToUpper() != "GO") 
                  { 
                      lastExecute = false; 
                      txbuilder.AppendLine(text); 
                  } 
                  else 
                  { 
                      lastExecute = true;
                      strQuery = useDB + txbuilder.ToString();
                      db.ExecuteNonQuery(CommandType.Text, strQuery); 
                      txbuilder.Length = 0; 
                  } 
              } 
              //Make sure that the last sentence is executed 
              if (!lastExecute) 
                  db.ExecuteNonQuery(CommandType.Text, txbuilder.ToString()); 
          }
    
    请注意,如果该行是USE[databasename],它会将其放入useDB中,而不会将其添加到txbuilder变量中。因此,每次“填充”txbuilder时,都会将useDB和它一起附加到strQuery中,然后运行查询。然后,每个查询都以“使用[databasename]”开头


    而且,每次你使用一个新的用法,它都会切换到使用那个数据库。

    我会说,解析出用法[数据库],并存储它。然后在所有查询字符串组合在一起后,将其添加到每个新查询字符串的开头。像这样:

        using (StreamReader reader = new StreamReader(databaseScriptFile)) 
          {
              DatabaseFactory.CreateDatabase(); 
              Database db = new SqlDatabase(connectionstring); 
              txbuilder = new StringBuilder(); 
              bool lastExecute = true;
              string useDB = "";   
              while (!reader.EndOfStream) 
              { 
                  text = reader.ReadLine();
                  if (text.Substring(0, 3) == "USE")
                  {
                      useDB = text;
                  }
                  else if (text.Trim().ToUpper() != "GO") 
                  { 
                      lastExecute = false; 
                      txbuilder.AppendLine(text); 
                  } 
                  else 
                  { 
                      lastExecute = true;
                      strQuery = useDB + txbuilder.ToString();
                      db.ExecuteNonQuery(CommandType.Text, strQuery); 
                      txbuilder.Length = 0; 
                  } 
              } 
              //Make sure that the last sentence is executed 
              if (!lastExecute) 
                  db.ExecuteNonQuery(CommandType.Text, txbuilder.ToString()); 
          }
    
    请注意,如果该行是USE[databasename],它会将其放入useDB中,而不会将其添加到txbuilder变量中。因此,每次“填充”txbuilder时,都会将useDB和它一起附加到strQuery中,然后运行查询。然后,每个查询都以“使用[databasename]”开头


    此外,每次您使用新的数据库时,它都会切换到使用该数据库。

    这与“企业库”有什么关系?我使用企业库的数据库对象来运行脚本这与“企业库”有什么关系?我使用企业库的数据库对象来运行脚本