【问题标题】:How do designer-generated table adapters handle connections设计器生成的表适配器如何处理连接
【发布时间】:2009-06-05 15:06:24
【问题描述】:

表适配器如何使用连接?

稍微解释一下,他们是否会自动打开和关闭连接,或者如果我在调用 tableadapter 方法之前已经打开了连接,他们会使用它并保持打开状态吗?

问候

【问题讨论】:

    标签: .net database-connection tableadapter


    【解决方案1】:

    如果您查看设计器生成的代码,您会发现如果存在连接,则适配器会重用它,否则它会创建一个新的。执行查询方法时,如果连接未打开,则该方法将其打开。如果方法打开了它,它会在完成后关闭它。默认情况下,您会为每个表适配器获得一个新连接。

    【讨论】:

    • 如果在某个时间段内,它会通过连接池重用连接吗?
    • 这与连接管理器处理连接池的方式是正交的。由于它每次都使用相同的连接字符串(除非你做不同的事情),它们将从同一个池中提取。它是一个表适配器这一简单事实不会改变处理池的方式。如果您有兴趣,MSDN 上有一篇文章介绍了池化,但它并不特定于表适配器(也不需要):msdn.microsoft.com/en-us/library/8xx3tyca.aspx
    • 是连接字符串的基于值的比较,还是引用比较?
    • @JamieS 它使用字符串相等来处理引用和值相等。
    【解决方案2】:

    这是一个典型的设计师生成的表格适配器的功能代码:

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
        [global::System.ComponentModel.Design.HelpKeywordAttribute("vs.data.TableAdapter")]
        [global::System.ComponentModel.DataObjectMethodAttribute(global::System.ComponentModel.DataObjectMethodType.Select, true)]
        public virtual Styles.OrdersDataTable GetOrders() {
            this.Adapter.SelectCommand = this.CommandCollection[0];
            Styles.OrdersDataTable dataTable = new Styles.OrdersDataTable();
            this.Adapter.Fill(dataTable);
            return dataTable;
        }
    

    根据 MSDN,DbDataAdapter.Fill 的行为如下:

    Fill 方法使用关联的 SelectCommand 属性指定的 SELECT 语句从数据源中检索行。与 SELECT 语句关联的连接对象必须有效,但不需要打开。如果在调用 Fill 之前关闭连接,则打开它以检索数据,然后关闭。如果在调用 Fill 之前连接已打开,则它保持打开状态。

    参考:Fill Method (DataTable)

    但是,在设计器生成的插入/删除/更新中,代码如下所示:

    global::System.Data.ConnectionState previousConnectionState = this.Adapter.InsertCommand.Connection.State;
            if (((this.Adapter.InsertCommand.Connection.State & global::System.Data.ConnectionState.Open) 
                        != global::System.Data.ConnectionState.Open)) {
                this.Adapter.InsertCommand.Connection.Open();
            }
            try {
                int returnValue = this.Adapter.InsertCommand.ExecuteNonQuery();
                return returnValue;
            }
            finally {
                if ((previousConnectionState == global::System.Data.ConnectionState.Closed)) {
                    this.Adapter.InsertCommand.Connection.Close();
                }
            }
    

    【讨论】:

      【解决方案3】:

      是的,如果你之前打开过tableadapter并传递给适配器,则tableadapter保持连接打开,如果你通过关闭连接,则打开并关闭适配器,或者保留默认连接

      【讨论】:

        【解决方案4】:

        你可以这样做:

        using (var MyConnection = new SqlConnection("Connection String Here"))
        {
           var MyDataAdapter = new SqlDataAdapter("Select * from [stuff]", MyConnection);
           MyDataAdapter.Fill(MyDataSet);
        }
        

        using (var MyConnection = new SqlConnection("Connection String Here"))
        {
           var MyDataAdapter = new SqlDataAdapter();
           var SelectCommand = MyConnection.CreateCommand();
           SelectCommand.CommandText = "select * from [stuff]";
           MyDataAdapter.SelectCommand = SelectCommand;
           MyDataAdapter.Fill(MyDataSet);
        }
        

        关于连接寿命,如果没有打开,它会为你打开和关闭它。

        【讨论】:

        • 我认为他说的是设计器生成的表适配器,而不是 SqlDataAdapters。
        • 呸,我没有从问题中得到这一点,但从所选答案看来你是对的。
        【解决方案5】:

        什么时候发生

        Dim Dt As dataset1.UsersDataTable
        With New dataset1TableAdapters.UsersTableAdapter
           Dt = .GetData()
        End With
        

        连接是否保持打开状态?还是关门了?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-05-25
          • 1970-01-01
          • 2020-05-30
          • 2012-08-27
          • 2020-12-15
          • 2022-08-19
          • 2016-03-26
          相关资源
          最近更新 更多