为什么SqlException在连接失败时重用

时间:2011-11-03 14:54:35

标签: c# exception sqlexception

在以下代码中,连接字符串密码故意不正确,导致在打开连接时出现SqlException。

        while (true)
        {
            try
            {
                SqlConnection conn = new SqlConnection("Server=localhost;Database=northwind;UID=sa;PWD=b;");
                conn.Open();
            }
            catch (Exception ex)
            {
                try
                {
                    Console.Write(ex.GetHashCode() + " : ");
                    ex.Data.Add("MyKey", "LogData");
                    Console.WriteLine(ex.Message);
                }
                catch (Exception ex2)
                {
                    Console.WriteLine(ex2.Message);
                }
            }
            Thread.Sleep(500);
        }

出于日志记录的目的,我想将值添加到Exception的Data字典中。在第一个异常之后,我发现大多数后续异常是SqlException类的完全相同的实例(使用GetHashCode()验证)并且已经有我的数据字典条目。这会导致由于密钥已存在而抛出ArgumentException。

34826618 : Login failed for user 'sa'.
34826618 : Item has already been added. Key in dictionary: 'MyKey'  Key being added: 'MyKey'
34826618 : Item has already been added. Key in dictionary: 'MyKey'  Key being added: 'MyKey'
34826618 : Item has already been added. Key in dictionary: 'MyKey'  Key being added: 'MyKey'

我意识到我可以更改它以使用Data属性上的键控setter,这将添加或替换该条目,但我担心重用可能导致记录无效的数据条目。此外,从新代码执行中抛出的异常与抛出的先前异常的实例相同似乎很奇怪。

有什么见解?你可以重现这个吗?

P.S。如果你不认为在Exception的数据字典中添加条目是合适的,我会很高兴听到你的想法,但它并没有改变关于为什么重用SqlException实例的问题的核心。

1 个答案:

答案 0 :(得分:0)

正如其他人所说,这可能与性能有关。

为了解决您的问题,我建议您在完成记录其内容或停止重新抛出时清除字典。