如何使用c#向数据库应用补丁?

本文关键字:应用 补丁 数据库 何使用 | 更新日期: 2023-09-27 18:13:45

我有一个批处理文件,其中包含使用文件夹中的补丁恢复数据库的命令。我想做一个可以执行SQL命令的GUI应用程序,而不是应用文件夹中的所有补丁。

我目前在批处理文件中有以下sqlcmd:

sqlcmd -E -S(local) -i "c:'temp'MergedPatchFiles.sql"

文件夹中的补丁被编号-我需要一种方法来查找数据库的当前补丁编号和文件夹中的补丁数量,并使用a为每个循环只应用所需的补丁。

我如何使用c#在指定的数据库上执行'apply patch' SQL命令?

如何使用c#向数据库应用补丁?

您可以通过以下几种方式:

  • 使用Process.Start直接执行sqlcmd(甚至直接执行批处理文件…)
  • 加载SQL并使用ADO执行它。净

将sql文件装入字符串并使用SqlCommand。ExecuteNonQuery方法http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executenonquery.aspx

如果你的文件有GO语句,你可能会遇到问题,所以你可以使用这种方法:

string scriptDirectory = "c:''temp''sqltest''";
string sqlConnectionString = "Integrated Security=SSPI;" + 
            "Persist Security Info=True;Initial Catalog=Northwind;Data Source=(local)";
DirectoryInfo di = new DirectoryInfo(scriptDirectory);
FileInfo[] rgFiles = di.GetFiles("*.sql");
foreach (FileInfo fi in rgFiles)
{
    FileInfo fileInfo = new FileInfo(fi.FullName);
    string script = fileInfo.OpenText().ReadToEnd();
    SqlConnection connection = new SqlConnection(sqlConnectionString);
    Server server = new Server(new ServerConnection(connection));
    server.ConnectionContext.ExecuteNonQuery(script);
}

我需要一种方法来找到数据库的当前补丁号…

首先,如何在数据库中存储当前所处的修订数据库?我遇到过三种不同的跟踪修订的方案:

  1. DDL审计表,
  2. 包含1行版本号的表
  3. "nothing"——你必须根据哪些列、表、视图和存储进程来猜测这是数据库的哪个版本。

审计表可以简单到用一列表示补丁号,可以用一列表示完成时间,也可以更复杂,如本例所示。

在我工作的公司里,版本表有时是我最能逃脱的。至少,它只需要2或3列和1行。该表的结构不应该改变,以免版本51的应用程序可以打开版本2创建的数据库。

我工作过的大多数公司都没有方案来跟踪数据库的版本,除了通过找出table_Q是在版本17中添加的,但是view_P是在版本19中添加的,在版本21中删除,所以这个数据库可能是版本19或20。

我的一个朋友上周和我谈论DotNetNuke,他声称其中有一些补丁方案可以检测掉到目录中的补丁,确定它们是否已经被应用,并处理那些没有被应用的补丁。我看看能不能从他那儿打听到更多的细节。