将SqlConnection传递给类在dispose之后丢失其连接字符串

Bis*_*tro 2 .net c# sql-server

我有以下简单的类定义(Windows控制台应用程序):

样品按预期进行

using System;

namespace ConsoleApplication1 {

    class Test: IDisposable {
        string Text;

        public Test(string str) {
            Text = str;
        }

        public void print() {
            Console.WriteLine("Text: " + Text);
        }

        public void Dispose() {
            Text = "";
        }
    }

    class Program {
        static void Main(string[] args) {
            string TeXT = "Data Source=localhost;Initial Catalog=master;";

            using (Test test = new Test(TeXT)) {
                test.print();
            }

            using (Test test = new Test(TeXT)) {
                test.print();
            }

            Console.ReadKey();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,我传递string给一个IDisposabletest.一旦代码超出范围,它就会被处理掉.正如预期的那样TeXT,在第一次处理测试后没有触及局部变量,并且可以像测试类一样访问第二个测试类实例.

现在这是真实的场景让我头疼了好几个小时.

实际结果

using System;
using System.Data;
using System.Data.SqlClient;

namespace ConsoleApplication1 {

    class Test: IDisposable{
        SqlConnection dbConn;

        public Test(SqlConnection connection){
            dbConn = connection;
        }

        public void print(){
            Console.WriteLine("Connection" + dbConn.ConnectionString);
        }

        public void Dispose() {
            dbConn.Dispose();
        }
    }

    class Program {
        static void Main(string[] args) {
            SqlConnection sqlConn = new SqlConnection("Data Source=localhost;Initial Catalog=master;");

            using(Test test = new Test(sqlConn)){
                test.print();
            }

            using(Test test = new Test(sqlConn)){
                test.print();
            }

            Console.ReadKey();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

与我之前传递SqlConnection给第一个test类的实例相同.处理完第一个实例后,SqlConnection丢失连接字符串.这使得它不适用于下一个类实例.

问题 为什么在第二种情况下我丢失了ConnectionString?这是一个错误还是故意的?是否有任何解决方案可以避免这种情况,除了与DB Server建立多个连接?我应该停止处理内部连接实例吗?

注意 SqlCommand-SqlConnection使用Disposing问题不回答我的问题

Jon*_*eet 8

SqlConection当你处置掉的时候你处理了Test- 但是你又试图再次使用它.

最好的方法几乎总是SqlConnection每次需要时创建一个新的- 并在完成后立即处理它.您已经在做第二部分了,但是您应该为第二部分创建一个新SqlConnection实例.

请注意,这并不意味着必须与服务器建立多个连接 - .NET连接池将处理需要多少实际网络连接.

  • @Bistro:听起来你只需要将池配置为最大大小为1.我不记得你是怎么做到的,但我确信它可以在配置文件中.如果你需要在一个事务中执行多个操作,它们*应该*使用单个`SqlConnection` - 但是你不应该在操作之间处理它. (2认同)