问题描述
我有一个可以运行的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
{
...
}
}
当我调试代码时,{/ {1}}对象创建成功/已连接。但是,当我运行编译后的程序时,sqlConnection
对象中填充了空值,然后sqlConnection
失败,并出现了ServerConnection
(不足为奇)。我对连接字符串使用了一个参数,该参数有效-并且它与已安装程序中的连接字符串完全相同(我知道这是因为我在“正在运行的程序”(附带调试器)上运行了调试会话。
有人对错在哪里有想法吗?我不知道如何进一步调试代码。在调试会话和正在运行/已安装的程序之间可以更改什么?
我要连接的sql Server是2019版(也尝试了2016年实例,同样的问题)
连接字符串:
NullException
编辑以回答评论: @jpsh:我是sql实例上的sysadmin和安装程序的计算机上的admin。如果可以的话,我期望某种“访问被拒绝”吗?
@Steve:我正在使用实际的ServerName,只是对其进行了编辑。 (和正在运行的程序使用相同的)。我向你保证,那不是问题。
@Karen&@ user2864740:我发布了两个不同sqlConnection对象的'Test'的局部信息-唯一的区别是它的运行位置。从VS或正在运行的程序中进行调试/发布。抱歉,“用Null填充不正确”。
运行调试或发布版本
- ConnectionString“数据源=(ActualCName);初始目录=主服务器;集成安全性= True;连接超时= 30; Encrypt = False; TrustServerCertificate = False; ApplicationIntent = ReadWrite; MultisubnetFailover = False”字符串
- 测试{Microsoft.Data.sqlClient.sqlConnection} Microsoft.Data.sqlClient.sqlConnection Accesstoken空字符串
- CanRaiseEvents true布尔 ClientConnectionId {00000000-0000-0000-0000-000000000000} System.Guid
- ConnectionString“数据源=(ActualCName);初始目录=主服务器;集成安全性= True;连接超时= 30; Encrypt = False; TrustServerCertificate = False; ApplicationIntent = ReadWrite; MultisubnetFailover = False”字符串
- ConnectionTimeout 30 int
- 容器为null的System.ComponentModel.IContainer
- 凭据null Microsoft.Data.sqlClient.sqlCredential
- 数据源“(ActualCName)”字符串
- 数据库“主”字符串 DbProviderFactory {Microsoft.Data.sqlClient.sqlClientFactory} System.Data.Common.DbProviderFactory {Microsoft.Data.sqlClient.sqlClientFactory}
- DesignMode错误布尔值
- 事件{System.ComponentModel.EventHandlerList} System.ComponentModel.EventHandlerList
- FireInfoMessageEventOnUserErrors假布尔值
- PacketSize 8000 int
- ServerVersion'Test.ServerVersion'抛出了类型为'system.invalidOperationException'字符串{system.invalidOperationException} 的异常
- Site null System.ComponentModel.ISite
- 状态已关闭System.Data.ConnectionState
- StatisticsEnabled错误布尔值
- WorkstationId“ EUIBIWKS04”字符串
静态成员
非公共成员 - conn null Microsoft.sqlServer.Management.Common.ServerConnection
运行应用程序时:
- 测试{Microsoft.Data.sqlClient.sqlConnection} Microsoft.Data.sqlClient.sqlConnection
- Accesstoken'Test.Accesstoken'引发了类型为'System.NullReferenceException'字符串的异常{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} 容器为空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错误布尔值
- 事件{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} 网站空的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:947f2c7f58b90d4f468320329b80ef49
解决方法
因此,如果对其他人有帮助,这是我的解决方案;
我发现这与程序集Microsoft.Data.SqlClient.dll有关,或更确切地说是Microsoft.Data.SqlClient.SNI.x64.dll。我不知道程序中安装了哪个错误版本,而调试器使用了什么版本,但是有些错误。 (我在调试会话中只能看到与Microsoft.Data.SqlClient.dll有关的匹配版本2.0.20168.4)
我最终放弃了对NuGet的所有使用,并自己在本地处理程序集,因此我确切地知道引用/使用了什么。这样就解决了问题。