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
    {
        ...
    }
}

当我调试代码时,{/ {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的所有使用,并自己在本地处理程序集,因此我确切地知道引用/使用了什么。这样就解决了问题。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...