在SqlConnection.CacheConnectionStringProperties()的.NET代码中出现了NullReferenceException异常。

14

我面临着一个非常奇怪的问题。给出下面的代码:

static void Main()
{
    var c = new System.Data.SqlClient.SqlConnection();

    c.ConnectionString = "Data Source=SOME_NAME;Initial Catalog=SOME_DB;Integrated Security=True";
    c.ConnectionString = ""; //null also triggers exception

    Console.WriteLine("Success");
}

它一直运行良好,但在最新版本的Windows 10(1803)上,该版本具有.NET Version 4.7.03056 Release 461808(似乎是4.7.2),它会出现以下异常而崩溃:

Unhandled Exception: System.NullReferenceException: Object reference not set to an instance of an object.
   at System.Data.SqlClient.SqlConnection.CacheConnectionStringProperties()
   at System.Data.SqlClient.SqlConnection.set_ConnectionString(String value)
   at TestCacheConnectionStringProperties.Program.Main()

如果我删除ConnectionString的任何赋值语句,第二个赋值就会崩溃。

我查看了源代码,没有找到可能导致NullReferenceException的地方(然而源代码似乎是针对.NET Framework 4.7.1的,所以可能有所改变)。

现在的问题是 - 是什么导致了这个问题?这是.NET的一个bug吗?如果是 - 如何解决它?

更新:根据评论 - 非常感谢大家 - 问题是由这些行引起的(反编译):

private void CacheConnectionStringProperties()
{
  SqlConnectionString connectionOptions = this.ConnectionOptions as SqlConnectionString;
  if (connectionOptions != null)
    this._connectRetryCount = connectionOptions.ConnectRetryCount;

  //Seems like this is causing the bug because it is not inside of null-check-if for connectionOptions variable
  if (this._connectRetryCount != 1 || !ADP.IsAzureSqlServerEndpoint(connectionOptions.DataSource))
    return;
  this._connectRetryCount = 2;
}

它与Azure有一定关系,与现有资源不太相同。

我在这里发布了该问题,并等待回复。


3
这是CacheConnectionStringProperties的一个漏洞,可能只存在于某些版本中。我反编译了4.7.3056.0程序集并发现一个调用ADP.IsAzureSqlServerEndpoint(sqlConnectionString.DataSource)的语句,但它不应该位于检查sqlConnectionString是否为null之外。然而,我在这里找不到这段代码(https://github.com/dotnet/corefx/blob/master/src/System.Data.SqlClient/src/System/Data/SqlClient/SqlConnection.cs/#L104)。所以我不确定这些代码来自何处。 - Jeroen Mostert
6
我不喜欢问题在被标记为重复之前甚至都没有被阅读。 - adjan
1
@Evk 很难做到,当你找不到相关的错误跟踪器时。也许我们应该使用 Twitter 错误跟踪器。 - Panagiotis Kanavos
3
@PanagiotisKanavos:我相信这是一个将改善Azure情况的功能,一旦它工作100%,甚至可能是一个非常好的功能,但更令人担忧的是,该版本的二进制位似乎没有任何公开可用的源代码。 要么是某人的私有分支进入了构建中,要么就是发布框架位的构建步骤在任何地方都没有记录。 两种可能性都不太吸引人,但只要这是一个错误而不是结构性缺陷,那就没关系了。 - Jeroen Mostert
1
对于那些在弹窗之后来到这里的人,反编译显示 if (this._connectRetryCount == 1 && ADP.IsAzureSqlServerEndpoint(connectionOptions.DataSource)) { this._connectRetryCount = 2; } 在 null 检查块之后。如果 connectionOptions 为空,则会抛出 NRE 异常。 - Panagiotis Kanavos
显示剩余14条评论
1个回答

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接