c# - 为什么 SqlException 在连接失败时被重用

标签 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);
        }

出于记录目的,我想将值添加到异常的数据字典中。在第一个异常之后,我发现大多数后续异常都是 SqlException 类的完全相同的实例(使用 GetHashCode() 验证)并且已经有了我的数据字典条目。由于 key 已经存在,这会导致抛出 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'

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

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

附言如果您认为向 Exception 的数据字典中添加条目不合适,我很高兴听到您的想法,但这不会改变关于为什么重用 SqlException 实例的问题的核心。

最佳答案

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

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

关于c# - 为什么 SqlException 在连接失败时被重用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7997001/

相关文章:

exception - Powershell WebClient 下载文件异常路径中的非法字符

java - 接收 SQLException "Login failed for user"连接到 SQL Server 2008

c# - 如何将 List<AnonymousType#1> 转换为 List<Model>?

java - 问题错误检查码

C# SortedSet<T> 和相等性

c++ - 如果没有 uncaught_exception,C++ 析构函数中的异常

android - 在Android中使用ContactsContract时出现"SQLiteException: no such column: mimetype"

java - Spring JDBCTemplate 给出 InvalidResultSetAccessException Invalid column index

c# - 添加多个文本框.net

c# - ObservableCollection.Remove - 无法将 lambda 表达式转换为类型,因为它不是委托(delegate)类型