使用 ExecuteNonQuery c# 时出错

Posted

技术标签:

【中文标题】使用 ExecuteNonQuery c# 时出错【英文标题】:Error while using ExecuteNonQuery c# 【发布时间】:2018-12-05 01:31:38 【问题描述】:

我在使用ExecuteNonQuery时遇到问题。

这是我的代码:

var connString = @"Data Source=serwer01;Initial Catalog=PolsatCyfrowy;Integrated Security=True";

FileInfo file = new FileInfo("C:\\Users\\azbudniewek\\source\\repos\\UM2 V2\\UM2 V2\\scripts.sql");
string script = file.OpenText().ReadToEnd();

SqlConnection conn = new SqlConnection(connString);
Server server = new Server(new ServerConnection(conn));
server.ConnectionContext.ExecuteNonQuery(script);

这是错误:

System.IO.FileNotFoundException:无法加载文件或设置“Microsoft.SqlServer.BatchParser,版本 = 14.100.0.0,文化 = 中性,PublicKeyToken = 89845dcd8080cc91”或其公司之一。文件无法下载。 文件名:'Microsoft.SqlServer.BatchParser,版本 = 14.100.0.0,文化 = 中性,PublicKeyToken = 89845dcd8080cc91'

在 System.Reflection.RuntimeAssembly.GetType 中(RuntimeAssembly 集,字符串名称,布尔 throwOnError,布尔 ignoreCase,ObjectHandleOnStack) 在 System.Reflection.RuntimeAssembly.GetType(字符串名称,布尔 throwOnError,布尔 ignoreCase)

我阅读了很多有问题的解决方案,但无能为力。

我应该只安装另一个 SQL Server 吗?我已经在我的计算机上安装了 SQL Server 2014,并且带有程序集的文件夹如下所示:

Screenshot

我应该怎么做才能避免这个问题?我想我的程序集文件夹中应该有版本 14.100.0.0 但不知道如何更新它。也许有人知道?

【问题讨论】:

您为什么不使用标准的 SQL Server 客户端相关类?使用SQLCommand 而不是Microsoft.SqlServer.Management.Common.ServerConnection。顺便说一句,关于连接到 SQL Server 的 Microsoft 上有很好的信息。 我认为 dll 应该存在于文件夹 C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\Extensions\Microsoft\SQLCommon\130 你需要复制它从那里到这里。 C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\Microsoft\VisualStudio\v15.0\Web 是什么让您“认为”程序集在您的文件夹中?请检查一下。通过上下文菜单,设置您可以检查它的版本。如果文件不存在,请检查编辑器中的程序集设置。在 assmlby/dll 上的 VS 上下文菜单中,首选项中,将“本地副本”设置为 true。这样会为您的构建文件夹创建一个副本,而不是使用本地副本,而本地副本可能不存在于另一台计算机上。 这违背了“保持简单”的原则。如果您不做花哨的事情,则应考虑删除这些引用并使用常规的System.Data.SqlClient.SqlCommand 我只是使用 SMO,因为需要从文件中加载长脚本,不能在“SQLCommand”中执行 【参考方案1】:

使用 NuGet 安装 SMO,然后安装 VC++ 2013 Redistributables

SMO 现在是deployed via NuGet。 NuGet page is here。

在"System Requirements" 下注明——“使用 NetFx SMO 库安装的一些本机二进制文件还需要安装 VC 2013 运行时;该运行时不包含在包中。”

因此,在通过 NuGet 安装 SMO 后,为您的代码架构(x86 / x64)手动安装 VC++ Redistributables;这是 Microsoft.SqlServer.BatchParserClient.dll 所依赖的依赖。

【讨论】:

【参考方案2】:

我也遇到过类似的问题。在我的设置中,我有一个 WPF 应用程序,它使用一个类库,该类库又通过 NuGet 包引用 Microsoft.SqlServer.SqlManagement 对象 (SMO)(版本 140.17283.0)。

试了很多,终于发现WPF应用除了类库外,还需要通过NuGet引用SMO库。

所以我只是在解决方案级别通过 NuGet 添加了 SMO 库,并将其安装到类库和 WPF 应用程序中。瞧,它奏效了!!! (如果Microsoft.SqlServer.BatchParserClient.dll 仅在类库中被引用,则似乎没有正确引用它,这很奇怪,但它解决了问题)

【讨论】:

【参考方案3】:

你应该在你的项目中添加缺少的 dll,如果你发布你的项目,你必须把这个 dll 放到 bin 文件夹中。

【讨论】:

我怎样才能在 pucket NuGet 中找到像你一样的版本 14.100.0.0? 我已经安装了 Microsoft.SqlServer.SqlManagementObjects 版本 140.17265.0 仍然没有这个 BatchParser【参考方案4】:

我遇到了类似的问题。我有一个使用 Microsoft.SqlServer.SqlManagementObjects nuget 包的 SMO 应用程序。

该应用程序在我的电脑上完美运行,但是在我们的应用程序服务器上部署和运行它时,我遇到了错误。

无法加载文件或程序集“Microsoft.SqlServer.BatchParser.dll”或其依赖项之一。找不到指定的模块。

为了解决这个问题,我需要再次针对 x86 平台构建项目。

【讨论】:

是的,当我执行 x86 时,它就是这样!

以上是关于使用 ExecuteNonQuery c# 时出错的主要内容,如果未能解决你的问题,请参考以下文章

使用 sybase AseCommand 运行 ExecuteNonQuery() 时出错

c# ExecuteNonQuery 总是返回零

c#: ExecuteNonQuery() 返回 -1

ExecuteNonQuery 出错

C# 用command.ExecuteNonQuery() 执行update语句界面卡死,也不报错!??使用的是oracle数据库

C# sqlserver ExecuteNonQuery()方法详解