Vs2005之简单日志工具的制作--5.数据结构检查

  前面说过,所有的管理信息都以DataSet的形式存入了ml3文件中,那么,我们需要一个类,它能够读取这个ml3文件,并且将读取的结果返回给我们:
  

class TSysData
    ...{
        private DataSet FDataSet;

        public DataSet DataSet
        ...{
            get
            ...{
                return FDataSet;
            }
        }

        public TSysData(string fileName)
        ...{
            FDataSet = new DataSet();
            try
            ...{
                FDataSet.ReadXml(fileName);
            }
            catch (Exception)
            ...{
                TSysDataCheck.CheckData(FDataSet, fileName);
            }
        }
    }

 

  注意最后一句TSysDataCheck.CheckData(FDataSet, fileName),这是让类TSysDataCheck来检查数据结构是否正确,这个后面再说。
  其实这里有一个bug,如果这个文件是通过其他数据集.WriteXml来得到的,将不会引发异常。但由于是自己使用,我相信自己会避免这种错误,因此没有做其他的处理。(其实修改一下是很简单的事情。)
  在TSysDataCheck中检查数据结构,首先要检查某个表是否存在:
  

private static void CheckTable(DataSet dataSet, string tableName)
        ...{
            bool have;
            DataTable testdataTable = null;
            try
            ...{
                testdataTable = dataSet.Tables[tableName];
                have = true;
            }
            catch (Exception)
            ...{
                have = false;
            }

            if ((!have) || (testdataTable == null))
            ...{
                DataTable dataTable = new DataTable(tableName);
                dataSet.Tables.Add(dataTable);
            }
        }

 

  其次,检查某个表里是某个字段是否存在:
  

