1. 程式人生 > >C# 自定義資料庫操作類 DataBase

C# 自定義資料庫操作類 DataBase

呼叫示例:

using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.UI.WebControls;

namespace WebApplicationTest
{
    /// <summary>
    /// 定義資料庫操作類,用於查詢和操作本地資料資訊
    /// 示例:DataBase newDataBase3 = new DataBase("newDataBase3", "sa", "12345");
    /// </summary>
    public class DataBase
    {
        private string DBName = "";             // 資料庫名稱
        private string UserName = "";           // 資料庫使用者名稱
        private string Password = "";           // 資料庫密碼

        public bool isInitSuccess = false;      // 記錄指定的資料庫是否可以連線成功

        public string connectionString = "";       // 當前資料庫連線串
        public string connectionString_master = "";// 連線到master資料庫的連線串

        /// <summary>
        /// 建立指定資料庫操作物件
        /// </summary>
        /// <param name="DBName">資料庫名稱</param>
        /// <param name="UserName">資料庫使用者名稱</param>
        /// <param name="Password">資料庫密碼</param>
        public DataBase(string DBName, string UserName, string Password)
        {
            if (DBName == null || DBName.Equals("") || UserName == null || UserName.Equals("") || Password == null || Password.Equals(""))
            {
                throw new Exception("DataBase()引數不可為空");
            }

            this.DBName = DBName;
            this.UserName = UserName;
            this.Password = Password;

            connectionString = DataBaseTool.getConnectString(DBName, UserName, Password);
            connectionString_master = DataBaseTool.getConnectString("", UserName, Password);

            //if (this.DBName != null && !this.DBName.Equals("") && !this.DBName.Equals("master"))
            {
                if (!DataBaseTool.Exist(DBName, connectionString_master))  // 判斷資料庫是否存在,若不存在則建立資料庫
                {
                    isInitSuccess = DataBaseTool.Create(DBName, connectionString_master);
                }
                else isInitSuccess = true;
            }
        }

        public String Execute(string sql)
        {
            return DataBaseTool.Execute(sql, connectionString);
        }

        public Dictionary<String, List<String>> ExecuteDic(string sql)
        {
            return DataBaseTool.ExecuteDic(sql, connectionString);
        }

        public List<String> ExecuteList(string sql)
        {
            return DataBaseTool.ExecuteList(sql, connectionString);
        }

        /// <summary>
        /// 連線資料庫,執行sql語句,返回Table表
        /// queryString = "SELECT * FROM 資料表1";
        /// </summary>
        public Table ExecuteTable(string sql)
        {
            return DataBaseTool.ExecuteTable(sql, connectionString);
        }

        /// <summary>
        /// 所有資料庫名稱
        /// </summary>
        public List<String> DataBaseNames()
        {
            return DataBaseTool.DataBaseNames(connectionString_master);
        }

        /// <summary>
        /// 當前資料中,所有表名稱
        /// </summary>
        public List<String> TableNames()
        {
            string sql = "select name from sysobjects where xtype='U'";
            List<string> list = ExecuteList(sql);

            return list;
        }

        /// <summary>
        /// 刪除指定的資料庫
        /// </summary>
        public bool DeletDataBase(string DataBaseName)
        {
            if (DataBaseName == null || DataBaseName.Equals("")) DataBaseName = DBName;
            return DataBaseTool.Delet(DataBaseName, connectionString_master);
        }


        #region 資料庫表操作

        /// <summary>
        /// 判斷當前資料庫中,是否存在指定名稱的表
        /// </summary>
        /// <param name="TAB">表名稱</param>
        public bool ExistTab(string TAB)
        {
            return DataBaseTool.ExistTab(TAB, connectionString);
        }

        /// <summary>
        /// 在當前資料庫中建立資料表
        /// </summary>
        /// <param name="TAB">表名稱</param>
        /// <param name="Colums">所有列名稱</param>
        public bool CreateTable(String TAB, List<string> Colums)
        {
            if (Colums.Count==0) Colums = new String[] { "KEY", "VALUE" }.ToList();  // 未指定列名稱時,預設新增KEY、VALUE兩列

            Dictionary<string, int> ColumnInfo = new Dictionary<string, int>();
            foreach (string col in Colums)
            {
                ColumnInfo.Add(col, 100);
            }
            //ColumnInfo.Add("EXT", 300);     // 預設新增一個拓展欄位列

            return DataBaseTool.CreateTable(TAB, ColumnInfo, connectionString);
        }

        /// <summary>
        /// 在當前資料庫中建立資料表
        /// </summary>
        /// <param name="TAB">表名稱</param>
        /// <param name="ColumnInfo">所有列資訊</param>
        /// <returns></returns>
        public bool CreateTable(String TAB, Dictionary<string, int> ColumnInfo)
        {
            return DataBaseTool.CreateTable(TAB, ColumnInfo, connectionString);
        }

        /// <summary>
        /// 刪除當前資料庫中的TAB表
        /// </summary>
        public bool DeletTable(String TAB)
        {
            return DataBaseTool.DeletTable(TAB, connectionString);
        }

        /// <summary>
        /// 向表中插入新的資料
        /// </summary>
        /// <param name="TAB">表名稱</param>
        /// <param name="values">列資料</param>
        /// <returns>新生成的資料行ID</returns>
        public string InsetValue(string TAB, List<string> values)
        {
            return DataBaseTool.InsetValue(TAB, values, connectionString);
        }

         /// <summary>
        /// 刪除TAB表中,KeyName為KeyValue的所有行
        /// </summary>
        /// <param name="TAB">表名稱</param>
        /// <param name="KeyValue">鍵值</param>
        /// <param name="KeyName">鍵名稱</param>
        /// <returns></returns>
        public bool DeletValue(string TAB, string KeyValue, string KeyName = "ID")
        {
            return DataBaseTool.DeletValue(TAB, KeyValue, connectionString, KeyName);
        }

