C#动态建库建表学习

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

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

 #region IsDBExist-判断数据库是否存在
        /// <summary>
        /// 判断数据库是否存在
        /// </summary>
        /// <param name="db">数据库的名称</param>
        /// <param name="connKey">数据库的连接Key</param>
        /// <returns>true:表示数据库已经存在;false,表示数据库不存在</returns>
        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-判断数据库表是否存在
        /// <summary>
        /// 判断数据库表是否存在
        /// </summary>
        /// <param name="db">数据库</param>
        /// <param name="tb">数据库表名</param>
        /// <param name="connKey">连接数据库的key</param>
        /// <returns></returns>
        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-创建数据库
        /// <summary>
        /// 创建数据库
        /// </summary>
        /// <param name="db">数据库名称</param>
        /// <param name="connKey">连接数据库的key</param>
        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-在指定的数据库中,创建数据库表
        /// <summary>
        ///在指定的数据库中,创建数据库表
        /// </summary>
        /// <param name="db">指定的数据库</param>
        /// <param name="dt">要创建的数据库表</param>
        /// <param name="dic">数据表中的字段及其数据类型</param>
        /// <param name="connKey">数据库的连接Key</param>
        public void CreateDataTable(string db, string dt, Dictionary<string, string> 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<string> test = new List<string>(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-批量删除数据表
        /// <summary>
        /// 批量删除数据库
        /// </summary>
        /// <param name="db">指定的数据库</param>
        /// <param name="dt">要删除的数据库表集合</param>
        /// <param name="connKey">数据库连接串</param>
        /// <returns>删除是否成功,true表示删除成功,false表示删除失败</returns>
        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-删除数据库
        /// <summary>
        /// 删除数据库
        /// </summary>
        /// <param name="db">数据库名</param>
        /// <param name="connKey">数据库连接串</param>
        /// <returns>删除成功为true,删除失败为false</returns>
        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-创建数据库表(多张表)
        /// <summary>
        ///  在指定的数据库中,创建数据表
        /// </summary>
        /// <param name="db">指定的数据库</param>
        /// <param name="dt">要创建的数据表集合</param>
        /// <param name="dic">数据表中的字段及其数据类型  Dictionary集合</param>
        /// <param name="connKey">数据库的连接Key</param>
        public void CreateDataTable(string db, string[] dt, List<Dictionary<string, string>> 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语句
        /// <summary>
        /// 拼接创建数据库表的Sql语句
        /// </summary>
        /// <param name="db">指定的数据库</param>
        /// <param name="dt">要创建的数据表</param>
        /// <param name="dic">数据表中的字段及其数据类型</param>
        /// <returns>拼接完的字符串</returns>
        public string PinjieSql(string db, string dt, Dictionary<string, string> dic)
        {
            //拼接字符串,(该串为创建内容)
            string content = "serial int identity(1,1) primary key ";
            //取出dic中的内容,进行拼接
            List<string> test = new List<string>(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<Dictionary<string, string>> listDic = new 
List<Dictionary<string, string>>();

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

                Dictionary<string, string> dic2 = new Dictionary<string, string>();
                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");
该功能仅限于学习阶段,是对他人博客进行的实践学习。

   

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 18
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值