ベースから、SQLhelperから

19366 ワード

最初に考えた問題はこの3つです.
1.AccessもSQLServerも使えます.
2.できるだけ簡単で、はっきりしている.
3.性能に大きな問題はない.
    public class SQLHelp

    {

        #region  



        private static string ConnStr = ConfigurationManager.ConnectionStrings["SqlConnection"].ConnectionString;

        private static string ProviderType = ConfigurationManager.AppSettings["ProviderType"].ToString();

        private DbConnection _Conn;

        private static DbProviderFactory DbFactory=DbProviderFactories.GetFactory(ProviderType);

        private DbCommand _Cmd = DbFactory.CreateCommand();



        private string _CmdText;

        private CommandType _CmdType;

        #endregion

        #region  

        private DbConnection Conn

        {

            get

            { return _Conn; }

            set

            { _Conn = value; }

        }



        public DbCommand Cmd

        {

            get { return _Cmd; }

            set { _Cmd = value; }

        }

        public string CmdText

        {

            get { return _CmdText; }

            set

            {

                _CmdText = value;

                _Cmd.CommandText = value;

            }

        }



        public CommandType CmdType

        {

            get { return _CmdType; }

            set 

            { 

                _CmdType = value;

                _Cmd.CommandType = value;

            }

        }

        #endregion

        #region  

        private void OpenCon()

        {

            try

            {

                if (Conn == null)

                {

                    Conn = DbFactory.CreateConnection();

                }

                if (Conn.State == ConnectionState.Closed)

                {

                    Conn.ConnectionString = ConnStr;

                    Conn.Open();

                }

            }

            catch (Exception ex)

            {



                throw (new Exception("" + ex.Message));

            }

        }

        private void CloseCon()

        {

            if (Conn.State == ConnectionState.Open)

            {

                Conn.Close();

            }

        }

        #endregion

        /// <summary>

        ///  SQL ( 、 、 )

        /// </summary>

        /// <returns> </returns>

        public int ExecuteNonQuery()

        {

            OpenCon();

            try

            {

                return Cmd.ExecuteNonQuery();

            }

            catch (Exception ex)

            {

                throw (new Exception(" : " + ex.Message));

            }

            finally

            {



                CloseCon();

            }

        }



        /// <summary>

        ///   DataAdapter   DataTable,  DataTable  

        /// </summary>

        /// <returns>DataTable</returns>

        public DataTable ExecuteDataTable()

        {

            OpenCon();

            try

            {

                using (DbDataAdapter da =DbFactory.CreateDataAdapter())

                {

                    da.SelectCommand = Cmd;

                    DataTable dt = new DataTable();

                    da.Fill(dt);

                    return dt;

                }

            }

            catch (Exception ex)

            {

                throw (new Exception(" :" + ex.Message));

            }

            finally

            {

                CloseCon();

            }

        }
  }
}

 
 
書く過程で多くの問題が発見された:各属性は静的ではなく、初期値をどこで行うべきか、属性の書き方が適切かどうか、関数を構築する必要はありません.最も主要な疑問:SQL文の実行が終わったらすぐにCmdを解放したほうがいいか、それとも複数のCmdを待って同じCmdで実行したほうがいいか.
先輩にメールを送り、先輩に返事をします.
問題1、どんな工場、抽象的な工場、あるいは工場の方法を使うかを場合によって決める.問題2、接続もコマンドも使い終わったらすぐに解放します.あなたのやり方では、データベースの接続リソースをずっと占有しています.SQL SERVERの接続数はもともと少ないので、個人的にはよくないと思います.質問3、この質問にはきっぱり答えない.ADOを見ることをお勧めします.NETの考え方は,なぜ接続を提供した後に切断接続を提供したのかを考える.接続を切断するのは、データを読み取り終わったらすぐに接続リソースを解放するためです.接続プールが管理されているので、繰り返し接続しても大丈夫です.コード方面の異常処理私はプログラムの中で統一処理をして、補助クラスの中で異常処理コードをつけません.
これは変更後の第2版です.
 public class SQLHelp

    {

        #region  



        private static string ConnStr = ConfigurationManager.ConnectionStrings["SqlConnection"].ConnectionString;

        private static string ProviderType = ConfigurationManager.AppSettings["ProviderType"].ToString();

        private DbConnection _Conn;

        private static DbProviderFactory DbFactory=DbProviderFactories.GetFactory(ProviderType);

        private DbCommand _Cmd;



        private string _CmdText;

        private CommandType _CmdType = CommandType.Text;

        #endregion

        #region  

        private DbConnection Conn

        {

            get

            { return _Conn; }

            set

            { _Conn = value; }

        }



        public DbCommand Cmd

        {

            get { return _Cmd; }

            set { _Cmd = value; }

        }

        public string CmdText

        {

            get { return _CmdText; }

            set { _CmdText = value;}

        }



        public CommandType CmdType

        {

            get { return _CmdType; }

            set { _CmdType = value; }

        }

        #endregion

        #region  

        private void OpenCon()

        {

            try

            {

                if (Conn == null)

                {

                    Conn = DbFactory.CreateConnection();

                }

                if (Conn.State == ConnectionState.Closed)

                {

                    Conn.ConnectionString = ConnStr;

                    Conn.Open();

                }

            }

            catch (Exception ex)

            {



                throw (new Exception("" + ex.Message));

            }

        }

        private void CloseCon()

        {

            if (Conn.State == ConnectionState.Open)

            {

                Conn.Close();

            }

            if (Cmd != null)

            {

                Cmd.Dispose();

                Cmd = null;

            }

        }

        private void StartCommend()

        {

            OpenCon();

            Cmd = Conn.CreateCommand();

            Cmd.CommandText = CmdText;

            Cmd.CommandType = CmdType;

        }

        #endregion

        /// <summary>

        ///  SQL ( 、 、 )

        /// </summary>

        /// <returns> </returns>

        public int ExecuteNonQuery()

        {

            StartCommend();

            try

            {

                return Cmd.ExecuteNonQuery();

            }

            catch (Exception ex)

            {

                throw (new Exception(" : " + ex.Message));

            }

            finally

            {

                CloseCon();

            }

        }



        /// <summary>

        ///   DataAdapter   DataTable,  DataTable  

        /// </summary>

        /// <returns>DataTable</returns>

        public DataTable ExecuteDataTable()

        {

            StartCommend();

            try

            {

                using (DbDataAdapter da =DbFactory.CreateDataAdapter())

                {

                    da.SelectCommand = Cmd;

                    DataTable dt = new DataTable();

                    da.Fill(dt);

                    return dt;

                }

            }

            catch (Exception ex)

            {

                throw (new Exception(" :" + ex.Message));

            }

            finally

            {

                CloseCon();

            }

        }
  }
}

 
いくつかの概念は依然としてあいまいで、文を実行するたびに直接リンクを切断する必要がありますか?この中のどんな書き方が間違っていますか.
よろしくお願いします.