        /// <summary>
        /// 修改TAB表所有標籤為KEY的所有資料
        /// </summary>
        /// <param name="TAB">表名稱</param>
        /// <param name="KeyValue">主鍵值</param>
        /// <param name="datas">待修改的資料資訊</param>
        /// <param name="connectionString"></param>
        /// <param name="KeyName">主鍵名稱</param>
        /// <returns></returns>
        public string UpdateValue(string TAB, string KeyValue, Dictionary<string, string> datas, string KeyName = "ID")
        {
            return DataBaseTool.UpdateValue(TAB, KeyValue, datas, connectionString, KeyName);
        }

        /// <summary>
        /// 查詢TAB表,KeyName為KeyValue的所有資料項
        /// </summary>
        /// <param name="TAB"></param>
        /// <param name="KeyValue"></param>
        /// <param name="KeyName"></param>
        /// <param name="columns">查詢的列名稱</param>
        /// <returns></returns>
        public string SelectValue(string TAB, string KeyValue, string KeyName = "ID", List<string> columns = null)
        {
            return DataBaseTool.SelectValue(TAB, KeyValue, connectionString, KeyName, columns);
        }

        /// <summary>
        /// 查詢TAB表,KeyName為KeyValue的所有資料項
        /// </summary>
        /// <param name="TAB"></param>
        /// <param name="KeyValue"></param>
        /// <param name="connectionString"></param>
        /// <param name="KeyName"></param>
        /// <param name="columns">查詢的列名稱</param>
        /// <returns></returns>
        public List<string> SelectValueList(string TAB, string KeyValue, string KeyName = "ID", List<string> columns = null)
        {
            return DataBaseTool.SelectValueList(TAB, KeyValue, connectionString, KeyName, columns);
        }

        #endregion

    }


    /// <summary>
    /// 資料庫靜態操作函式
    /// </summary>
    public class DataBaseTool
    {
        /// <summary>
        /// 獲取資料庫的連線字串
        /// </summary>
        /// <param name="DBName">資料庫名稱</param>
        /// <param name="UserName">使用者名稱稱</param>
        /// <param name="Password">密碼</param>
        public static string getConnectString(string DBName, string UserName, string Password)
        {
            if (DBName == null || DBName.Equals("")) DBName = "master";

            if (UserName == null || UserName.Equals("")) return "UserName不可為空";
            if (Password == null || Password.Equals("")) return "Password不可為空";

            string connectionString = @"Data Source=.\JSQL2008;Initial Catalog=" + DBName + ";User ID=" + UserName + ";Password=" + Password + ""; // 連線本地資料庫DBName
            // connectionString = @"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\NoteBook.mdf;Integrated Security=True;User Instance=True";  // 連線附加資料庫
            // connectionString = @"Data Source=.\JSQL2008;Initial Catalog=DataBase1;User ID=sa;Password=12345"; // 連線本地資料庫DataBase1

            return connectionString;
        }

        // 1、----------
        /// <summary>
        /// 連線資料庫,執行sql語句
        /// queryString = "SELECT * FROM 資料表1";
        /// </summary>
        public static String Execute(string queryString, string connectionString)
        {
            try
            {
                //string queryString =  "SELECT * FROM 資料表1";
                using (SqlConnection connection = new SqlConnection(connectionString))
                {
                    connection.Open();

                    SqlCommand command = new SqlCommand(queryString, connection);
                    SqlDataReader reader = command.ExecuteReader();

                    String jsonData = ToJson(reader);   // 轉化為Json資料
                    if (jsonData.Trim().Equals("")) jsonData = "success";

                    connection.Close();

                    return jsonData;
                }
            }
            catch (Exception ex)
            {
                return "fail";
            }
        }

        /// <summary>
        /// DataReader轉換為Json串
        /// </summary>
        public static string ToJson(SqlDataReader dataReader)
        {
            StringBuilder Builder = new StringBuilder();

            int rows = 0;
            while (dataReader.Read())
            {
                if (rows++ > 0) Builder.Append(",");

                // 行資料轉Json
                Builder.Append("{");
                for (int i = 0; i < dataReader.FieldCount; i++)
                {
                    if (i > 0) Builder.Append(",");

                    // 列名稱
                    string strKey = dataReader.GetName(i);
                    strKey = "\"" + strKey + "\"";

                    // 列資料
                    Type type = dataReader.GetFieldType(i);
                    string strValue = dataReader[i].ToString();
                    strValue = String.Format(strValue, type).Trim();
                    if (type == typeof(string) || type == typeof(DateTime)) strValue = "\"" + strValue + "\"";

                    Builder.Append(strKey + ":" + strValue);
                }
                Builder.Append("}");
            }
            dataReader.Close();

            if (rows > 1) return "[" + Builder.ToString() + "]";
            else return Builder.ToString();
        }



        // 2、----------
        /// <summary>
        /// 連線資料庫,執行sql語句
        /// queryString = "SELECT * FROM 資料表1";
        /// </summary>
        public static Dictionary<String, List<String>> ExecuteDic(string queryString, string connectionString)
        {
            try
            {
                //string queryString =  "SELECT * FROM 資料表1";
                using (SqlConnection connection = new SqlConnection(connectionString))
                {
                    connection.Open();

                    SqlCommand command = new SqlCommand(queryString, connection);
                    SqlDataReader reader = command.ExecuteReader();

                    Dictionary<String, List<String>> dic = ToDictionary(reader);    // 轉化為列list資料
                    connection.Close();

                    return dic;
                }
            }
            catch (Exception ex)
            {
                return new Dictionary<string, List<string>>();
            }
        }

