[英]Best practices for executing SQL Server Scripts from a .NET Application?
从.NET应用程序中执行SQL Server脚本的推荐方法是什么?为什么?
我正在创建一个应用程序,我们可以从我们的安装程序运行,以便在安装我们的应用程序的早期版本时处理数据库的升级。 数据库有一个版本表,我可以以编程方式访问并确定要运行哪些升级脚本以升级数据库。 我将它嵌入到我们的安装程序可以调用以进行升级的应用程序中是有意义的。
我正在寻找如何最好地执行适当的升级脚本。 在网上搜索我已经看到了通过“GO”语句拆分脚本并使用SqlCommand.ExecuteNonQuery()的建议 。 我也看到了使用SQL Server管理对象(SMO)的建议 。
我正在寻找有关从.NET应用程序中执行这些脚本的各种方法的优缺点的建议。
我使用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();
最好的方法是满足所有功能和非功能限制的任何方法。
您需要什么样的速度,当前情况是否有任何问题您的备份/故障策略是什么?
我可能会使用SqlCommand.ExecuteNonQuery(),因为它是.net运行时的一部分,不需要额外安装用户可能不需要的应用程序。
根据您的问题,我假设存在一个包含大量嵌入式查询字符串的现有应用程序。 我会尝试进入一种自动将它们放在服务器上(作为存储过程)和代码内部的存储库。
不要害怕简单的文本文件或带有查询的其他配置文件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.