C#中mysql增刪改查等操作

定義操作類

class DataBase
    {
        INIFileHelper inifilehelper = new INIFileHelper("./set.ini");
        ...
        ...
    }

屬性

#region 屬性

        private bool m_Usefull = true;
        /// <summary>
        /// 是否可用
        /// </summary>
        public bool Usefull
        {
            get { return m_Usefull; }
        }

        private MySqlConnection m_Conn = null;
        /// <summary>
        /// 數據庫連接
        /// </summary>
        public MySqlConnection Conn
        {
            get { return m_Conn; }
        }

        private MySqlCommand m_Cmd = null;
        public MySqlCommand Cmd
        {
            get { return m_Cmd; }
        }

        private string m_ServerIP = null;
        /// <summary>
        /// 主用服務器IP地址
        /// </summary>
        public string ServerIP
        {
            get { return m_ServerIP; }
            set
            {
                bool isIPUseful = CommonUse.CheckIP(value);
                if (isIPUseful)
                {
                    inifilehelper.IniWriteValue("DataBase", "Server1", value);
                    m_ServerIP = value;
                }
                else
                {
                    XtraMessageBox.Show("IP地址格式不正確", "軟件提示");
                    m_ServerIP = null;
                }
            }
        }

        private string m_SlaveIP = null;
        /// <summary>
        /// 備用服務器IP地址
        /// </summary>
        public string SlaveIP
        {
            get { return m_SlaveIP; }
            set
            {
                bool isIPUseful = CommonUse.CheckIP(value);
                if (isIPUseful)
                {
                    inifilehelper.IniWriteValue("DataBase", "Server2", value);
                    m_SlaveIP = value;
                }
                else
                {
                    XtraMessageBox.Show("IP地址格式不正確", "軟件提示");
                    m_SlaveIP = null;
                }
            }
        }

        private string m_Status = null;
        /// <summary>
        /// 記錄當前連接狀態,使用主用或備用服務器
        /// </summary>
        public string Status
        {
            get { return m_Status; }
        }

        private string m_UserId = null;
        /// <summary>
        /// 用戶名
        /// </summary>
        public string UserId
        {
            get { return m_UserId; }
        }

        private string m_Pwd = null;
        /// <summary>
        /// 密碼
        /// </summary>
        public string Pwd
        {
            get { return m_Pwd; }
        }

        private string m_DataBaseName = null;
        /// <summary>
        /// 數據庫名稱
        /// </summary>
        public string DataBaseName
        {
            get { return m_DataBaseName; }
        }

        private string m_MySQLPath = null;
        /// <summary>
        /// mySQL安裝路徑
        /// </summary>
        public string MySQLPath
        {
            get { return m_MySQLPath; }
            set
            {
                inifilehelper.IniWriteValue("DataBase", "MySQLPath", value);
                m_MySQLPath = value;
            }
        }

        private string m_MyINIPath = null;
        /// <summary>
        /// my.ini路徑
        /// </summary>
        public string MyINIPath
        {
            get
            {
                return m_MyINIPath;
            }
        }

        #endregion

構造函數

