好吧,我承认我的确很是无聊的人,无聊到不知道该干嘛的人。那就编码吧,下面就无聊的写一下对一个数据库的升级类
呃,废话不多说,想法:每次对数据库字段进行修改的时候是不是改完,然后就没事了,过了一段时期后,发现以前改过什么都忘了,恩恩,这可是一件大问题来的,就好像这次的那个谁问的:你这几天对数据库改了什么的?“这,这,情何以堪呐,我怎么记得了这么多?!”
做完后成这个样子,某年某月某日第几个操作了数据库
上设计,上代码!
建一个数据库
一张表(版本表)
呃,建一张表用来记录最后一次升级是什么时候的,恩恩,表结构:
字段名 | 大小 | 可空 |
ID | Int | 主键,不为空 |
Version | Varchar(20) | 版本号 |
建表语句:
CREATE table TbVersion( ID int not null Primary key identity(1,1), Version varchar(10) not null )--测试数据INSERT TbVersion VALUES ('2012041701')
相信这个大家都是懂的啦(又在讲废话了~~)
建一个项目像下面这种的,记得引用哦,亲~(就好像下面那样)
还要记得加上你的连接字符串
对了,还要在UpdateDatabase层中添加上一个SQLhelper封装类,用于对一些SQL语句的执行下载地址在下面:
最后的样子就好像下面的那张图片一样了
上面的一大堆前提的东西搞完了,可以转入主题了,转入主题前,麻烦先写一两句SQL语句试一下SQLHeler是不是能用了,测试而已
好了,现在一个网页中拖入一个Button 以及一个GridView,用你喜欢的布局,我对CSS+ DIV是生到不能再生了,所以我是乱放上去了
对了,还要在后台代码页面引用上
这两个
我的想法是,在数据库升级的那一层按照一定的规则去命名,然后同过对比数据库中的数据库版本数据,如果数据库中的版本数据比数据库升级层中的方法后的话,执行那些所谓的升级脚本,然后更新用最新的那个升级日期修改数据库中的版本号;如果版本号比升级脚本前面的话,不执行升级脚本,呃……….(.貌似这样是有问题的)
呐呐,废话不多说,直接上代码:
protected void Button1_Click(object sender, EventArgs e) { string MaxVersion = ""; //定义数据集,用于显示升级脚本执行情况 DataTable dt = new DataTable(); dt.Columns.Add("message");//什么是Assembly(程序集)?//Assembly是一个包含来程序的名称,版本号,自我描述,文件关联关系和文件位置等信息的一个集合。在.net框架中通过Assembly类来支持,该类位于System.Reflection下,物理位置位于:mscorlib.dll。//Assembly能干什么?//我们可以通过Assembly的信息来获取程序的类,实例等编程需要用到的信息。 //读取文件,并且初始化Assembly对象 Assembly assemly = Assembly.LoadFrom(Server.MapPath("~/Bin/UpdateDatabase.dll")); //获取文件中包含的所有程序 Type[] theassem = assemly.GetTypes().OrderBy(th => th.Name).ToArray(); foreach (Type t in theassem) { //如果读取文件名为SQLhelper的话,跳过! if (t.Name.Contains("SqlHelper")) { continue; } //使用默认构造函数,实例化对象 Object obj = Activator.CreateInstance(t); //获取程序集中所有包含ExecuteSQL名称的方法 MethodInfo[] Mi = t.GetMethods().OrderBy(th => th.Name).Where(th => th.Name.Contains("ExecuteSQL")).ToArray(); //遍历Mi方法组 foreach (MethodInfo mifo in Mi) { //第二个参数调用MethodInfo实体的Invoke方法,并且执行 //其中obj为载上面实例化的当前类, //new object[] { true } 为调用当前类中所有的方法 UnionTable(dt, mifo.Invoke(obj, new object[] { true }) as List, mifo.Name.Replace("ExecuteSQL", "")); //取出最后执行的方法的时间,作为当前数据库的版本号 MaxVersion = mifo.Name.Replace("ExecuteSQL", ""); } } GridView1.DataSource = dt; GridView1.DataBind(); UpdateDataBaseVersion(MaxVersion, dt); } /// /// 更新数据库版本 /// /// 当前执行后的数据库版本号 /// 执行完数据库脚本后的信息 private void UpdateDataBaseVersion(string MaxVersion, DataTable dt) { bool flag = true; //遍历数据集,如果有没有执行成功的不更新数据版本号 foreach (DataRow dr in dt.Rows) { if (!dr[0].ToString().Contains("执行成功")) { flag = false; break; } } if (flag) { //更新数据库版本 string sql = @"Update TbVersion Set Version ='" + MaxVersion + "'"; sh.ExecuteNonQuery(sql, CommandType.Text); } } ////// 添加数据库脚本执行后信息,用于绑定页面Gridview控件 /// /// 数据集 /// 方法执行后信息 /// 方法名(取脚本更新时间,而不是脚本执行时间) public void UnionTable(DataTable dt, Listlist, string date) { foreach (string str in list) { DataRow dr = dt.NewRow(); dr[0] = date + str; dt.Rows.Add(dr); } }
页面的按钮事件以及一些方法,不要告诉我看不懂,其实你如果留言说看不懂的话,记得要告诉我哪里看不懂,因为我也是菜鸟,我也想和你一起进步的…….
在这里要很重要的是数据库升级那层需要注意的一些规范
新建类的命名:
:
就好像这样,很直观的知道现在这个类是在几月份创建的,事实上这个新建类的名称不是很重要的,只要不是SQLhelper这个名称就行了,另外如果有机会将框架写大了,可以考虑下将这个数据库升级层独自成一层的。
类中的需要的属性,方法,命名规则:
这几个是最重要的元素之一,多的不说了,看注释吧,这些都可以看看先得,说得多了各位看客也就烦了…
还要说明的一点的就是对升级脚本的方法执行,呃,这不该叫方法了,叫脚本执行模板了,一定要按这样的规则才能都执行到升级脚本的
还有需要注意的是每一个对数据的的操作,例如创建数据表,现在的思路是执行了数据库升级脚本后更新数据库版本如果没有执行成功,则不更新数据库版本,下次还是要执行相同的脚本,因此还是会报错,或者升级脚本没有执行成功!
对了,有样东西还是要提一下的
在SQLhelper封装类中要添加一个重载的方法
用于返回升级脚本执行成功后返回信息的
示例下载:
好了啦,相信不会有人像我这样无聊写这样的无聊教程,无所谓了啦,这个教程就叫《还有更无聊点的吗?》
今天是第一篇,以后陆续有来,各位看客,有什么意见就提吧~~