从.NET应用程序执行SQL Server脚本的最佳实践?

从.NET应用程序执行SQL Server脚本的最佳实践?,.net,sql-server,.net,Sql Server,从.NET应用程序中执行SQL Server脚本的推荐方法是什么?为什么 我正在创建一个应用程序,我们可以从我们的安装程序运行,以便在安装应用程序的早期版本时升级数据库。数据库有一个版本表,我可以通过编程访问该表,并确定要运行哪些升级脚本来升级数据库。对于我来说,将其嵌入到一个应用程序中是有意义的,我们的安装程序可以调用该应用程序来进行升级 我正在寻找如何最好地执行适当的升级脚本。在网上搜索时,我看到了一些建议,建议用“GO”语句拆分脚本,并使用。我也看到了使用的建议 我正在寻找关于在.NET应

从.NET应用程序中执行SQL Server脚本的推荐方法是什么?为什么

我正在创建一个应用程序,我们可以从我们的安装程序运行,以便在安装应用程序的早期版本时升级数据库。数据库有一个版本表,我可以通过编程访问该表,并确定要运行哪些升级脚本来升级数据库。对于我来说,将其嵌入到一个应用程序中是有意义的,我们的安装程序可以调用该应用程序来进行升级

我正在寻找如何最好地执行适当的升级脚本。在网上搜索时,我看到了一些建议,建议用“GO”语句拆分脚本,并使用。我也看到了使用的建议


我正在寻找关于在.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();

虽然它可能无法特别满足您在.NET应用程序中运行的需要,但它非常适合(并经过设计)此过程。通过实现解析和运行SQL脚本的功能,您可以复制该工具的功能。sqlcmd以可与应用程序捆绑的形式提供


如果您选择使用链接的SqlCommand.ExecuteOnQuery()解决方案,则对于大型脚本来说,将脚本读入较小的缓冲区搜索“GO”语句,而不是一次全部搜索,会更节省内存。

最好的方法是满足所有功能和非功能约束的任何方法

你需要什么样的速度,目前的情况有什么问题吗 您的备份/故障策略是什么

我可能会使用SqlCommand.ExecuteOnQuery(),因为它是.net运行时的一部分,不需要额外安装用户可能不需要的应用程序

从您的问题来看,我假定存在一个包含大量嵌入式查询字符串的现有应用程序。我会尝试将代码放入某种类型的存储库中,自动将它们放在服务器上(作为存储过程)和代码中


不要害怕简单的文本文件或其他带有查询的配置文件。

我倾向于使用SqlCommand.ExecuteNonQuery()。我们在数据库中有一个版本表,并将定义在版本之间升级的脚本,这些脚本都将受源代码控制。这个应用程序有一个自己开发的ORM,我正在专门为这个应用程序开发安装程序。这种技术似乎是你最好的选择,你甚至可以将SQL语句包装在一组事务中,并逐步确认它是否被正确应用,失败时回滚等。此技术存在问题,您必须从外部可执行文件解析I/O。使用.NETAPI最有意义。