public DataBase()
        {
            //獲取主用服務器IP
            m_ServerIP = inifilehelper.IniReadValue("DataBase", "Server1");
            //獲取備用服務器IP
            m_SlaveIP = inifilehelper.IniReadValue("DataBase", "Server2");
            //獲取登錄用戶
            m_UserId = inifilehelper.IniReadValue("DataBase", "UserID");
            //獲取登錄密碼
            m_Pwd = inifilehelper.IniReadValue("DataBase", "Pwd");
            //獲取數據庫名稱
            m_DataBaseName = inifilehelper.IniReadValue("DataBase", "DataBaseName");
            //獲取MySQL路徑
            m_MySQLPath = inifilehelper.IniReadValue("DataBase", "MySQLPath");
            //my.ini文件路徑
            m_MyINIPath = GetMyIniPath();

            if (!string.IsNullOrEmpty(m_MyINIPath))
            {
                iniFilehelperOfmy = new INIFileHelper(m_MyINIPath);
            }

            if (CommonUse.TestNetConnectity(m_ServerIP))
            {
                //數據庫連接字符串
                //Allow User Variables=true爲SQL語句參數支持
                string strConn1 = string.Format("Server = '{0}';Database = '{1}' ;User id= '{2}' ; PWD = '{3}';Allow User Variables=True;",
                    m_ServerIP, m_DataBaseName, m_UserId, m_Pwd);
                try
                {
                    m_Conn = new MySqlConnection(strConn1);//產生數據庫連接
                    m_Cmd = new MySqlCommand();//實例化SqlCommand
                    m_Cmd.Connection = m_Conn;//設置SqlCommand的Connection屬性

                    m_Status = "正在使用主用服務器...";
                }
                catch (Exception)
                {
                    MessageBox.Show("請檢查參數設置!", "軟件提示");
                    m_Usefull = false;
                }
            }
            else if (CommonUse.TestNetConnectity(m_SlaveIP))
            {
                //MessageBox.Show("請檢查與主機的網絡連接!", "軟件提示");
                //連接備用主機
                try
                {
                    string strConn2 = string.Format("Server = '{0}';Database = '{1}' ;User id= '{2}' ; PWD = '{3}';Allow User Variables=True;",
                m_SlaveIP, m_DataBaseName, m_UserId, m_Pwd);

                    m_Conn = new MySqlConnection(strConn2);//產生數據庫連接
                    m_Cmd = new MySqlCommand();//實例化SqlCommand
                    m_Cmd.Connection = m_Conn;//設置SqlCommand的Connection屬性

                    m_Status = "正在使用備用服務器...";
                }
                catch (Exception)
                {
                    MessageBox.Show("請檢查參數設置!", "軟件提示");
                    m_Usefull = false;
                }
            }
            else
            {
                m_Status = "與服務器連接失敗...";

                m_Usefull = false;
            }
        }

通過Transact-SQL語句提交數據

public int ExecDataBySql(string strSql)
        {
            int intReturnValue = -1;//返回受影響的行數

            m_Cmd.CommandType = CommandType.Text;
            m_Cmd.CommandText = strSql;

            try
            {
                if (m_Conn.State == ConnectionState.Closed) m_Conn.Open();

                intReturnValue = m_Cmd.ExecuteNonQuery();
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message, "軟件提示");
                //throw e;
            }
            finally
            {
                m_Conn.Close();//連接關閉,但不釋放掉該對象所佔的內存單元
            }

            return intReturnValue;
        }

通過事務執行多條Transact-SQL語句提交數據

public bool ExecDataBySqls(List<string> strSqls)
        {
            bool booIsSucceed;//定義返回值變量

            if (m_Conn.State == ConnectionState.Closed)//判斷當前的數據庫連接狀態
            {
                try
                {
                    m_Conn.Open();//打開連接
                }
                catch (Exception)
                {
                    MessageBox.Show("請檢查網絡連接和參數設置!", "軟件提示");

                    return false;
                }
            }

            MySqlTransaction sqlTran = m_Conn.BeginTransaction();//開始數據庫事務

            try
            {
                m_Cmd.Transaction = sqlTran;//設置m_Cmd的事務屬性
                //循環取出封裝在列表strSqls中表示SQL語句的字符串
                foreach (string item in strSqls)
                {
                    m_Cmd.CommandType = CommandType.Text;//設置命令類型爲SQL文本命令
                    m_Cmd.CommandText = item;//設置要對數據源執行的SQL語句
                    m_Cmd.ExecuteNonQuery();//執行SQL語句並返回受影響的行數
                }

                sqlTran.Commit();//提交事務,持久化數據
                booIsSucceed = true;  //表示提交數據庫成功
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message, "軟件提示");

                sqlTran.Rollback();//回滾事務,恢復數據
                booIsSucceed = false;  //表示提交數據庫失敗!
            }
            finally
            {
                m_Conn.Close();//關閉連接
                strSqls.Clear();//清除列表strSqls中的元素
            }

            return booIsSucceed;
        }

