在11月10号。我们开始着手做高校平台这个项目,这个项目里面,有很多的子系统。权限系统、基础系统、考试系统……
既然是高校平台,当然不只是一个学校用的,可以很多的学校公用。既然如此,每个学校所要保存的数据当然不可能存放在一个库中。一个学校一个库,那么有几个学校用呢?未知。库的数量得视情况而定。动态创建库可以解决这种问题。
当然,系统有很多。但是个人只是参与子系统的开发。在之前一直在考试系统里面打杂。这个项目分配下来了之后,我也就开始由打杂换了一种方式去打杂.
在做项目的过程中,任务的分配是非常明确的。什么时间干什么事情,每天的任务等等。加上模块的划分,各系统之间的耦合要低等原则。这就要求底层的东西要封装的特别好,重用性很高。
因为之前一直都是在做题型和题库 这几个模块。相对于其他的模块来说,题型这里更加抽象。因为每个题型都有不同的特点。需要保存的方式也不同。至于题库,那更是得需要题型提供支持啦。
总不能每个题型写一遍。那还不得累死。
在做需求的时候,就已经知道,题型的这一部分是活的。这就需要一种新的方法——动态创建表。
动态生成库,生成表。只知道用这些能解决以上的问题。
在没有接触这些东西之前,画题型的原型……不会画。画题型的类图……把每个题型都画出来?累死不说,还不能扩展。
这样做出来的系统,要想添加题型,改代码那是肯定的了。
碰巧,前一阵子被组长调出去了,所要做的任务,也非常的适合。就是要把创建数据库的方法和创建数据库表的方法封装起来。
这东西做完,对理解题型需求是非常有用的。
任务很模糊,先做一个Demo,能实现就行。
1、提供数据库名,然后去创建。
2、指定数据库和数据表。当然还必须提供表字段和数据类型。去创建一张表。
在研究了一番之后,也就先用拼接sql语句的方法来做吧。有其他方法的请指出。
这些东西都被封装在底层了。所以动态创建库的方法 都需要用到SqlHelper。这里就不写了。如果需要的话,文章末尾有下载地址。
#region 判断数据库是否存在 /// <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 判断数据库中,指定表是否存在 /// <summary> /// 判断数据库表是否存在 /// </summary> /// <param name="db">数据库</param> /// <param name="tb">数据表名</param> /// <param name="connKey">连接数据库的key</param> /// <returns>true:表示数据表已经存在;false,表示数据表不存在</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 创建数据库 /// <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 创建数据库表 /// <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
以上就是与动态创建库,创建表相关的函数。
下面这里是调用
protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { //创建一个名为testQuestion的库 CreateDataBase("questionType", "MSSql2012"); //用一个dictionary类型,来保存 数据库表的字段 和 数据类型 Dictionary<string, string> dic = new Dictionary<string, string>(); dic.Add("questionName", "varchar(20)"); dic.Add("content", "varchar(20)"); //在questionType库中创建一张名为xuanzeti的表 CreateDataTable("questionType", "xuanzeti", dic, "MSSql2012"); } }
下面是执行前后的效果:
用拼接Sql语句的方式封装非常容易理解。作为底层的东西,重用性是非常高的。所以这一块也就作为第一版了。
如果有更好的方式,请联系我。
Demo下载地址:http://download.csdn.net/detail/zc474235918/8207857
原文地址:http://blog.csdn.net/zc474235918/article/details/41597813