none
關於Using及command.Close() 問題 RRS feed

  • 問題

  •  

    各位先進,搜尋文章中發現一篇Using 區塊、command.Close() 同時使用會大幅降低效能?

    上面提到使用Using後不該呼叫.close()

    以下是我的一段程式碼,不知道我這樣寫是否也不需呼叫.close()

     

    using (Database db = (Database)Utility.CreateInstance(ServerConfig.DBAssembly, ServerConfig.AcountDBType, new object[] { ServerConfig.AccountDBConnStr }))
                {
                    using (DbCommand cmd = db.GetCommand())
                    {
                        cmd.CommandText = "dbo.SearchA";
                        cmd.CommandType = CommandType.StoredProcedure;
                        cmd.Parameters.Add(db.GetParameter("@PageIndex", db.TypeMapper.Int, 0, null, pageIndex));
                        cmd.Parameters.Add(db.GetParameter("@PageSize", db.TypeMapper.Int, 0, null, pageSize));
                        cmd.Parameters.Add(db.GetParameter("@A1", db.TypeMapper.VarChar, 20, null, A1));
                        cmd.Parameters.Add(db.GetParameter("@A2", db.TypeMapper.NVarChar, 20, null, A2));
                        cmd.Parameters.Add(db.GetParameter("@A3", db.TypeMapper.VarChar, 10, null, A3));
                        cmd.Parameters.Add(db.GetParameter("@A4", db.TypeMapper.DateTime, 0, null, A4));
                        cmd.Parameters.Add(db.GetParameter("@A5", db.TypeMapper.DateTime, 0, null, A5));
                        cmd.Parameters.Add(db.GetParameter("@A6", db.TypeMapper.Int, 0, null, A6));
                        cmd.Parameters.Add(db.GetParameter("@A7", db.TypeMapper.NVarChar, 24, null, A7));
                        cmd.Parameters.Add(db.GetParameter("@A8", db.TypeMapper.VarChar, 20, null, A8));
                        cmd.Parameters.Add(db.GetParameter("@A9", db.TypeMapper.Int, 0, null, A9));
                        cmd.Parameters.Add(db.GetParameter("@A10", db.TypeMapper.VarChar, 10, null, A10));

                        return db.LoadDataSet(cmd);
                    }
                }

            public virtual System.Data.DataSet LoadDataSet(DbCommand cmd)
            {
                DataSet data = new DataSet();

                cmd.Connection = this._conn;

                DbDataAdapter da = this.GetDataAdapter();
                da.SelectCommand = cmd;

                try
                {
                    da.Fill(data);
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                finally
                {
                    if (da != null)
                        da.Dispose();
                    if (cmd != null)
                        cmd.Dispose();
                    this.Close();
                }

                return data;
            }

            public virtual void Close()
            {
                try
                {
                    if (this._conn != null)
                    {
                        if (this._conn.State != ConnectionState.Closed)
                        {
                            this._conn.Close();
                        }
                    }
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }

    2008年10月22日 上午 06:02

解答

  • 如果只有使用 DataAdapter 來存取資料庫的話,你不用親自管理連線,讓 DataAdapter 管理即可。

    2008年10月22日 上午 06:46
    版主
  • 看你要接受哪種說法而定,有些人喜歡用 using (),有些人喜歡使用 Close()。

    我個人是使用後者的方式。

     

    2008年10月22日 上午 10:39
    版主

所有回覆

  • 如果只有使用 DataAdapter 來存取資料庫的話,你不用親自管理連線,讓 DataAdapter 管理即可。

    2008年10月22日 上午 06:46
    版主
  •  小朱 寫信:

    如果只有使用 DataAdapter 來存取資料庫的話,你不用親自管理連線,讓 DataAdapter 管理即可。

     

    依您所言,我應該把this.close()拿掉,讓DataAdapter 管理

              finally
                {
                    if (da != null)
                        da.Dispose();
                    if (cmd != null)
                        cmd.Dispose();
                    //this.Close();
                }

     

    其他像ExecuteNonQueryExecuteScalarConnection close交給End Using清除資源,是嗎?

     還有,Command.Dispose()交給End Using清除資源嗎?

    2008年10月22日 上午 09:38
  • 看你要接受哪種說法而定,有些人喜歡用 using (),有些人喜歡使用 Close()。

    我個人是使用後者的方式。

     

    2008年10月22日 上午 10:39
    版主
  • using()對於某些地方很好用,但對於資料庫連線最好不要,因為它好像會將資料庫傳回來的例外資訊吃掉.

     

    2008年10月23日 上午 12:30