寫入數據,數據庫中有該記錄時則更新,沒有時則插入

        /// <summary>
        /// 寫入數據,數據庫中有該記錄時則更新,沒有時則插入
        /// </summary>
        /// <param name="strTable">表名</param>
        /// <param name="keyName">主鍵列名</param>
        /// <param name="keyValue">主鍵值</param>
        /// <param name="targetName">目標列名</param>
        /// <param name="targetValue">目標值</param>
        public bool WriteData(string strTable, string keyName, string keyValue, string targetName, string targetValue)
        {
            bool isSuccessed = false;
            string strSql = "";
            if (IsRecordExist(strTable, keyName, keyValue))
            {
                strSql = string.Format("UPDATE {0} SET {1}='{2}' WHERE {3} = '{4}'", strTable, targetName,
                    targetValue, keyName, keyValue);

                if (ExecDataBySql(strSql) > 0)
                    isSuccessed = true;
            }
            else
            {
                strSql = string.Format("INSERT INTO {0} ({1},{2}) VALUES ('{3}','{4}')", strTable, keyName, targetName,
                keyValue, targetValue);

                if (ExecDataBySql(strSql) > 0)
                    isSuccessed = true;
            }

            return isSuccessed;
        }

通過Transact-SQL語句得到DataSet實例

public DataSet GetDataSet(string strSql, string strTable = "table0")
        {
            DataSet ds = null;

            try
            {
                MySqlDataAdapter sda = new MySqlDataAdapter(strSql, m_Conn);
                ds = new DataSet();
                sda.Fill(ds, strTable);
            }
            catch (Exception e)
            {
                ds = null;
                MessageBox.Show(e.Message, "軟件提示");
            }

            return ds;
        }

重新封裝ExecuteScalar方法,得到結果集中的第一行的第一列

public object GetSingleObject(string strSql)
        {
            object obj = null;
            m_Cmd.CommandType = CommandType.Text;
            m_Cmd.CommandText = strSql;

            try
            {
                if (m_Conn.State == ConnectionState.Closed)
                {
                    m_Conn.Open();
                }

                obj = m_Cmd.ExecuteScalar();
            }
            catch (Exception e)
            {
                obj = null;
                MessageBox.Show(e.Message, "軟件提示");
                //throw e;//向上一層拋出異常(上一層使用try{}catch{})或立刻中斷(上一層未使用try{}catch{})
            }
            finally
            {
                m_Conn.Close();
            }

            return obj;
        }

獲取DataAdapter實例

public MySqlDataAdapter GetDataAdapter(string strSql)
        {
            MySqlDataAdapter sda = null;//聲明SqlDataAdapter引用
            try
            {
                sda = new MySqlDataAdapter(strSql, m_Conn);//實例化SqlDataAdapter
            }
            catch (Exception e)//捕獲異常
            {
                sda = null;
                MessageBox.Show(e.Message, "軟件提示");
            }

            return sda;
        }

將改動後的dataset更新到數據庫對應表中

public bool UpdateDataSet(string strSql, DataSet ds)
        {
            //表中必須要有主鍵,且主鍵不能是自動增加類型!!!
            //不然會報錯:違反併發性: UpdateCommand影響了預期 1 條記錄中的 0 條

            bool bo = false;
            if (ds == null) return false;

            DataSet dsChanged = ds.GetChanges();
            if (dsChanged == null) return true;
            if (dsChanged.Tables[0].Rows.Count <= 0) return true;

            DataRow drr = dsChanged.Tables[0].Rows[0];

            //由strSql獲取的DataSet與ds結構須相同,且表中必須含有主鍵或值沒有重複的列
            try
            {
                MySqlDataAdapter sda = GetDataAdapter(strSql);
                MySqlCommandBuilder scb = new MySqlCommandBuilder(sda);
                sda.FillSchema(ds, SchemaType.Mapped);//new added

                sda.Update(ds, ds.Tables[0].TableName);

                ds.AcceptChanges();
                bo = true;

                sda.Dispose();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "更新失敗");
                bo = false;
            }

            return bo;
        }

通過Transact-SQL語句,得到DataTable實例

public DataTable GetDataTable(string strSqlCode, string strTableName = "table1")
        {
            DataTable dt = null;//聲明DataTable引用
            MySqlDataAdapter sda = null;//聲明SqlDataAdapter引用

            try
            {
                sda = new MySqlDataAdapter(strSqlCode, m_Conn);//實例化SqlDataAdapter
                dt = new DataTable(strTableName);//使用指定字符串初始化DataTable實例
                sda.Fill(dt);//將得到的數據源填入dt中        
            }
            catch (Exception e)//捕獲異常
            {
                dt = null;
                MessageBox.Show(e.ToString());
            }

            return dt; //dt.Rows.Count可能等於零
        }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章