如何使用C#将补丁应用于数据库?

时间:2011-11-08 17:30:07

标签: c# sql

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

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

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

文件夹中的补丁已编号 - 我需要一种方法来查找数据库的当前补丁号和文件夹中的补丁数,并使用for for each循环仅应用所需的补丁。

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

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

您可以通过多种方式实现:

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

答案 2 :(得分:1)

如果您的文件包含GO语句,则可能会遇到问题,因此您可以使用this approach

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);
}

答案 3 :(得分:1)

  

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

首先,您如何在数据库中存储您当前所在的修订数据库?我发现了3种不同的方案来跟踪修订:

  1. DDL审核表,
  2. 包含1行版本号
  3. 的表格
  4. “nothing” - 您必须根据哪些列,表,视图和存储过程来猜测数据库的哪个版本。
  5. 审计表可以像修补程序编号的列,完成时间的列或更复杂的like this example一样简单。

    版本表有时是我可以在我工作的公司中获得的最多。至少,它只需要2或3列和1行。该表的结构永远不应更改,以便应用程序的第51版可以打开由版本2生成的数据库。

    我工作过的大多数公司没有计划通过确定在版本17中添加了table_Q来跟踪数据库在侦探工作以外的版本,但是在版本19中添加了view_P并在版本21中删除了所以这个数据库可能是版本19或20.

    我的一位朋友上周正在和我谈论DotNetNuke,他声称有一些补丁方案可以检测掉到目录中的补丁,确定它们是否已被应用并处理没有的。我会看看能否从他那里得到更好的细节。