private static void CheckField(DataSet dataSet, string tableName, string fieldName, int fieldType, int fieldLength)
        ...{
            bool have;
            DataColumn testdataColumn = null;
            try
            ...{
                testdataColumn = dataSet.Tables[tableName].Columns[fieldName];
                have = true;
            }
            catch (Exception)
            ...{
                have = false;
            }

            if ((!have) || (testdataColumn == null))
            ...{
                DataColumn dataColumn = new DataColumn(fieldName);
                switch (fieldType)
                ...{
                    case 1:
                        dataColumn.DataType = typeof(string);
                        dataColumn.MaxLength = fieldLength;
                        break;
                    case 2:
                        dataColumn.DataType = typeof(int);
                        break;
                    case 3:
                        dataColumn.DataType = typeof(DateTime);
                        break;
                    default:
                        dataColumn.DataType = typeof(string);
                        dataColumn.MaxLength = 50;
                        break;
                }
                dataSet.Tables[tableName].Columns.Add(dataColumn);
            }

 

  其中,fieldType是一个int型常量,代表了常用的数据类型(fieldType 1,string  2 int 3 DateTime)。fieldLength只有当fieldType=1,为string时才有作用。

  最后,可能需要为表指定主键:
  

private static void SetPreKey(DataSet dataSet, string tableName, string fieldName)
        ...{
            DataColumn[] cols = new DataColumn[1];
            cols[0] = dataSet.Tables[tableName].Columns[fieldName];
            dataSet.Tables[tableName].PrimaryKey = cols;
        }

 

  有了这三个方法,就可以检查执行数据结构的操作:
  

public static void CheckData(DataSet dataSet, string fileName)
        ...{
            if (System.IO.Path.GetExtension(fileName).ToUpper() != ".ML3")
            ...{
                MessageBox.Show("文件后缀名不为".ml3"");
                Application.Exit();
                System.Threading.Thread.CurrentThread.Abort();
                return;
            }

            MStyle#region MStyle
            CheckTable(dataSet, "MStyle");
            CheckField(dataSet, "MStyle", "sid", 1, 50);
            CheckField(dataSet, "MStyle", "sname", 1, 255);
            CheckField(dataSet, "MStyle", "pid", 1, 50);
            CheckField(dataSet, "MStyle", "sort", 2, 0);

            SetPreKey(dataSet, "MStyle", "sid");
            #endregion

            MLogList#region MLogList
            CheckTable(dataSet, "MLogList");
            CheckField(dataSet, "MLogList", "sid", 1, 50);
            CheckField(dataSet, "MLogList", "lid", 1, 50);
            CheckField(dataSet, "MLogList", "lname", 1, 255);
            CheckField(dataSet, "MLogList", "lCreateTime", 3, 0);
            CheckField(dataSet, "MLogList", "lLastChangeTime", 3, 0);

            SetPreKey(dataSet, "MLogList", "lid");
            #endregion

            MFileList#region MFileList
            CheckTable(dataSet, "MFileList");
            CheckField(dataSet, "MFileList", "lid", 1, 50);
            CheckField(dataSet, "MFileList", "fid", 1, 50);
            CheckField(dataSet, "MFileList", "fname", 1, 255);
            CheckField(dataSet, "MFileList", "fCreateTime", 3, 0);

            SetPreKey(dataSet, "MFileList", "fid");
            #endregion
        }
  

 

        各个字段的含义很简单,从字段名就可以看出来。
  检查完数据结构,可能还需要一些初始化数据与其他操作:

  1。我希望每个ml3文件都有一个id,与其他的ml3文件区分开来(这里使用了Guid.而这个id在后面也会用到。):
  

ML3FileID#region ML3FileID
            CheckTable(dataSet, "ML3FileID");
            CheckField(dataSet, "ML3FileID", "ML3ID", 1, 50);

            SetPreKey(dataSet, "ML3FileID", "ML3ID");
            #endregion

            ML3FileID data#region ML3FileID data
            if (dataSet.Tables["ML3FileID"].Rows.Count == 0)
            ...{
                DataRow row = dataSet.Tables["ML3FileID"].NewRow();
                row.BeginEdit();
                row["ML3ID"] = Guid.NewGuid().ToString().ToUpper();
                row.EndEdit();
                dataSet.Tables["ML3FileID"].Rows.Add(row);
            }
            #endregion

 

  2。在日志类型中,要有一个默认的类型,即回收站:
  

MStyle data#region MStyle data
            DataRow[] rows = dataSet.Tables["MStyle"].Select("sid = 1");
            bool have = (rows != null);
            if (have)
                have = (rows.Length == 1);
            if (!have)
            ...{
                DataRow row = dataSet.Tables["MStyle"].NewRow();
                row.BeginEdit();
                row["sid"] = "1";
                row["pid"] = "-1";
                row["sname"] = "回收站";
                row["sort"] = 99999;
                row.EndEdit();
                dataSet.Tables["MStyle"].Rows.Add(row);
            }
            #endregion

 

  这里指定了回收站的id="1",sort=9999。

  3。最后,需要将这些数据写回到ml3文件中:
  

dataSet.WriteXml(fileName, XmlWriteMode.WriteSchema);
  
  这样,数据结构检查也便完成了。
  下一篇,启动。
 
  ie.2008-04-08

时间: 2024-10-02 04:24:18

Vs2005之简单日志工具的制作--5.数据结构检查的相关文章

Vs2005之简单日志工具的制作--6.启动

下面说说系统的启动. 说到启动,就又想起了.net另一个让人郁闷的地方:winform程序相比其他开发工具(比如delphi)产生的程序,启动速度太慢了.启动一个winform程序,可能过了好久系统才真正进入.在这个过程中,如果能将启动条理化,并反应出来,让人看到什么时候程序在做什么,也是一个不错的办法. 打开MyLog3的解决方案,在MyLog3项目中可以找到一个窗口TfrmConver,它看起来像这个样子:         这个界面希望它能够做两件事情: 一是启动的时候,显示一些启动信息:二

Vs2005之简单日志工具的制作--4.文件类型注册

文件类型注册的可重用的类在项目FileTypeReg里,而实际使用的类TSysRegeist在MyLog3(即主程序)项目中. 所谓文件类型注册,实际上是向注册表的HKEY_CLASSES_ROOT项中写入一些相关的数据:首先,在HKEY_CLASSES_ROOT项下建立一个子项,名称即为后缀名,如".ml3".它有一个默认值,比如"ML3_FileType".意思是指,".ml3"文件类型的相关数据存储在HKEY_CLASSES_ROOT下的&

Vs2005之简单日志工具的制作--3.系统配置

系统配置可以分为好多种,ini的,注册表或者其他的.在TSysConfig中,引用了两个类:TSysIni和TSysReg.前者提供系统的ini配置服务,后者提供系统的注册表配置服务. private TSysIni FSysIni;private TSysReg FSysReg;  下面行说Ini服务TSysIni. 这个类需要完成的功能比较简单,它要提供一些系统配置的存取操作.一般来说,写入ini是这样进行的:WriteString(string big,string small,strin

vs2005自带部署工具制作的安装文件,安装后,用桌面或开始菜单快捷方式起动,总是运行windows installer

问题描述 vs2005自带部署工具制作的安装文件,安装后,用桌面或开始菜单快捷方式起动,总是运行windowsinstaller,如果移动了原始安装文件,就无法正常起动,好像安装后的程序的运行离不开原始安装文件.但如果进入安装后的文件夹,直接运行程序,则没有这个问题.高手帮忙! 解决方案 解决方案二:可能是你的快捷方式位置指定的不正确,你可以在安装项目里找到EXE程序用IDE自动给它生成快捷方式,然后复制到你想放置的安装目录.解决方案三:不会吧,难道没有高手知道???解决方案四:看你的快捷方式指

简化SLF4J和通用日志工具的区别

这就是为什么现在每个人都用SLF4J的原因:) 下面是如何追踪和更新你的SLF4J日志: 首先,查询slf4j绑定的类路径. 然后,确保只有一个这样的绑定. 最后,当你找到正在被使用的绑定:查阅它的配置特性. 另一方面-下面是如何追踪通用日志: 首先,你得找到日志绑定是如何实现. 检查commons-logging.properties 里的org.apache.commons.logging.log的属性是否设置,或通过应用里的Commons Logging API设置. 如果没有设置,检查路

Photoshop入门实例教程:简单拼贴图的制作方法

本教程介绍简单拼贴图的制作方法.大致过程:处理之前需要用网格及辅助线把素材均分成一些小方块,然后分别用选区把这些小方块复制到新的图层,适当给小方块描边并添加投影.最后把小方法变形处理,再改变背景颜色即可.原图 最终效果 [1] [2] [3]  下一页

阿里云有什么监控CPU和内存的日志工具

监控CPU和内存的日志工具 Linux 工具: 下载地址:get_cpu_mem_info_sh.rar 使用方法: 下载该文件解压后,上传到 /tmp 目录中. 运行 cd 切换到/tmp目录. 执行: nohup bash get_cpu_mem_info.sh & 该工具会在 /tmp 目录下生成一个日志文件,记录实时监控系统的 CPU.内存的使用情况,等到系统异常时可以用于分析日志. Windows 工具: 下载地址:get_cpu_mem_info_bat.rar 使用方法: 下载该文

PS矢量工具快速制作促销海报字体教程

  这篇教程教脚本之家的PS文字效果学习者们使用PS矢量工具快速制作促销海报字体方法,教程制作出来的文字效果挺漂亮的,制作的难度一般,主要是和大家浅谈利用PS矢量工具打造字体的技巧,推荐一下和脚本之家的朋友们一起分享学习了! 教程结束,以上就是PS矢量工具快速制作促销海报字体教程,从这篇教程里,我们可以学习PS矢量工具的运用,希望大家能熟练运用! 分类: PS文字教程

php实现的简单日志写入函数

 本文实例讲述了php实现的简单日志写入函数.分享给大家供大家参考.具体实现方法如下: 1 2 3 4 5 6 7 8 9 function log( $logthis ){ file_put_contents('logfile.log', date("Y-m-d H:i:s"). " " . $logthis. "rn", FILE_APPEND | LOCK_EX); } // use rn for new line on windows,