        /// <summary>
        /// DataReader轉換為列list資料
        /// </summary>
        public static Dictionary<String, List<String>> ToDictionary(SqlDataReader dataReader)
        {
            Dictionary<String, List<String>> Dic = new Dictionary<string, List<string>>();

            while (dataReader.Read())
            {
                // 行資料轉Json
                for (int i = 0; i < dataReader.FieldCount; i++)
                {
                    // 列名稱
                    string strKey = dataReader.GetName(i);

                    List<String> list = null;
                    if (!Dic.ContainsKey(strKey))
                    {
                        list = new List<string>();  // 生成新的list
                        Dic.Add(strKey, list);
                    }
                    else list = Dic[strKey];        // 獲取列名對應的list

                    // 列資料
                    Type type = dataReader.GetFieldType(i);
                    string strValue = dataReader[i].ToString();
                    strValue = String.Format(strValue, type).Trim();

                    list.Add(strValue);
                }
            }
            dataReader.Close();

            return Dic;
        }


        // 3、----------
        /// <summary>
        /// 連線資料庫,執行sql語句
        /// queryString = "SELECT * FROM 資料表1";
        /// </summary>
        public static List<String> ExecuteList(string queryString, string connectionString)
        {
            Dictionary<String, List<String>> dic = ExecuteDic(queryString, connectionString);
            List<String> list = getList(dic, 0);
            return list;
        }

        /// <summary>
        /// 獲取dic的指定列
        /// </summary>
        /// <param name="dic"></param>
        /// <param name="index"></param>
        /// <returns></returns>
        public static List<String> getList(Dictionary<String, List<String>> dic, int index)
        {
            List<String> list = new List<string>();
            if (dic != null && dic.Count > 0 && 0 <= index && index < dic.Count)
            {
                List<string> keys = dic.Keys.ToList<string>();
                String key = keys[index];

                list = dic[key];
            }
            return list;
        }


        // 4、----------
        /// <summary>
        /// 連線資料庫,執行sql語句,返回Table表
        /// queryString = "SELECT * FROM 資料表1";
        /// </summary>
        public static Table ExecuteTable(string queryString, string connectionString)
        {
            try
            {
                //string queryString =  "SELECT * FROM 資料表1";
                using (SqlConnection connection = new SqlConnection(connectionString))
                {
                    connection.Open();

                    SqlCommand command = new SqlCommand(queryString, connection);
                    SqlDataReader reader = command.ExecuteReader();

                    Table table = ToTable(reader);    // 轉化為列list資料
                    connection.Close();

                    return table;
                }
            }
            catch (Exception ex)
            {
                return new Table();
            }
        }

        /// <summary>
        /// DataReader轉換為Table表
        /// </summary>
        public static Table ToTable(SqlDataReader dataReader)
        {
            Table table = new Table();
            table.Attributes.Add("border", "1");    // 新增邊框線
            table.Attributes.Add("BorderStyle", "Solid");
            table.Attributes.Add("width", "100%");  // 表格寬度
            table.Attributes.Add("cellspacing", "0");
            table.Attributes.Add("bordercolor", "DarkGray");

            TableHeaderRow header = new TableHeaderRow();

            bool firstrow = true;
            while (dataReader.Read())
            {
                TableRow row = new TableRow();

                // 行資料轉Json
                for (int i = 0; i < dataReader.FieldCount; i++)
                {
                    // Tab表頭
                    if (firstrow)
                    {
                        string strKey = dataReader.GetName(i);  // 列名稱
                        
                        TableHeaderCell headCell = new TableHeaderCell();
                        headCell.Text = strKey;

                        header.Cells.Add(headCell);
                    }

                    // Tab行資料
                    Type type = dataReader.GetFieldType(i);
                    string strValue = dataReader[i].ToString();
                    strValue = String.Format(strValue, type).Trim();

                    TableCell cell = new TableCell();
                    cell.Text = strValue;

                    row.Cells.Add(cell);
                }

                if (firstrow)
                {
                    table.Rows.Add(header);
                    firstrow = false;
                }
                table.Rows.Add(row);
            }
            
            dataReader.Close();

            return table;
        }
        //----------

        /// <summary>
        /// 判斷指定的資料庫是否存在
        /// </summary>
        /// <param name="DataBaseName">資料庫名稱</param>
        public static bool Exist(string DataBaseName, string connectString)
        {
            string sql = "select count(*) From master.dbo.sysdatabases where name='" + DataBaseName + "'";
            String result = Execute(sql, connectString);

            return (!result.Equals("{\"\":0}") && !result.Equals("fail"));
        }

        /// <summary>
        /// 建立指定名稱的資料庫
        /// </summary>
        /// <param name="DataBaseName">資料庫名稱</param>
        public static bool Create(string DataBaseName, string connectionString)
        {
            string sql = "CREATE DATABASE \"" + DataBaseName + "\"";
            String result = Execute(sql, connectionString);

            return result.Equals("success");
        }

        /// <summary>
        /// 獲取取所有資料庫名稱
        /// </summary>
        public static List<string> DataBaseNames(string connectionString)
        {
            string sql = "select name From master.dbo.sysdatabases";
            List<string> list = ExecuteList(sql, connectionString);

            return list;
        }

        /// <summary>
        /// 刪除指定的資料庫
        /// </summary>
        public static bool Delet(string DataBaseName, string connectionString)
        {
            string sql = "DROP DATABASE  \"" + DataBaseName + "\"";
            String result = Execute(sql, connectionString);

            return result.Equals("success");
        }


        #region 資料庫表操作

        /// <summary>
        /// 判斷資料庫中是否存在指定名稱的表
        /// </summary>
        /// <param name="TAB">表名稱</param>
        /// <param name="connectionString">資料庫連線串</param>
        /// <returns></returns>
        public static Boolean ExistTab(string TAB, string connectionString)
        {
            // 查詢表是否存在: select name from sys.tables where name='資料表1'
            String sql = "select name from sys.tables where name='" + TAB + "'";
            List<string> resultList = ExecuteList(sql, connectionString);
            String data = resultList.Count == 0 ? "" : resultList[0];

            return (data.Equals(TAB));
        }

