c# - Microsoft.Data.SqlClient.SqlConnection 在调试/发布中工作,但在安装程序中失败
问题描述
我有一个可以运行的 C# 程序,但是在升级到 VS 2019 / .NET 4.8 后,安装的程序突然开始失败。在尝试了各种降级和x86、x64测试等之后,我终于尝试调试运行代码,错误似乎是这样的:
private static ServerConnection GetServerConnection( string ConnectionString )
{
Microsoft.Data.SqlClient.SqlConnection Test = new Microsoft.Data.SqlClient.SqlConnection(ConnectionString);
ServerConnection conn = new ServerConnection(Test);
try
{
...
}
}
当我调试代码时,SqlConnection
对象创建正常/连接。但是当我运行编译后的程序时,该SqlConnection
对象充满了空值,然后ServerConnection
失败并带有 a NullException
(不足为奇)。我为连接字符串使用了一个参数,它可以工作 - 它与已安装程序中的连接字符串完全相同(我知道是因为我在“正在运行的程序”上运行了一个调试会话(附加了一个调试器)。
有谁知道出了什么问题?我不知道如何进一步调试代码。调试会话和正在运行/安装的程序之间可以更改什么?
我连接的 SQL Server 是 2019 版(也尝试了 2016 实例,同样的问题)
连接字符串:
Data Source=<ServerName>;Initial Catalog=master;Integrated Security=True;
编辑以回答评论:@jpsh:我是 SQL 实例上的系统管理员和安装程序的机器上的管理员。如果可能是这种情况,我会期待某种“拒绝访问”?
@Steve:我使用的是实际的 ServerName,只是将其编辑了。(和正在运行的程序使用相同)。我向你保证,这不是问题。
@Karen & @user2864740:我已经发布了两个不同 SqlConnection 对象的“测试”的本地变量——唯一的区别是它的运行位置。从 VS 或正在运行的程序中调试/发布。抱歉,如果“填充 Null”不准确。
运行调试或发布时
- ConnectionString "Data Source=(ActualCName);Initial Catalog=master;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False" 字符串
- 测试 {Microsoft.Data.SqlClient.SqlConnection} Microsoft.Data.SqlClient.SqlConnection AccessToken 空字符串
- CanRaiseEvents true bool ClientConnectionId {00000000-0000-0000-0000-000000000000} System.Guid
- ConnectionString "Data Source=(ActualCName);Initial Catalog=master;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False" 字符串
- 连接超时 30 个整数
- 容器空 System.ComponentModel.IContainer
- 凭据 null Microsoft.Data.SqlClient.SqlCredential
- 数据源“(ActualCName)”字符串
- 数据库“主”字符串 DbProviderFactory {Microsoft.Data.SqlClient.SqlClientFactory} System.Data.Common.DbProviderFactory {Microsoft.Data.SqlClient.SqlClientFactory}
- 设计模式 false 布尔
- 事件 {System.ComponentModel.EventHandlerList} System.ComponentModel.EventHandlerList
- FireInfoMessageEventOnUserErrors false bool
- PacketSize 8000 整数
- ServerVersion 'Test.ServerVersion' 引发了类型为 'System.InvalidOperationException' 字符串 {System.InvalidOperationException} 的异常
- 站点 null System.ComponentModel.ISite
- 状态关闭 System.Data.ConnectionState
- StatisticsEnabled false bool
- WorkstationId "EUIBIWKS04" 字符串 静态成员
非公共成员 - conn null Microsoft.SqlServer.Management.Common.ServerConnection
运行应用程序时:
- 测试 {Microsoft.Data.SqlClient.SqlConnection} Microsoft.Data.SqlClient.SqlConnection
- AccessToken 'Test.AccessToken' 抛出了类型为 'System.NullReferenceException' 的异常 string {System.NullReferenceException} CanRaiseEvents true bool
- ClientConnectionId 'Test.ClientConnectionId' 引发了类型为 'System.NullReferenceException' System.Guid {System.NullReferenceException} 的异常
- ConnectionString 'Test.ConnectionString' 引发了类型为 'System.NullReferenceException' 字符串 {System.NullReferenceException} 的异常
- ConnectionTimeout 'Test.ConnectionTimeout' 引发了“System.NullReferenceException” int {System.NullReferenceException} Container null System.ComponentModel.IContainer 类型的异常
- 凭据“Test.Credential”引发了“System.NullReferenceException”Microsoft.Data.SqlClient.SqlCredential {System.NullReferenceException} 类型的异常
- 数据源“Test.DataSource”引发了类型为“System.NullReferenceException”字符串 {System.NullReferenceException} 的异常
- 数据库“Test.Database”引发了“System.NullReferenceException”字符串 {System.NullReferenceException} 类型的异常
- DbProviderFactory 'Test.DbProviderFactory' 引发了类型为 'System.NullReferenceException' System.Data.Common.DbProviderFactory {System.NullReferenceException} DesignMode false bool 的异常
- 事件 {System.ComponentModel.EventHandlerList} System.ComponentModel.EventHandlerList
- FireInfoMessageEventOnUserErrors“Test.FireInfoMessageEventOnUserErrors”引发了“System.NullReferenceException”类型的异常 bool {System.NullReferenceException}
- PacketSize 'Test.PacketSize' 引发了类型为 'System.NullReferenceException' int {System.NullReferenceException} 的异常
- ServerVersion“Test.ServerVersion”引发了“System.NullReferenceException”类型的异常字符串 {System.NullReferenceException} 站点 null System.ComponentModel.ISite
- 状态“Test.State”引发了“System.NullReferenceException”System.Data.ConnectionState {System.NullReferenceException} 类型的异常
- StatisticsEnabled 'Test.StatisticsEnabled' 引发了类型为 'System.NullReferenceException' bool {System.NullReferenceException} 的异常
- WorkstationId 'Test.WorkstationId' 引发了类型为 'System.NullReferenceException' 字符串 {System.NullReferenceException} 的异常
@David Browne:我正在使用 SMO 检查/更新/更正数据库。它似乎是完成这项工作的最佳工具,但如果您有其他建议,那么我会全力以赴 :) 我检查过,并使用来自 NuGet 的上述 SMO 版本。
问题签名:
问题事件名称:CLR20r3
问题签名 01:Ui.Console
问题签名 02:1.1.0.1
问题签名 03:5f5e4a0a
问题签名 04:Microsoft.Data.SqlClient
问题签名 05:2.0.20168.4
问题签名 06:b0b81829
问题签名 07:120
问题签名 08:0
问题签名 09:System.NullReferenceException
操作系统版本:6.3.9600.2.0.0.400.8
区域设置 ID:1030
附加信息 1:ca7f
附加信息 2:ca7f81a57f0d6c81935dea0aa57fa2df
附加信息 3:947f
附加信息 4:947ef24682d
解决方案
所以,如果它对其他人有帮助,这是我的解决方案;
我发现它与 Microsoft.Data.SqlClient.dll 程序集有关 - 或者更具体地说是 Microsoft.Data.SqlClient.SNI.x64.dll。我不知道程序安装了哪个错误版本与调试器使用的是什么,但有些不对劲。(我在调试会话中只能看到与 Microsoft.Data.SqlClient.dll 相关的 2.0.20168.4 的匹配版本)
我最终放弃了 NuGet 的所有使用并在本地自己处理程序集,所以我确切地知道引用/使用了什么。这解决了这个问题。
推荐阅读
- c++ - 将由 Struct 构建的数组传递给将数据从文件存储到数组中的函数
- sqlite - 在支持 Oracle "schema.package.function(IN, OUT)" 的内存中
- c# - C# 调用以 char ** 指针作为参数的 C API
- c++ - G++和CL(VS2017)都编译成功但是cl编译的可执行文件运行异常
- r - 修改 R 代码以生成不同的输出
- angular - 如何获取选定的mat-tree节点的父节点
- c# - 是列表
C# 中的单链表、双链表还是数组? - android - 尝试使用 RetrofitClient 并订阅,但在使用 Kotlin 时遇到问题
- sql-server - 要求使用 excel 报告中的列数识别报告
- apache - 如何使用 XAMPP 运行多个 PHP 版本?