首页 > 解决方案 > 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”不准确。

运行调试或发布时

运行应用程序时:

@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

标签: c#sql-serversqlconnection

解决方案


所以,如果它对其他人有帮助,这是我的解决方案;

我发现它与 Microsoft.Data.SqlClient.dll 程序集有关 - 或者更具体地说是 Microsoft.Data.SqlClient.SNI.x64.dll。我不知道程序安装了哪个错误版本与调试器使用的是什么,但有些不对劲。(我在调试会话中只能看到与 Microsoft.Data.SqlClient.dll 相关的 2.0.20168.4 的匹配版本)

我最终放弃了 NuGet 的所有使用并在本地自己处理程序集,所以我确切地知道引用/使用了什么。这解决了这个问题。


推荐阅读