        /// <summary>
        /// 建立指定名稱的表
        /// </summary>
        /// <param name="TAB">資料表名稱</param>
        /// <param name="ColumnInfo">列名稱,列長度資訊</param>
        /// <param name="connectionString"></param>
        /// <returns></returns>
        public static bool CreateTable(String TAB, Dictionary<string, int> ColumnInfo, string connectionString)
        {
            //if (ExistTab(TAB, connectionString)) return true;   // 若已存在資料表,則無需再建立

            //CREATE TABLE [dbo].[Log_All]
            //(
            //    [ID] INT NOT NULL PRIMARY KEY IDENTITY(100,1), 
            //    [日期] NCHAR(30) NULL, 
            //    [資訊] NCHAR(300) NULL
            //)

            // 生成資料表sql命令
            StringBuilder builder = new StringBuilder();
            builder.AppendLine("CREATE TABLE [dbo].[" + TAB + "] ");
            builder.AppendLine("( ");
            builder.AppendLine("    [ID] INT NOT NULL PRIMARY KEY IDENTITY(100,1),  "); // 新增主鍵ID為自增,從100開始
            foreach (string key in ColumnInfo.Keys)
            {
                string Name = key.Trim();
                int Len = ColumnInfo[key];
                builder.AppendLine("    [" + Name + "] NCHAR(" + Len + ") NULL,  ");
            }
            builder.AppendLine(") ");

            // 執行
            String sql = builder.ToString();
            String data = Execute(sql, connectionString);

            return (data.Trim().ToLower().Equals("success"));
        }

        /// <summary>
        /// 刪除當前資料庫中的TAB表
        /// </summary>
        public static bool DeletTable(String TAB, string connectionString)
        {
            string sql = "DROP TABLE \"" + TAB + "\"";
            String result = Execute(sql, connectionString);

            return result.Equals("success");
        }

        /// <summary>
        /// 向表中插入新的資料
        /// </summary>
        /// <param name="TAB">表名稱</param>
        /// <param name="values">列資料</param>
        /// <returns>新生成的資料行ID</returns>
        public static string InsetValue(string TAB, List<string> values, string connectionString)
        {
            //if (!ExistTab(TAB, connectionString)) return "fail";    // 若無資料表,則插入資料失敗

            //insert into Log_All(日期, 資訊) Values('日期1', '資訊1')
            //insert into Log_All(日期, 資訊) output inserted.id Values('日期4', '資訊4')   
            //insert into Log_All output inserted.id Values('日期x', '資訊x')

            StringBuilder builder = new StringBuilder();
            builder.AppendLine("insert into " + TAB + " output inserted.id Values");
            builder.AppendLine("( ");
            bool isfirst = true;
            foreach (string value in values)
            {
                builder.Append((isfirst ? "\r\n" : ", \r\n") + "'" + value + "'");
                isfirst = false;
            }
            builder.AppendLine(") ");

            String sql = builder.ToString();
            String data = ExecuteList(sql, connectionString)[0];

            return data;
        }

        /// <summary>
        /// 刪除TAB表中,KeyName主鍵值為KeyValue的所有資料項
        /// </summary>
        /// <param name="TAB">表名稱</param>
        /// <param name="Key">主鍵值</param>
        /// <returns></returns>
        public static bool DeletValue(string TAB, string KeyValue, string connectionString, string KeyName = "ID")
        {
            String sql = "delete from " + TAB + " where " + KeyName + "='" + KeyValue + "'"; ;
            String result = Execute(sql, connectionString);
            return result.Equals("success");
        }

        /// <summary>
        /// 修改TAB表所有標籤為KEY的所有資料
        /// </summary>
        /// <param name="TAB">表名稱</param>
        /// <param name="KeyValue">主鍵值</param>
        /// <param name="datas">待修改的資料資訊</param>
        /// <param name="connectionString"></param>
        /// <param name="KeyName">主鍵名稱</param>
        /// <returns></returns>
        public static string UpdateValue(string TAB, string KeyValue, Dictionary<string, string> datas, string connectionString, string KeyName="ID" )
        {
            // UPDATE Person SET Address = 'Zhongshan 23', City = 'Nanjing' WHERE LastName = 'Wilson'
            StringBuilder builder = new StringBuilder();
            bool isFirst = true;
            foreach (string key in datas.Keys)
            {
                builder.Append((isFirst ? " " : ", ") + key + " = " + "'" + datas[key] + "'");
                isFirst = false;
            }

            String sql = "update " + TAB + " set " + builder.ToString() + " where " + KeyName + "='" + KeyValue + "'";
            String data = Execute(sql, connectionString);
            return data;
        }

        /// <summary>
        /// 查詢TAB表,KeyName為KeyValue的所有資料項
        /// </summary>
        /// <param name="TAB"></param>
        /// <param name="KeyValue"></param>
        /// <param name="connectionString"></param>
        /// <param name="KeyName"></param>
        /// <param name="columns">查詢的列名稱</param>
        /// <returns></returns>
        public static string SelectValue(string TAB, string KeyValue, string connectionString, string KeyName = "ID", List<string> columns = null)
        {
            string selectColumn = getCondition(columns);
            String sql = "select " + selectColumn + " from [" + TAB + "]" + (KeyName.Equals("") ? "" : " where " + KeyName + "='" + KeyValue + "'");
            String data = Execute(sql, connectionString);
            return data;
        }

