none
想請問各位前輩們,關於各種讀寫資料庫的程式寫法與架構 RRS feed

  • 問題

  •  各位前輩好,

     因為有新的需求近來,在修改程式時發現之前的讀寫資料庫寫法不太恰當,

    所以想請問前輩們在實務上讀寫資料庫是用怎樣的寫法,希望可以討論。

    以下兩種寫法是我寫的,我將有些不必要的程式碼都刪掉,只留大致架構,

    我知道寫得很爛,希望各位前輩請多指導。

    ====

    第一種

        public class DatabaseCommunication
        {
            MySqlConnection Host_Connection = null;
      
            // 建立連線
            public bool Opne_Connection(string inServer, string inPort, string inAccount, string inPassword)
            {
                return true or false;
            }
    
            // 關閉連線
            public void Close_Connection()
            {
               
            }
    
            // INSERT
            public bool Insert(string inDatabase, string inTable, string inString, List<MySqlParameter> inParameters)
            {
                string command = "INSERT INTO " + inDatabase + "." + inTable + " " + inString;
    
                return true or false;
            }
    
            // UPDATE
            public bool Update(string inDatabase, string inTable, string inString, List<MySqlParameter> inParameters)
            {
                string command = "UPDATE " + inDatabase + "." + inTable + " " + inString;
    
                return true or false;
            }
           
            // 作SELECT
            public bool Select(string inDatabase, string inTable, string inString, List<MySqlParameter> inParameters, out object outObject)
            {
                string command = "SELECT * FROM " + inDatabase + "." + inTable + " " + inString;
    
                return true or false;
            }
            
            // 作SELECT
            public bool Select(string inDatabase, string inTable, string inString, string In_ParametersString, MySqlParameter[] In_Parameters, out DataTable outTable)
            {
                string command = "SELECT * FROM " + inDatabase + "." + inTable + " " + inString;
    
                return true or false;
            }
        }

    其中回傳true代表成功,回傳false代表失敗。

    而inString大概像這樣 "SET phone=?phone, name=?name"。


    但是後來發現不太好用,(但是當時來講是OK的)

    1. 實際上要抓的攔位不固定,有時候要抓id,name,phone,有時候要抓id,name有時候要抓id

    2. 後方的inString也常常在變,如 SELECT 時 WHERE 子句就一直再換,UPDATE 與 INSERT 中 SET 子句也一直再換

    3. 連多個主機有點麻煩,有時只去A或B主機抓,或者A主機抓完後再去B主機抓來比對

        (以前的寫法是將open內server等資訊寫死,當時我有問過是否會連線到不同主機,老闆回說沒有,但過沒幾個月就改口...)

    但現在來看反而有點自己綁死自己。

    =====

    後來改第二種寫法

        public class DatabaseCommunication
        {
            private string _Server = null;
            private string _Port = null;
            private string _Account = null;
            private string _Password = null;
            private MySqlConnection _Connection = null;
    
            public long LastInsertedID { get; private set; }
    
            // 建構式
            public DatabaseCommunication(string server, string port, string account, string password)
            {
                this._Server = server;
                this._Port = port;
                this._Account = account;
                this._Password = password;
                this.LastInsertedID = 0;
            }
    
            // Open
            private void Open()
            {
               
            }
    
            // Close
            private void Close()
            {
                
            }
    
            public void ExecuteNonQuery(string inCommandString)
            {
                this.ExecuteNonQuery(inCommandString, new List<MySqlParameter>(0));
            }
            public void ExecuteNonQuery(string inCommandString, List<MySqlParameter> inParameters)
            {
                this.Open();
    
                // do something
    
                this.Close();
            }
    
            public object ExecuteScalar(string inCommandString)
            {
                return this.ExecuteScalar(inCommandString, new List<MySqlParameter>(0));
            }
            public object ExecuteScalar(string inCommandString, List<MySqlParameter> inParameters)
            {
                this.Open();
    
                // do something
    
                this.Close();
    
                return result;
            }
    
            public DataTable ExecuteReader(string inCommandString)
            {
                return this.ExecuteReader(inCommandString, new List<MySqlParameter>(0));
            }
            public DataTable ExecuteReader(string inCommandString, List<MySqlParameter> inParameters)
            {
                this.Open();
    
                // do something
    
                this.Close();
    
                return table;
            }
    
        }

    其中inCommandString不是第一種的inString,是SQL語法,

    如:"SELECT id, name FROM host1.table1 WHERE phone=?phone"

    雖然感覺靈活度大很多,但總覺得哪邊怪怪的。

    有種「這樣子倒不如直接寫」的感覺,又或者「以後又要改很大」的感覺。

    =====

    我現在的問題點卡在「我會寫資料庫連線,但我不確定在實務上這樣寫會不會比較好。」

    雖然我在網路上看了許多文章,但很多都是Insert()、Update()、Select(),

    針對不同欄位、不同條件字句、不同主機等做法找不太到,

    所以想請各位前輩指導、分享心得,謝謝。


    2014年9月30日 上午 07:04

解答

所有回覆