C#动态建库建表学习

         ITOO3.0的学习中为需要动态的建库建表来满足业务的灵活性,该功能使用过拼接建库建表的SQL语句以及SQLHelper实现的。

     这里只展示操作类,至于SQLHelper不再赘述。

 #region IsDBExist-判断数据库是否存在
        /// 
        /// 判断数据库是否存在
        /// 
        /// 数据库的名称
        /// 数据库的连接Key
        /// true:表示数据库已经存在;false,表示数据库不存在
        public Boolean IsDBExist(string db, string connKey)
        {
            SQLHelper helper = SQLHelper.GetInstance();

            string connToMaster = ConfigurationManager.ConnectionStrings[connKey].ToString();
            string createDbStr = " select * from master.dbo.sysdatabases where name " + "= '" + db + "'";

            DataTable dt = helper.ExecuteQuery(createDbStr, CommandType.Text);
            if (dt.Rows.Count == 0)
            {
                return false;
            }
            else
            {
                return true;
            }
        }
        #endregion

        #region IsTableExist-判断数据库表是否存在
        /// 
        /// 判断数据库表是否存在
        /// 
        /// 数据库
        /// 数据库表名
        /// 连接数据库的key
        /// 
        public Boolean IsTableExist(string db, string tb, string connKey)
        {
            SQLHelper helper = SQLHelper.GetInstance();
            string connToMaster = ConfigurationManager.ConnectionStrings[connKey].ToString();
            string createDbStr = "use " + db + " select 1 from sysobjects where id = object_id('" + tb + "') and type ='U'";
            //在指定的数据库中 查找该表是否存在
            DataTable dt = helper.ExecuteQuery(createDbStr, CommandType.Text);
            if (dt.Rows.Count == 0)
            {
                return false;
            }
            else
            {
                return true;
            }
        }
        #endregion

        #region CreateDataBase-创建数据库
        /// 
        /// 创建数据库
        /// 
        /// 数据库名称
        /// 连接数据库的key
        public void CreateDataBase(string db, string connKey)
        {
            SQLHelper helper = SQLHelper.GetInstance();
            //符号变量,判断数据库是否存在
            Boolean flag = IsDBExist(db, connKey);

            //如果数据库存在,则抛出
            if (flag == true)
            {

                throw new Exception("数据库已经存在!");

            }
            else
            {
                //数据库不存在,创建数据库
                string connToMaster = ConfigurationManager.ConnectionStrings[connKey].ToString();
                string createDbStr = "Create database " + db;
                helper.ExecuteNonQuery(createDbStr, CommandType.Text);
            }
        }
        #endregion

        #region CreateDataTable-在指定的数据库中,创建数据库表
        /// 
        ///在指定的数据库中,创建数据库表
        /// 
        /// 指定的数据库
        /// 要创建的数据库表
        /// 数据表中的字段及其数据类型
        /// 数据库的连接Key
        public void CreateDataTable(string db, string dt, Dictionary dic, string connKey)
        {
            SQLHelper helper = SQLHelper.GetInstance();

            string connToMaster = ConfigurationManager.ConnectionStrings[connKey].ToString();

            //判断数据库是否存在
            if (IsDBExist(db, connKey) == false)
            {
                throw new Exception("数据库不存在!");


            }
            //如果数据库表存在,则抛出错误
            if (IsTableExist(db, dt, connKey) == true)
            {
                throw new Exception("数据库表已经存在!");
            }
            //数据库表不存在,创建表
            else
            {
                //拼接字符串,该串为创建内容
                string content = "serial int identity(1,1) primary key";
                //取出dic中的内容,进行拼接
                List test = new List(dic.Keys);
                for (int i = 0; i < dic.Count(); i++)
                {
                    content = content + "," + test[i] + "" + dic[test[i]];
                }

                //其后判断数据库表是否存在,然创建表
                string createTableStr = "use " + db + "create table" + dt + "(" + content + ")";
                helper.ExecuteNonQuery(createTableStr, CommandType.Text);

            }


        }
        #endregion

        #region DropDataTable-批量删除数据表
        /// 
        /// 批量删除数据库
        /// 
        /// 指定的数据库
        /// 要删除的数据库表集合
        /// 数据库连接串
        /// 删除是否成功,true表示删除成功,false表示删除失败
        public bool DropDataTable(string db, string[] dt, string connKey)
        {
            SQLHelper helper = SQLHelper.GetInstance();

            string connToMaster = ConfigurationManager.ConnectionStrings[connKey].ToString();

            //判断数据库是否存在
            if (IsDBExist(db, connKey) == false)
            {
                throw new Exception("数据库不存在!");
            }

            for (int i = 0; i < dt.Count(); i++)
            {
                //如果数据库表存在,则抛出错误
                if (IsTableExist(db, dt[i], connKey) == false)
                {
                    //如果数据库表已经删除,则跳过该表
                    continue;
                }
                else//数据表存在,则进行删除数据表
                {
                    //其后判断数据表是否存在,然后创建数据表
                    string createTableStr = "use " + db + " drop table " + dt[i] + " ";
                    helper.ExecuteNonQuery(createTableStr, CommandType.Text);
                }
            }
            return true;
        }
        #endregion

        #region DropDataBase-删除数据库
        /// 
        /// 删除数据库
        /// 
        /// 数据库名
        /// 数据库连接串
        /// 删除成功为true,删除失败为false
        public bool DropDataBase(string db, string connKey)
        {
            SQLHelper helper = SQLHelper.GetInstance();
            //符号变量,判断数据库是否存在
            Boolean flag = IsDBExist(db, connKey);

            //如果数据库不存在,则抛出
            if (flag == false)
            {
                return false;
            }
            else
            {
                //数据库存在,删除数据库
                string connToMaster = ConfigurationManager.ConnectionStrings[connKey].ToString();
                string createDbStr = "Drop database " + db;
                helper.ExecuteNonQuery(createDbStr, CommandType.Text);
                return true;
            }
        }
        #endregion

        #region CreateDataTable-创建数据库表(多张表)
        /// 
        ///  在指定的数据库中,创建数据表
        /// 
        /// 指定的数据库
        /// 要创建的数据表集合
        /// 数据表中的字段及其数据类型  Dictionary集合
        /// 数据库的连接Key
        public void CreateDataTable(string db, string[] dt, List> dic, string connKey)
        {
            SQLHelper helper = SQLHelper.GetInstance();

            string connToMaster = ConfigurationManager.ConnectionStrings[connKey].ToString();

            //判断数据库是否存在
            if (IsDBExist(db, connKey) == false)
            {
                throw new Exception("数据库不存在!");
            }

            for (int i = 0; i < dt.Count(); i++)
            {
                //如果数据库表存在,则抛出错误
                if (IsTableExist(db, dt[i], connKey) == true)
                {
                    //如果数据库表已经存在,则跳过该表
                    continue;
                }
                else//数据表不存在,创建数据表
                {
                    //其后判断数据表是否存在,然后创建数据表
                    string createTableStr = PinjieSql(db, dt[i], dic[i]);
                    helper.ExecuteNonQuery(createTableStr, CommandType.Text);
                }
            }
        }
        #endregion

        #region PinjieSql-拼接创建数据库表的Sql语句
        /// 
        /// 拼接创建数据库表的Sql语句
        /// 
        /// 指定的数据库
        /// 要创建的数据表
        /// 数据表中的字段及其数据类型
        /// 拼接完的字符串
        public string PinjieSql(string db, string dt, Dictionary dic)
        {
            //拼接字符串,(该串为创建内容)
            string content = "serial int identity(1,1) primary key ";
            //取出dic中的内容,进行拼接
            List test = new List(dic.Keys);
            for (int i = 0; i < dic.Count(); i++)
            {
                content = content + " , " + test[i] + " " + dic[test[i]];
            }

            //其后判断数据表是否存在,然后创建数据表
            string createTableStr = "use " + db + " create table " + dt + " (" + content + ")";
            return createTableStr;
        }

        #endregion
       前台调用操作类方法

      