        /// <summary>
        /// 查詢TAB表,KeyName為KeyValue的所有資料項
        /// </summary>
        /// <param name="TAB"></param>
        /// <param name="KeyValue"></param>
        /// <param name="connectionString"></param>
        /// <param name="KeyName"></param>
        /// <param name="columns">查詢的列名稱</param>
        /// <returns></returns>
        public static List<string> SelectValueList(string TAB, string KeyValue, string connectionString, string KeyName = "ID", List<string> columns=null)
        {
            string selectColumn = getCondition(columns);
            String sql = "select " + selectColumn + " from [" + TAB + "]" + (KeyName.Equals("") ? "" : " where " + KeyName + "='" + KeyValue + "'");
            List<String> list = ExecuteList(sql, connectionString);
            return list;
        }

        /// <summary>
        /// 組合paramList中的引數資訊
        /// </summary>
        /// <param name="paramList"></param>
        /// <returns></returns>
        private static string getCondition(List<string> paramList = null)
        {
            string Condition = "*";
            if (paramList != null && paramList.Count > 0)
            {
                StringBuilder builder = new StringBuilder();
                bool isFirst = true;
                foreach (string key0 in paramList)
                {
                    string key = key0.Trim();
                    if (!key.Equals(""))
                    {
                        builder.Append((isFirst ? " " : ", ") + key);
                        isFirst = false;
                    }
                }
                Condition = builder.ToString();
                if (Condition.Trim().Equals("")) Condition = "*";
            }
            return Condition;
        }

        #endregion

    }


}

DataBase.cs (使用於SQL資料庫)

using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Web;

namespace WebApplicationTest
{
    /// <summary>
    /// 定義資料庫操作類,用於查詢和操作本地資料資訊
    /// 示例:DataBase newDataBase3 = new DataBase("newDataBase3", "sa", "12345");
    /// </summary>
    public class DataBase
    {
        private string DBName = "";             // 資料庫名稱
        private string UserName = "";           // 資料庫使用者名稱
        private string Password = "";           // 資料庫密碼

        public bool isInitSuccess = false;      // 記錄指定的資料庫是否可以連線成功

        public string connectionString = "";       // 當前資料庫連線串
        public string connectionString_master = "";// 連線到master資料庫的連線串

        /// <summary>
        /// 建立指定資料庫操作物件
        /// </summary>
        /// <param name="DBName">資料庫名稱</param>
        /// <param name="UserName">資料庫使用者名稱</param>
        /// <param name="Password">資料庫密碼</param>
        public DataBase(string DBName, string UserName, string Password)
        {
            if (DBName == null || DBName.Equals("") || UserName == null || UserName.Equals("") || Password == null || Password.Equals(""))
            {
                throw new Exception("DataBase()引數不可為空");
            }

            this.DBName = DBName;
            this.UserName = UserName;
            this.Password = Password;

            connectionString = DataBaseTool.getConnectString(DBName, UserName, Password);
            connectionString_master = DataBaseTool.getConnectString("", UserName, Password);

            //if (this.DBName != null && !this.DBName.Equals("") && !this.DBName.Equals("master"))
            {
                if (!DataBaseTool.Exist(DBName, connectionString_master))  // 判斷資料庫是否存在,若不存在則建立資料庫
                {
                    isInitSuccess = DataBaseTool.Create(DBName, connectionString_master);
                }
                else isInitSuccess = true;
            }
        }

        public String Execute(string sql)
        {
            return DataBaseTool.Execute(sql, connectionString);
        }

        public Dictionary<String, List<String>> ExecuteDic(string sql)
        {
            return DataBaseTool.ExecuteDic(sql, connectionString);
        }

        public List<String> ExecuteList(string sql)
        {
            return DataBaseTool.ExecuteList(sql, connectionString);
        }

        /// <summary>
        /// 所有資料庫名稱
        /// </summary>
        public List<String> DataBaseNames()
        {
            return DataBaseTool.DataBaseNames(connectionString_master);
        }

        /// <summary>
        /// 當前資料中,所有表名稱
        /// </summary>
        public List<String> TableNames()
        {
            string sql = "select name from sysobjects where xtype='U'";
            List<string> list = ExecuteList(sql);

            return list;
        }

        /// <summary>
        /// 刪除指定的資料庫
        /// </summary>
        public bool DeletDataBase(string DataBaseName)
        {
            if (DataBaseName == null || DataBaseName.Equals("")) DataBaseName = DBName;
            return DataBaseTool.Delet(DataBaseName, connectionString_master);
        }


        #region 資料庫表操作

        /// <summary>
        /// 判斷當前資料庫中,是否存在指定名稱的表
        /// </summary>
        /// <param name="TAB">表名稱</param>
        public bool ExistTab(string TAB)
        {
            return DataBaseTool.ExistTab(TAB, connectionString);
        }

        /// <summary>
        /// 在當前資料庫中建立資料表
        /// </summary>
        /// <param name="TAB">表名稱</param>
        /// <param name="Colums">所有列名稱</param>
        public bool CreateTable(String TAB, List<string> Colums)
        {
            if (Colums.Count==0) Colums = new String[] { "KEY", "VALUE" }.ToList();  // 未指定列名稱時,預設新增KEY、VALUE兩列

            Dictionary<string, int> ColumnInfo = new Dictionary<string, int>();
            foreach (string col in Colums)
            {
                ColumnInfo.Add(col, 100);
            }
            //ColumnInfo.Add("EXT", 300);     // 預設新增一個拓展欄位列

            return DataBaseTool.CreateTable(TAB, ColumnInfo, connectionString);
        }

        /// <summary>
        /// 在當前資料庫中建立資料表
        /// </summary>
        /// <param name="TAB">表名稱</param>
        /// <param name="ColumnInfo">所有列資訊</param>
        /// <returns></returns>
        public bool CreateTable(String TAB, Dictionary<string, int> ColumnInfo)
        {
            return DataBaseTool.CreateTable(TAB, ColumnInfo, connectionString);
        }

