unity中鏈接MySQL數據庫的方法封裝


using
MySql.Data.MySqlClient; using System; using System.Data; using System.Collections; public class DatabaseManager : CSingleton<DatabaseManager> { protected static string m_databaseIP = "localhost"; //IP地址 protected static string m_databasePort = "3306"; //端口號 protected static string m_userID = "root"; //MySQL數據庫用戶名 protected static string m_password = "123456"; //MySQL登錄密碼 protected static string m_databaseName = "crh_emergency"; //連接的數據庫的庫名 protected static string m_connectionString; // 數據庫鏈接字符串 /// <summary> /// 測試是否連接上數據庫 /// </summary> /// <returns></returns> public bool TestConnection() { bool isConnected = true; //發送數據庫鏈接字段 建立鏈接通道 using (MySqlConnection connection = new MySqlConnection(m_connectionString)) { try { //打開鏈接通道 connection.Open(); } catch (MySqlException E) { //若是有異常 則鏈接失敗 isConnected = false; throw new Exception(E.Message); } finally { //關閉鏈接通道 connection.Close(); } } return isConnected; } /// <summary> /// 利用字符串組拼方式來編寫數據庫的鏈接 /// </summary> public static void Init() { m_connectionString = string.Format("Server = {0}; port = {1}; Database = {2}; User ID = {3}; Password = {4}; Pooling=true; Charset = utf8;", m_databaseIP, m_databasePort, m_databaseName, m_userID, m_password); } /// <summary> /// 建立表 /// </summary> /// <param name="name">表名</param> /// <param name="cols">字段名</param> /// <param name="colType">字段類型</param> /// <returns></returns> public static int CreateTable(string name, string[] cols, string[] colType) { if (cols.Length != colType.Length) { throw new Exception("columns.Length != colType.Length"); } string query = "CREATE TABLE " + name + " (" + cols[0] + " " + colType[0]; for (int i = 1; i < cols.Length; ++i) { query += ", " + cols[i] + " " + colType[i]; } query += ")"; return ExecuteNonQuery(query); } /// <summary> /// 建立表默認ID自動增加 /// </summary> /// <param name="name">表名</param> /// <param name="cols">字段名</param> /// <param name="colType">字段類型</param> /// <returns></returns> public static int CreateTableAutoID(string name, string[] cols, string[] colType) { if (cols.Length != colType.Length) { throw new Exception("columns.Length != colType.Length"); } string query = "CREATE TABLE " + name + " (" + cols[0] + " " + colType[0] + " NOT NULL AUTO_INCREMENT"; for (int i = 1; i < cols.Length; ++i) { query += ", " + cols[i] + " " + colType[i]; } query += ", PRIMARY KEY (" + cols[0] + ")" + ")"; return ExecuteNonQuery(query); } /// <summary> /// 插入一條數據,包括全部,不適用自動累加ID。 /// </summary> /// <param name="tableName">表名</param> /// <param name="values"></param> /// <returns></returns> public static int InsertInto(string tableName, string[] values) { string query = "INSERT INTO " + tableName + " VALUES (" + "'" + values[0] + "'"; for (int i = 1; i < values.Length; ++i) { query += ", " + "'" + values[i] + "'"; } query += ")"; return ExecuteNonQuery(query); } /// <summary> /// 插入部分ID /// </summary> /// <param name="tableName">表名</param> /// <param name="cols"></param> /// <param name="values"></param> /// <returns></returns> public static int InsertInto(string tableName, string[] cols, string[] values) { if (cols.Length != values.Length) { throw new Exception("columns.Length != colType.Length"); } string query = "INSERT INTO " + tableName + " (" + cols[0]; for (int i = 1; i < cols.Length; ++i) { query += ", " + cols[i]; } query += ") VALUES (" + "'" + values[0] + "'"; for (int i = 1; i < values.Length; ++i) { query += ", " + "'" + values[i] + "'"; } query += ")"; return ExecuteNonQuery(query); } /// <summary> /// 當指定字段知足必定條件時,更新指定字段的數據 /// 例如更新在user這個表中字段名爲userAccount的值等於10086時,將對應userPwd字段的值改爲newMd5SumPassword /// ("users", new string[] { "userPwd" }, new string[] { newMd5SumPassword }, "userAccount", "10086") /// </summary> /// <param name="tableName">表名</param> /// <param name="cols">字段</param> /// <param name="colsValues">字段值</param> /// <param name="selectKey">指定的字段</param> /// <param name="selectValue">指定字段知足的條件</param> /// <returns></returns> public static int UpdateInto(string tableName, string[] cols, string[] colsValues, string selectKey, string selectValue) { string query = "UPDATE " + tableName + " SET " + cols[0] + " = " + "'" + colsValues[0] + "'"; for (int i = 1; i < colsValues.Length; ++i) { query += ", " + cols[i] + " =" + "'" + colsValues[i] + "'"; } query += " WHERE " + selectKey + " = " + selectValue; return ExecuteNonQuery(query); } /// <summary> /// 刪除 /// </summary> /// <param name="tableName">表名</param> /// <param name="cols">字段</param> /// <param name="colsValues">字段值</param> /// <returns></returns> public static int Delete(string tableName, string[] cols, string[] colsValues) { string query = "DELETE FROM " + tableName + " WHERE " + cols[0] + " = " + colsValues[0]; for (int i = 1; i < colsValues.Length; ++i) { query += " or " + cols[i] + " = " + colsValues[i]; } return ExecuteNonQuery(query); } /// <summary> /// 查詢指定字段數據中知足條件的 /// DataSet內存中的數據庫,DataSet是不依賴於數據庫的獨立數據集合,是一種不包含表頭的純數據文件 /// 有條件的查詢,查詢在users這個表當中,只須要字段名爲userAccount,userPwd,userName,ID這幾個字段對應的數據, /// 知足條件爲 userAccount對應的value=account, userPwd對應的value=md5Password; /// ("users", new string[] { "userAccount", "userPwd", "userName", "ID" }, new string[] { "userAccount", "userPwd" }, new string[] { "=", "=" }, new string[] { account, md5Password }); /// </summary> /// <param name="tableName">表名</param> /// <param name="items">字段名</param> /// <param name="cols">字段名</param> /// <param name="operations">條件運算符</param> /// <param name="values">知足的條件值</param> /// <returns></returns> public static DataSet SelectWhere(string tableName, string[] items, string[] cols, string[] operations, string[] values) { if (cols.Length != operations.Length || operations.Length != values.Length) { throw new Exception("col.Length != operation.Length != values.Length"); } string query = "SELECT " + items[0]; for (int i = 1; i < items.Length; ++i) { query += ", " + items[i]; } query += " FROM " + tableName + " WHERE " + cols[0] + operations[0] + "'" + values[0] + "' "; for (int i = 1; i < cols.Length; ++i) { query += " AND " + cols[i] + operations[i] + "'" + values[i] + "' "; } return ExecuteQuery(query); } /// <summary> /// 查詢指定字段 /// </summary> /// <param name="tableName">表名</param> /// <param name="items">字段名</param> /// <returns></returns> public static DataSet Select(string tableName, string[] items) { string query = "SELECT " + items[0]; for (int i = 1; i < items.Length; ++i) { query += ", " + items[i]; } query += " FROM " + tableName; return ExecuteQuery(query); } /// <summary> /// 查詢全部字段 /// </summary> /// <param name="tableName">表名</param> /// <returns></returns> public static DataSet Select(string tableName) { string query = "SELECT * FROM " + tableName; return ExecuteQuery(query); } #region 執行簡單SQL語句 /// <summary> /// 執行SQL語句,返回影響的記錄數。用於Update、Insert和Delete /// </summary> /// <param name="SQLString">SQL語句</param> /// <returns>影響的記錄數</returns> public static int ExecuteNonQuery(string SQLString) { using (MySqlConnection connection = new MySqlConnection(m_connectionString)) { using (MySqlCommand cmd = new MySqlCommand(SQLString, connection)) { try { connection.Open(); int rows = cmd.ExecuteNonQuery(); return rows; } catch (MySqlException E) { throw new Exception(E.Message); } finally { cmd.Dispose(); connection.Close(); } } } } /// <summary> /// 執行SQL語句,設置命令的執行等待時間 /// </summary> /// <param name="SQLString"></param> /// <param name="Times"></param> /// <returns></returns> public static int ExecuteNonQueryByTime(string SQLString, int Times) { using (MySqlConnection connection = new MySqlConnection(m_connectionString)) { using (MySqlCommand cmd = new MySqlCommand(SQLString, connection)) { try { connection.Open(); cmd.CommandTimeout = Times; int rows = cmd.ExecuteNonQuery(); return rows; } catch (MySqlException E) { throw new Exception(E.Message); } finally { cmd.Dispose(); connection.Close(); } } } } /// <summary> /// 執行多條SQL語句,實現數據庫事務。 /// </summary> /// <param name="SQLStringList">多條SQL語句</param> public static void ExecuteNonQueryTran(ArrayList SQLStringList) { using (MySqlConnection conn = new MySqlConnection(m_connectionString)) { conn.Open(); MySqlCommand cmd = new MySqlCommand(); cmd.Connection = conn; MySqlTransaction tx = conn.BeginTransaction(); cmd.Transaction = tx; try { for (int n = 0; n < SQLStringList.Count; n++) { string strsql = SQLStringList[n].ToString(); if (strsql.Trim().Length > 1) { cmd.CommandText = strsql; cmd.ExecuteNonQuery(); } } tx.Commit(); } catch (MySqlException E) { tx.Rollback(); throw new Exception(E.Message); } finally { cmd.Dispose(); conn.Close(); } } } /// <summary> /// 執行帶一個存儲過程參數的的SQL語句。 /// </summary> /// <param name="SQLString">SQL語句</param> /// <param name="content">參數內容,好比一個字段是格式複雜的文章,有特殊符號,能夠經過這個方式添加</param> /// <returns>影響的記錄數</returns> public static int ExecuteNonQuery(string SQLString, string content) { using (MySqlConnection connection = new MySqlConnection(m_connectionString)) { MySqlCommand cmd = new MySqlCommand(SQLString, connection); MySqlParameter myParameter = new MySqlParameter("@content", MySqlDbType.Text); myParameter.Value = content; cmd.Parameters.Add(myParameter); try { connection.Open(); int rows = cmd.ExecuteNonQuery(); return rows; } catch (MySqlException E) { throw new Exception(E.Message); } finally { cmd.Dispose(); connection.Close(); } } } /// <summary> /// 執行帶一個存儲過程參數的的SQL語句。 /// </summary> /// <param name="SQLString">SQL語句</param> /// <param name="content">參數內容,好比一個字段是格式複雜的文章,有特殊符號,能夠經過這個方式添加</param> /// <returns>影響的記錄數</returns> public static object ExecuteScalar(string SQLString, string content) { using (MySqlConnection connection = new MySqlConnection(m_connectionString)) { MySqlCommand cmd = new MySqlCommand(SQLString, connection); MySqlParameter myParameter = new MySqlParameter("@content", MySqlDbType.Text); myParameter.Value = content; cmd.Parameters.Add(myParameter); try { connection.Open(); object obj = cmd.ExecuteScalar(); if ((System.Object.Equals(obj, null)) || (System.Object.Equals(obj, System.DBNull.Value))) { return null; } else { return obj; } } catch (MySqlException E) { throw new Exception(E.Message); } finally { cmd.Dispose(); connection.Close(); } } } /// <summary> /// 向數據庫裏插入圖像格式的字段(和上面狀況相似的另外一種實例) /// </summary> /// <param name="strSQL">SQL語句</param> /// <param name="fs">圖像字節,數據庫的字段類型爲image的狀況</param> /// <returns>影響的記錄數</returns> public static int ExecuteNonQueryInsertImg(string strSQL, byte[] fs) { using (MySqlConnection connection = new MySqlConnection(m_connectionString)) { MySqlCommand cmd = new MySqlCommand(strSQL, connection); MySqlParameter myParameter = new MySqlParameter("@fs", MySqlDbType.Binary); myParameter.Value = fs; cmd.Parameters.Add(myParameter); try { connection.Open(); int rows = cmd.ExecuteNonQuery(); return rows; } catch (MySqlException E) { throw new Exception(E.Message); } finally { cmd.Dispose(); connection.Close(); } } } /// <summary> /// 執行一條計算查詢結果語句,返回查詢結果(object)。 /// </summary> /// <param name="SQLString">計算查詢結果語句</param> /// <returns>查詢結果(object)</returns> public static object GetSingle(string SQLString) { using (MySqlConnection connection = new MySqlConnection(m_connectionString)) { using (MySqlCommand cmd = new MySqlCommand(SQLString, connection)) { try { connection.Open(); object obj = cmd.ExecuteScalar(); if ((System.Object.Equals(obj, null)) || (System.Object.Equals(obj, System.DBNull.Value))) { return null; } else { return obj; } } catch (MySqlException e) { throw new Exception(e.Message); } finally { cmd.Dispose(); connection.Close(); } } } } /// <summary> /// 執行查詢語句,返回MySqlDataReader(使用該方法切記要手工關閉MySqlDataReader和鏈接) /// </summary> /// <param name="strSQL">查詢語句</param> /// <returns>MySqlDataReader</returns> public static MySqlDataReader ExecuteReader(string strSQL) { MySqlConnection connection = new MySqlConnection(m_connectionString); MySqlCommand cmd = new MySqlCommand(strSQL, connection); try { connection.Open(); MySqlDataReader myReader = cmd.ExecuteReader(); return myReader; } catch (MySqlException e) { throw new Exception(e.Message); } //finally //不能在此關閉,不然,返回的對象將沒法使用 //{ // cmd.Dispose(); // connection.Close(); //} } /// <summary> /// 執行查詢語句,返回DataSet /// </summary> /// <param name="SQLString">查詢語句</param> /// <returns>DataSet</returns> public static DataSet ExecuteQuery(string SQLString) { using (MySqlConnection connection = new MySqlConnection(m_connectionString)) { DataSet ds = new DataSet(); try { connection.Open(); MySqlDataAdapter da = new MySqlDataAdapter(SQLString, connection); da.Fill(ds); } catch (MySqlException ex) { connection.Close(); throw new Exception(ex.Message); } finally { connection.Close(); } return ds; } } /// <summary> /// 執行查詢語句,返回DataSet,設置命令的執行等待時間 /// </summary> /// <param name="SQLString"></param> /// <param name="Times"></param> /// <returns></returns> public static DataSet ExecuteQuery(string SQLString, int Times) { using (MySqlConnection connection = new MySqlConnection(m_connectionString)) { DataSet ds = new DataSet(); try { connection.Open(); MySqlDataAdapter command = new MySqlDataAdapter(SQLString, connection); command.SelectCommand.CommandTimeout = Times; command.Fill(ds, "ds"); } catch (MySqlException ex) { throw new Exception(ex.Message); } finally { connection.Close(); } return ds; } } /// <summary> /// 獲取SQL查詢記錄條數 /// </summary> /// <param name="sqlstr">SQL語句</param> /// <returns></returns> public static int GetRowsNum(string SQLString) { using (MySqlConnection connection = new MySqlConnection(m_connectionString)) { DataSet ds = new DataSet(); try { connection.Open(); MySqlDataAdapter command = new MySqlDataAdapter(SQLString, connection); command.Fill(ds, "ds"); return ds.Tables[0].Rows.Count; } catch (MySqlException ex) { throw new Exception(ex.Message); } finally { connection.Close(); } } } #endregion 執行簡單SQL語句 #region 執行帶參數的SQL語句 /// <summary> /// 執行SQL語句,返回影響的記錄數 /// </summary> /// <param name="SQLString">SQL語句</param> /// <returns>影響的記錄數</returns> public static int ExecuteNonQuery(string SQLString, params System.Object[] cmdParms) { using (MySqlConnection connection = new MySqlConnection(m_connectionString)) { using (MySqlCommand cmd = new MySqlCommand()) { try { PrepareCommand(cmd, connection, null, SQLString, cmdParms); int rows = cmd.ExecuteNonQuery(); cmd.Parameters.Clear(); return rows; } catch (MySqlException E) { throw new Exception(E.Message); } finally { cmd.Dispose(); connection.Close(); } } } } /// <summary> /// 執行多條SQL語句,實現數據庫事務。 /// </summary> /// <param name="SQLStringList">SQL語句的哈希表(key爲sql語句,value是該語句的 Object[])</param> public static void ExecuteNonQueryTran(Hashtable SQLStringList) { using (MySqlConnection conn = new MySqlConnection(m_connectionString)) { conn.Open(); using (MySqlTransaction trans = conn.BeginTransaction()) { MySqlCommand cmd = new MySqlCommand(); try { //循環 foreach (DictionaryEntry myDE in SQLStringList) { string cmdText = myDE.Key.ToString(); System.Object[] cmdParms = (System.Object[])myDE.Value; PrepareCommand(cmd, conn, trans, cmdText, cmdParms); int val = cmd.ExecuteNonQuery(); cmd.Parameters.Clear(); trans.Commit(); } } catch { trans.Rollback(); throw; } finally { cmd.Dispose(); conn.Close(); } } } } /// <summary> /// 執行一條計算查詢結果語句,返回查詢結果(object)。 /// </summary> /// <param name="SQLString">計算查詢結果語句</param> /// <returns>查詢結果(object)</returns> public static object GetSingle(string SQLString, params System.Object[] cmdParms) { using (MySqlConnection connection = new MySqlConnection(m_connectionString)) { using (MySqlCommand cmd = new MySqlCommand()) { try { PrepareCommand(cmd, connection, null, SQLString, cmdParms); object obj = cmd.ExecuteScalar(); cmd.Parameters.Clear(); if ((System.Object.Equals(obj, null)) || (System.Object.Equals(obj, System.DBNull.Value))) { return null; } else { return obj; } } catch (MySqlException e) { throw new Exception(e.Message); } finally { cmd.Dispose(); connection.Close(); } } } } /// <summary> /// 執行查詢語句,返回MySqlDataReader (使用該方法切記要手工關閉MySqlDataReader和鏈接) /// </summary> /// <param name="strSQL">查詢語句</param> /// <returns>MySqlDataReader</returns> public static MySqlDataReader ExecuteReader(string SQLString, params System.Object[] cmdParms) { MySqlConnection connection = new MySqlConnection(m_connectionString); MySqlCommand cmd = new MySqlCommand(); try { PrepareCommand(cmd, connection, null, SQLString, cmdParms); MySqlDataReader myReader = cmd.ExecuteReader(); cmd.Parameters.Clear(); return myReader; } catch (MySqlException e) { throw new Exception(e.Message); } //finally //不能在此關閉,不然,返回的對象將沒法使用 //{ // cmd.Dispose(); // connection.Close(); //} } /// <summary> /// 執行查詢語句,返回DataSet /// </summary> /// <param name="SQLString">查詢語句</param> /// <returns>DataSet</returns> public static DataSet ExcuteQuery(string SQLString, params System.Object[] cmdParms) { using (MySqlConnection connection = new MySqlConnection(m_connectionString)) { MySqlCommand cmd = new MySqlCommand(); PrepareCommand(cmd, connection, null, SQLString, cmdParms); using (MySqlDataAdapter da = new MySqlDataAdapter(cmd)) { DataSet ds = new DataSet(); try { da.Fill(ds, "ds"); cmd.Parameters.Clear(); } catch (MySqlException ex) { throw new Exception(ex.Message); } finally { cmd.Dispose(); connection.Close(); } return ds; } } } private static void PrepareCommand(MySqlCommand cmd, MySqlConnection conn, MySqlTransaction trans, string cmdText, System.Object[] cmdParms) { if (conn.State != ConnectionState.Open) conn.Open(); cmd.Connection = conn; cmd.CommandText = cmdText; if (trans != null) cmd.Transaction = trans; cmd.CommandType = CommandType.Text;//cmdType; if (cmdParms != null) { foreach (MySqlParameter parameter in cmdParms) { if ((parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Input) && (parameter.Value == null)) { parameter.Value = DBNull.Value; } cmd.Parameters.Add(parameter); } } } #endregion 執行帶參數的SQL語句 #region 存儲過程操做 /// <summary> /// 執行存儲過程 (使用該方法切記要手工關閉MySqlDataReader和鏈接) /// 手動關閉不了,因此少用,MySql.Data組組件還沒解決該問題 /// </summary> /// <param name="storedProcName">存儲過程名</param> /// <param name="parameters">存儲過程參數</param> /// <returns>MySqlDataReader</returns> public static MySqlDataReader RunProcedure(string storedProcName, System.Object[] parameters) { MySqlConnection connection = new MySqlConnection(m_connectionString); MySqlDataReader returnReader; connection.Open(); MySqlCommand command = BuildQueryCommand(connection, storedProcName, parameters); command.CommandType = CommandType.StoredProcedure; returnReader = command.ExecuteReader(); //Connection.Close(); 不能在此關閉,不然,返回的對象將沒法使用 return returnReader; } /// <summary> /// 執行存儲過程 /// </summary> /// <param name="storedProcName">存儲過程名</param> /// <param name="parameters">存儲過程參數</param> /// <param name="tableName">DataSet結果中的表名</param> /// <returns>DataSet</returns> public static DataSet RunProcedure(string storedProcName, System.Object[] parameters, string tableName) { using (MySqlConnection connection = new MySqlConnection(m_connectionString)) { DataSet dataSet = new DataSet(); connection.Open(); MySqlDataAdapter sqlDA = new MySqlDataAdapter(); sqlDA.SelectCommand = BuildQueryCommand(connection, storedProcName, parameters); sqlDA.Fill(dataSet, tableName); connection.Close(); return dataSet; } } public static DataSet RunProcedure(string storedProcName, System.Object[] parameters, string tableName, int Times) { using (MySqlConnection connection = new MySqlConnection(m_connectionString)) { DataSet dataSet = new DataSet(); connection.Open(); MySqlDataAdapter sqlDA = new MySqlDataAdapter(); sqlDA.SelectCommand = BuildQueryCommand(connection, storedProcName, parameters); sqlDA.SelectCommand.CommandTimeout = Times; sqlDA.Fill(dataSet, tableName); connection.Close(); return dataSet; } } /// <summary> /// 執行存儲過程 /// </summary> /// <param name="storedProcName">存儲過程名</param> /// <param name="parameters">存儲過程參數</param> /// <returns></returns> public static void RunProcedureNull(string storedProcName, System.Object[] parameters) { using (MySqlConnection connection = new MySqlConnection(m_connectionString)) { connection.Open(); MySqlCommand command = BuildIntCommand(connection, storedProcName, parameters); command.ExecuteNonQuery(); connection.Close(); } } /// <summary> /// 執行存儲過程,返回第一行第一列的數據 /// </summary> /// <param name="CommandText">T-SQL語句;例如:"pr_shell 'dir *.exe'"或"select * from sysobjects where xtype=@xtype"</param> /// <param name="parameters">SQL參數</param> /// <returns>返回第一行第一列,用Convert.To{Type}把類型轉換爲想要的類型</returns> public object ExecuteScaler(string storedProcName, System.Object[] parameters) { using (MySqlConnection connection = new MySqlConnection(m_connectionString)) { object returnObjectValue; connection.Open(); MySqlCommand command = BuildQueryCommand(connection, storedProcName, parameters); returnObjectValue = command.ExecuteScalar(); connection.Close(); return returnObjectValue; } } /// <summary> /// 構建 SqlCommand 對象(用來返回一個結果集,而不是一個整數值) /// </summary> /// <param name="connection">數據庫鏈接</param> /// <param name="storedProcName">存儲過程名</param> /// <param name="parameters">存儲過程參數</param> /// <returns>SqlCommand</returns> private static MySqlCommand BuildQueryCommand(MySqlConnection connection, string storedProcName, System.Object[] parameters) { MySqlCommand command = new MySqlCommand(storedProcName, connection); command.CommandType = CommandType.StoredProcedure; foreach (MySqlParameter parameter in parameters) { if (parameter != null) { // 檢查未分配值的輸出參數,將其分配以DBNull.Value. if ((parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Input) && (parameter.Value == null)) { parameter.Value = DBNull.Value; } command.Parameters.Add(parameter); } } return command; } /// <summary> /// 建立 MySqlCommand 對象實例(用來返回一個整數值) /// </summary> /// <param name="storedProcName">存儲過程名</param> /// <param name="parameters">存儲過程參數</param> /// <returns>MySqlCommand 對象實例</returns> private static MySqlCommand BuildIntCommand(MySqlConnection connection, string storedProcName, System.Object[] parameters) { MySqlCommand command = BuildQueryCommand(connection, storedProcName, parameters); command.Parameters.Add(new MySqlParameter("ReturnValue", MySqlDbType.Int32, 4, ParameterDirection.ReturnValue, false, 0, 0, string.Empty, DataRowVersion.Default, null)); return command; } #endregion 存儲過程操做 }
相關文章
相關標籤/搜索