我有一个批处理文件,其中包含使用文件夹中的修补程序还原数据库的命令。我想创建一个GUI应用程序,它可以执行SQL命令,而不是应用文件夹中的所有补丁。
我目前在批处理文件中有以下sqlcmd:
sqlcmd -E -S(local) -i "c:\temp\MergedPatchFiles.sql"
文件夹中的补丁已编号 - 我需要一种方法来查找数据库的当前补丁号和文件夹中的补丁数,并使用for for each循环仅应用所需的补丁。
如何在指定的数据库上使用C#执行'apply patch'SQL命令?
答案 0 :(得分:1)
将sql文件加载到字符串中并使用SqlCommand.ExecuteNonQuery方法 http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executenonquery.aspx
答案 1 :(得分:1)
您可以通过多种方式实现:
Process.Start
直接执行sqlcmd
(甚至直接执行批处理文件......)答案 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种不同的方案来跟踪修订:
审计表可以像修补程序编号的列,完成时间的列或更复杂的like this example一样简单。
版本表有时是我可以在我工作的公司中获得的最多。至少,它只需要2或3列和1行。该表的结构永远不应更改,以便应用程序的第51版可以打开由版本2生成的数据库。
我工作过的大多数公司没有计划通过确定在版本17中添加了table_Q来跟踪数据库在侦探工作以外的版本,但是在版本19中添加了view_P并在版本21中删除了所以这个数据库可能是版本19或20.
我的一位朋友上周正在和我谈论DotNetNuke,他声称有一些补丁方案可以检测掉到目录中的补丁,确定它们是否已被应用并处理没有的。我会看看能否从他那里得到更好的细节。