        /// <summary>
        /// 刪除當前資料庫中的TAB表
        /// </summary>
        public bool DeletTable(String TAB)
        {
            return DataBaseTool.DeletTable(TAB, connectionString);
        }

        /// <summary>
        /// 向表中插入新的資料
        /// </summary>
        /// <param name="TAB">表名稱</param>
        /// <param name="values">列資料</param>
        /// <returns>新生成的資料行ID</returns>
        public string InsetValue(string TAB, List<string> values)
        {
            return DataBaseTool.InsetValue(TAB, values, connectionString);
        }

         /// <summary>
        /// 刪除TAB表中,KeyName為KeyValue的所有行
        /// </summary>
        /// <param name="TAB">表名稱</param>
        /// <param name="KeyValue">鍵值</param>
        /// <param name="KeyName">鍵名稱</param>
        /// <returns></returns>
        public bool DeletValue(string TAB, string KeyValue, string KeyName = "ID")
        {
            return DataBaseTool.DeletValue(TAB, KeyValue, connectionString, KeyName);
        }

        /// <summary>
        /// 修改TAB表所有標籤為KEY的所有資料
        /// </summary>
        /// <param name="TAB">表名稱</param>
        /// <param name="KeyValue">主鍵值</param>
        /// <param name="datas">待修改的資料資訊</param>
        /// <param name="connectionString"></param>
        /// <param name="KeyName">主鍵名稱</param>
        /// <returns></returns>
        public string UpdateValue(string TAB, string KeyValue, Dictionary<string, string> datas, string KeyName = "ID")
        {
            return DataBaseTool.UpdateValue(TAB, KeyValue, datas, connectionString, KeyName);
        }

        /// <summary>
        /// 查詢TAB表,KeyName為KeyValue的所有資料項
        /// </summary>
        /// <param name="TAB"></param>
        /// <param name="KeyValue"></param>
        /// <param name="KeyName"></param>
        /// <param name="columns">查詢的列名稱</param>
        /// <returns></returns>
        public string SelectValue(string TAB, string KeyValue, string KeyName = "ID", List<string> columns = null)
        {
            return DataBaseTool.SelectValue(TAB, KeyValue, connectionString, KeyName, columns);
        }

        /// <summary>
        /// 查詢TAB表,KeyName為KeyValue的所有資料項
        /// </summary>
        /// <param name="TAB"></param>
        /// <param name="KeyValue"></param>
        /// <param name="connectionString"></param>
        /// <param name="KeyName"></param>
        /// <param name="columns">查詢的列名稱</param>
        /// <returns></returns>
        public List<string> SelectValueList(string TAB, string KeyValue, string KeyName = "ID", List<string> columns = null)
        {
            return DataBaseTool.SelectValueList(TAB, KeyValue, connectionString, KeyName, columns);
        }

        #endregion

    }


    /// <summary>
    /// 資料庫靜態操作函式
    /// </summary>
    public class DataBaseTool
    {
        /// <summary>
        /// 獲取資料庫的連線字串
        /// </summary>
        /// <param name="DBName">資料庫名稱</param>
        /// <param name="UserName">使用者名稱稱</param>
        /// <param name="Password">密碼</param>
        public static string getConnectString(string DBName, string UserName, string Password)
        {
            if (DBName == null || DBName.Equals("")) DBName = "master";

            if (UserName == null || UserName.Equals("")) return "UserName不可為空";
            if (Password == null || Password.Equals("")) return "Password不可為空";

            string connectionString = @"Data Source=.\JSQL2008;Initial Catalog=" + DBName + ";User ID=" + UserName + ";Password=" + Password + ""; // 連線本地資料庫DBName
            // connectionString = @"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\NoteBook.mdf;Integrated Security=True;User Instance=True";  // 連線附加資料庫
            // connectionString = @"Data Source=.\JSQL2008;Initial Catalog=DataBase1;User ID=sa;Password=12345"; // 連線本地資料庫DataBase1

            return connectionString;
        }

        // 1、----------
        /// <summary>
        /// 連線資料庫,執行sql語句
        /// queryString = "SELECT * FROM 資料表1";
        /// </summary>
        public static String Execute(string queryString, string connectionString)
        {
            try
            {
                //string queryString =  "SELECT * FROM 資料表1";
                using (SqlConnection connection = new SqlConnection(connectionString))
                {
                    connection.Open();

                    SqlCommand command = new SqlCommand(queryString, connection);
                    SqlDataReader reader = command.ExecuteReader();

                    String jsonData = ToJson(reader);   // 轉化為Json資料
                    if (jsonData.Trim().Equals("")) jsonData = "success";

                    connection.Close();

                    return jsonData;
                }
            }
            catch (Exception ex)
            {
                return "fail";
            }
        }

        /// <summary>
        /// DataReader轉換為Json串
        /// </summary>
        public static string ToJson(SqlDataReader dataReader)
        {
            StringBuilder Builder = new StringBuilder();

            int rows = 0;
            while (dataReader.Read())
            {
                if (rows++ > 0) Builder.Append(",");

                // 行資料轉Json
                Builder.Append("{");
                for (int i = 0; i < dataReader.FieldCount; i++)
                {
                    if (i > 0) Builder.Append(",");

                    // 列名稱
                    string strKey = dataReader.GetName(i);
                    strKey = "\"" + strKey + "\"";

                    // 列資料
                    Type type = dataReader.GetFieldType(i);
                    string strValue = dataReader[i].ToString();
                    strValue = String.Format(strValue, type).Trim();
                    if (type == typeof(string) || type == typeof(DateTime)) strValue = "\"" + strValue + "\"";

                    Builder.Append(strKey + ":" + strValue);
                }
                Builder.Append("}");
            }
            dataReader.Close();

            if (rows > 1) return "[" + Builder.ToString() + "]";
            else return Builder.ToString();
        }