if (!Page .IsPostBack)
            {
                dynamicCreateDB operateDB = new dynamicCreateDB();
                //先删除ceshi 数据库
                operateDB.DropDataBase("ceshi", "MSSql2012");
                //创建一个名为test的库
                operateDB.CreateDataBase("ceshi", "MSSql2012");
                //创建键值集合
                List> listDic = new 
List>();

                //用一个键值来保存数据库表的字段和数据类型
                Dictionary dic1 = new Dictionary();
                dic1.Add("questionName", "varchar(20)");
                dic1.Add("content", "varchar(20)");

                Dictionary dic2 = new Dictionary();
                dic2.Add("questionName", "varchar(20)");
                dic2.Add("content", "varchar(20)");

                listDic.Add(dic1);
                listDic.Add(dic2);

                //在test库中创建一张纸名为xuanzeti的表
                string[] listTable = { "xuanzeti", "tiankongti" };
                operateDB.CreateDataTable("ceshi",listTable, listDic,"MSSql2012");

                operateDB.DropDataTable("ceshi", listTable, "MSSql2012");
                operateDB.DropDataBase("ceshi","MSSql2012");
该功能仅限于学习阶段,是对他人博客进行的实践学习。

   

你可能感兴趣的:(----------【DB】,----------【C#】)