从.NET应用程序中执行SQL Server脚本的推荐方法是什么?为什么?
我正在创建一个应用程序,我们可以从我们的安装程序运行,以便在安装我们的应用程序的早期版本时处理数据库的升级。数据库有一个版本表,我可以以编程方式访问并确定要运行哪些升级脚本以升级数据库。我将它嵌入到我们的安装程序可以调用以进行升级的应用程序中是有意义的。
我正在寻找如何最好地执行适当的升级脚本。在网上搜索我看到了通过“GO”语句拆分脚本并使用SqlCommand.ExecuteNonQuery()的建议。我也看到了使用SQL Server Management Objects (SMO)的建议。
我正在寻找有关从.NET应用程序中执行这些脚本的各种方法的优缺点的建议。
答案 0 :(得分:2)
虽然它可能无法满足您在.NET应用程序中运行的需求,但sqlcmd非常适合(和设计)用于此过程。通过实施能力解析和运行SQL脚本,您正在复制工具功能。 sqlcmd在standalone installer中提供,可以与您的应用程序捆绑在一起。
如果您选择使用链接的SqlCommand.ExecuteNonQuery()解决方案,那么对于大型脚本来说,将脚本读入更小的缓冲区以搜索“GO”语句将是更高效的内存,而不是一次性使用”
答案 1 :(得分:1)
我使用System.Diagnostics.Process并调用OSQL.exe获得了一致的结果。它为sql文件....
我创建了一个临时文件,我写了我的嵌入式sql文件,OSQL执行它,然后清理它。
process.StartInfo = new System.Diagnostics.ProcessStartInfo();
process.StartInfo.FileName = OSQLpath;
process.StartInfo.UseShellExecute = false;
...
if (!System.IO.Directory.Exists(workingDirectory))
System.IO.Directory.CreateDirectory(workingDirectory);
...
StringBuilder sbArgs = new StringBuilder();
sbArgs.Append("-S ").Append(_serverName);
sbArgs.Append(" -d ").Append(_databaseName);
sbArgs.Append(" -E");
sbArgs.Append(" -i ").Append("\"").Append(inputSQLFilePath).Append("\""); // input file
sbArgs.Append(" -o ").Append("\"").Append(System.IO.Path.Combine(workingDirectory, String.Format("osqloutput_{1}_{0}.txt", fileUnique, fileName))).Append("\""); // output file
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.Arguments = sbArgs.ToString();
process.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
process.StartInfo.CreateNoWindow = true;
...
System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.WaitCursor;
process.Start();
process.WaitForExit();
答案 2 :(得分:1)
最好的方法是满足所有功能和非功能限制的任何方法。
您需要什么样的速度,目前的情况是否有任何问题 什么是备份/失败策略
我可能会使用SqlCommand.ExecuteNonQuery(),因为它是.net运行时的一部分,不需要额外安装用户可能不需要的应用程序。
根据您的问题,我认为现有的应用程序包含大量嵌入式查询字符串。我会尝试进入一种自动将它们放在服务器上(作为存储过程)和代码内部的存储库。
不要害怕简单的文本文件或带有查询的其他配置文件。