        // 2、----------
        /// <summary>
        /// 連線資料庫,執行sql語句
        /// queryString = "SELECT * FROM 資料表1";
        /// </summary>
        public static Dictionary<String, List<String>> ExecuteDic(string queryString, string connectionString)
        {
            try
            {
                //string queryString =  "SELECT * FROM 資料表1";
                using (SqlConnection connection = new SqlConnection(connectionString))
                {
                    connection.Open();

                    SqlCommand command = new SqlCommand(queryString, connection);
                    SqlDataReader reader = command.ExecuteReader();

                    Dictionary<String, List<String>> dic = ToDictionary(reader);    // 轉化為列list資料
                    connection.Close();

                    return dic;
                }
            }
            catch (Exception ex)
            {
                return new Dictionary<string, List<string>>();
            }
        }

        /// <summary>
        /// DataReader轉換為列list資料
        /// </summary>
        public static Dictionary<String, List<String>> ToDictionary(SqlDataReader dataReader)
        {
            Dictionary<String, List<String>> Dic = new Dictionary<string, List<string>>();

            while (dataReader.Read())
            {
                // 行資料轉Json
                for (int i = 0; i < dataReader.FieldCount; i++)
                {
                    // 列名稱
                    string strKey = dataReader.GetName(i);

                    List<String> list = null;
                    if (!Dic.ContainsKey(strKey))
                    {
                        list = new List<string>();  // 生成新的list
                        Dic.Add(strKey, list);
                    }
                    else list = Dic[strKey];        // 獲取列名對應的list

                    // 列資料
                    Type type = dataReader.GetFieldType(i);
                    string strValue = dataReader[i].ToString();
                    strValue = String.Format(strValue, type).Trim();

                    list.Add(strValue);
                }
            }
            dataReader.Close();

            return Dic;
        }

        // 3、----------
        /// <summary>
        /// 連線資料庫,執行sql語句
        /// queryString = "SELECT * FROM 資料表1";
        /// </summary>
        public static List<String> ExecuteList(string queryString, string connectionString)
        {
            Dictionary<String, List<String>> dic = ExecuteDic(queryString, connectionString);
            List<String> list = getList(dic, 0);
            return list;
        }

        /// <summary>
        /// 獲取dic的指定列
        /// </summary>
        /// <param name="dic"></param>
        /// <param name="index"></param>
        /// <returns></returns>
        public static List<String> getList(Dictionary<String, List<String>> dic, int index)
        {
            List<String> list = new List<string>();
            if (dic != null && dic.Count > 0 && 0 <= index && index < dic.Count)
            {
                List<string> keys = dic.Keys.ToList<string>();
                String key = keys[index];

                list = dic[key];
            }
            return list;
        }

        //----------

        /// <summary>
        /// 判斷指定的資料庫是否存在
        /// </summary>
        /// <param name="DataBaseName">資料庫名稱</param>
        public static bool Exist(string DataBaseName, string connectString)
        {
            string sql = "select count(*) From master.dbo.sysdatabases where name='" + DataBaseName + "'";
            String result = Execute(sql, connectString);

            return (!result.Equals("{\"\":0}") && !result.Equals("fail"));
        }

        /// <summary>
        /// 建立指定名稱的資料庫
        /// </summary>
        /// <param name="DataBaseName">資料庫名稱</param>
        public static bool Create(string DataBaseName, string connectionString)
        {
            string sql = "CREATE DATABASE \"" + DataBaseName + "\"";
            String result = Execute(sql, connectionString);

            return result.Equals("success");
        }

        /// <summary>
        /// 獲取取所有資料庫名稱
        /// </summary>
        public static List<string> DataBaseNames(string connectionString)
        {
            string sql = "select name From master.dbo.sysdatabases";
            List<string> list = ExecuteList(sql, connectionString);

            return list;
        }

        /// <summary>
        /// 刪除指定的資料庫
        /// </summary>
        public static bool Delet(string DataBaseName, string connectionString)
        {
            string sql = "DROP DATABASE  \"" + DataBaseName + "\"";
            String result = Execute(sql, connectionString);

            return result.Equals("success");
        }


        #region 資料庫表操作

        /// <summary>
        /// 判斷資料庫中是否存在指定名稱的表
        /// </summary>
        /// <param name="TAB">表名稱</param>
        /// <param name="connectionString">資料庫連線串</param>
        /// <returns></returns>
        public static Boolean ExistTab(string TAB, string connectionString)
        {
            // 查詢表是否存在: select name from sys.tables where name='資料表1'
            String sql = "select name from sys.tables where name='" + TAB + "'";
            List<string> resultList = ExecuteList(sql, connectionString);
            String data = resultList.Count == 0 ? "" : resultList[0];

            return (data.Equals(TAB));
        }

        /// <summary>
        /// 建立指定名稱的表
        /// </summary>
        /// <param name="TAB">資料表名稱</param>
        /// <param name="ColumnInfo">列名稱,列長度資訊</param>
        /// <param name="connectionString"></param>
        /// <returns></returns>
        public static bool CreateTable(String TAB, Dictionary<string, int> ColumnInfo, string connectionString)
        {
            //if (ExistTab(TAB, connectionString)) return true;   // 若已存在資料表,則無需再建立

            //CREATE TABLE [dbo].[Log_All]
            //(
            //    [ID] INT NOT NULL PRIMARY KEY IDENTITY(100,1), 
            //    [日期] NCHAR(30) NULL, 
            //    [資訊] NCHAR(300) NULL
            //)

            // 生成資料表sql命令
            StringBuilder builder = new StringBuilder();
            builder.AppendLine("CREATE TABLE [dbo].[" + TAB + "] ");
            builder.AppendLine("( ");
            builder.AppendLine("    [ID] INT NOT NULL PRIMARY KEY IDENTITY(100,1),  "); // 新增主鍵ID為自增,從100開始
            foreach (string key in ColumnInfo.Keys)
            {
                string Name = key.Trim();
                int Len = ColumnInfo[key];
                builder.AppendLine("    [" + Name + "] NCHAR(" + Len + ") NULL,  ");
            }
            builder.AppendLine(") ");

            // 執行
            String sql = builder.ToString();
            String data = Execute(sql, connectionString);

            return (data.Trim().ToLower().Equals("success"));
        }

        /// <summary>
        /// 刪除當前資料庫中的TAB表
        /// </summary>
        public static bool DeletTable(String TAB, string connectionString)
        {
            string sql = "DROP TABLE \"" + TAB + "\"";
            String result = Execute(sql, connectionString);

            return result.Equals("success");
        }

        /// <summary>
        /// 向表中插入新的資料
        /// </summary>
        /// <param name="TAB">表名稱</param>
        /// <param name="values">列資料</param>
        /// <returns>新生成的資料行ID</returns>
        public static string InsetValue(string TAB, List<string> values, string connectionString)
        {
            //if (!ExistTab(TAB, connectionString)) return "fail";    // 若無資料表,則插入資料失敗

            //insert into Log_All(日期, 資訊) Values('日期1', '資訊1')
            //insert into Log_All(日期, 資訊) output inserted.id Values('日期4', '資訊4')   
            //insert into Log_All output inserted.id Values('日期x', '資訊x')

            StringBuilder builder = new StringBuilder();
            builder.AppendLine("insert into " + TAB + " output inserted.id Values");
            builder.AppendLine("( ");
            bool isfirst = true;
            foreach (string value in values)
            {
                builder.Append((isfirst ? "\r\n" : ", \r\n") + "'" + value + "'");
                isfirst = false;
            }
            builder.AppendLine(") ");

            String sql = builder.ToString();
            String data = ExecuteList(sql, connectionString)[0];

            return data;
        }

        /// <summary>
        /// 刪除TAB表中,KeyName主鍵值為KeyValue的所有資料項
        /// </summary>
        /// <param name="TAB">表名稱</param>
        /// <param name="Key">主鍵值</param>
        /// <returns></returns>
        public static bool DeletValue(string TAB, string KeyValue, string connectionString, string KeyName = "ID")
        {
            String sql = "delete from " + TAB + " where " + KeyName + "='" + KeyValue + "'"; ;
            String result = Execute(sql, connectionString);
            return result.Equals("success");
        }

        /// <summary>
        /// 修改TAB表所有標籤為KEY的所有資料
        /// </summary>
        /// <param name="TAB">表名稱</param>
        /// <param name="KeyValue">主鍵值</param>
        /// <param name="datas">待修改的資料資訊</param>
        /// <param name="connectionString"></param>
        /// <param name="KeyName">主鍵名稱</param>
        /// <returns></returns>
        public static string UpdateValue(string TAB, string KeyValue, Dictionary<string, string> datas, string connectionString, string KeyName="ID" )
        {
            // UPDATE Person SET Address = 'Zhongshan 23', City = 'Nanjing' WHERE LastName = 'Wilson'
            StringBuilder builder = new StringBuilder();
            bool isFirst = true;
            foreach (string key in datas.Keys)
            {
                builder.Append((isFirst ? " " : ", ") + key + " = " + "'" + datas[key] + "'");
                isFirst = false;
            }

            String sql = "update " + TAB + " set " + builder.ToString() + " where " + KeyName + "='" + KeyValue + "'";
            String data = Execute(sql, connectionString);
            return data;
        }

        /// <summary>
        /// 查詢TAB表,KeyName為KeyValue的所有資料項
        /// </summary>
        /// <param name="TAB"></param>
        /// <param name="KeyValue"></param>
        /// <param name="connectionString"></param>
        /// <param name="KeyName"></param>
        /// <param name="columns">查詢的列名稱</param>
        /// <returns></returns>
        public static string SelectValue(string TAB, string KeyValue, string connectionString, string KeyName = "ID", List<string> columns = null)
        {
            string selectColumn = getCondition(columns);
            String sql = "select " + selectColumn + " from [" + TAB + "]" + (KeyName.Equals("") ? "" : " where " + KeyName + "='" + KeyValue + "'");
            String data = Execute(sql, connectionString);
            return data;
        }

        /// <summary>
        /// 查詢TAB表,KeyName為KeyValue的所有資料項
        /// </summary>
        /// <param name="TAB"></param>
        /// <param name="KeyValue"></param>
        /// <param name="connectionString"></param>
        /// <param name="KeyName"></param>
        /// <param name="columns">查詢的列名稱</param>
        /// <returns></returns>
        public static List<string> SelectValueList(string TAB, string KeyValue, string connectionString, string KeyName = "ID", List<string> columns=null)
        {
            string selectColumn = getCondition(columns);
            String sql = "select " + selectColumn + " from [" + TAB + "]" + (KeyName.Equals("") ? "" : " where " + KeyName + "='" + KeyValue + "'");
            List<String> list = ExecuteList(sql, connectionString);
            return list;
        }

        /// <summary>
        /// 組合paramList中的引數資訊
        /// </summary>
        /// <param name="paramList"></param>
        /// <returns></returns>
        private static string getCondition(List<string> paramList = null)
        {
            string Condition = "*";
            if (paramList != null && paramList.Count > 0)
            {
                StringBuilder builder = new StringBuilder();
                bool isFirst = true;
                foreach (string key0 in paramList)
                {
                    string key = key0.Trim();
                    if (!key.Equals(""))
                    {
                        builder.Append((isFirst ? " " : ", ") + key);
                        isFirst = false;
                    }
                }
                Condition = builder.ToString();
                if (Condition.Trim().Equals("")) Condition = "*";
            }
            return Condition;
        }

        #endregion

    }


}