一个很简单的SqlServer生成常用C#语句工具的诞生

前言:  

  这个文章只要是记录一下,这个工具的诞生过程、作用、其中的技术实在是太简单可以说没有什么技术~主要是锻炼一下写文章的能力!

正文:

  在开发项目的时,常常会要维护或变更一些老项目,涉及到简单的几张表的操作,大部分都是ADO操作数据库的代码!写写改改、添加、删除什么的。用那些代码生成器什么的,都需要配置不少东西,况且我真正要生成的只要一小段代码,自食其力,就自己弄一个这样的工具来帮助自己吧。

  既然是对SqlServer进行操作的工具,肯定第一步要实现对SqlServer的链接了也就是登陆SqlServer。
登陆功能:
  1,使用SqlServer账号密码进行登陆,链接上数据库
  2,登陆成功后可以记录下本次登陆的记录以便下次可以快速使用登陆记录进行登陆
界面实现:

    

  

  如果IP是第一次登陆,登陆的时候我将登陆数据存储到了xml文件里,再次登陆的时候会将所有以存储的记录罗列出来供用户选择。
  这里涉及的就是一些XML的读取和写入,贴一下我写的XML操作方法。

/// <summary>
        /// 集合写出Xml
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="ls"></param>
        public static void DataToXml<T>(List<T> ls,string path)
        {
            XmlDocument xmldoc = new XmlDocument();
            //加入XML的声明段落,<?xml version="1.0" encoding="gb2312"?>
            XmlDeclaration xmldecl;
            xmldecl = xmldoc.CreateXmlDeclaration("1.0", "gb2312", null);
            xmldoc.AppendChild(xmldecl);
            //加入一个根元素
            var xmlelem = xmldoc.CreateElement("", "Nodes", "");
            xmldoc.AppendChild(xmlelem);
            //加入另外一个元素
            foreach (T s in ls)
            {
                XmlNode root = xmldoc.SelectSingleNode("Nodes");
                XmlElement xe1 = xmldoc.CreateElement("Node");
                foreach (PropertyInfo pi in typeof(T).GetProperties())
                {
                    object value = null;
                    if (s != null)
                    {
                        value = pi.GetValue(s, null);
                        XmlElement xesub1 = xmldoc.CreateElement(pi.Name);
                        xesub1.InnerText = value == null ? "" : value.ToString();
                        xe1.AppendChild(xesub1);
                        root.AppendChild(xe1);
                    }
                }
            }
            //保存创建好的XML文档

            xmldoc.Save(path);
        }

/// <summary>
        /// Xml生成实体集合
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="xmlpath"></param>
        /// <returns></returns>
        public static List<T> getxmltomodel<T>(string xmlpath)
        {
            try
            {
                #region 遍历xml
                XmlDocument _xm = new XmlDocument();
                _xm.Load(xmlpath);

                XmlNodeList xmList = _xm.SelectNodes("/pma_xml_export/database/table");
                List<T> _ls = new List<T>();
                foreach (XmlNode pageNode in xmList)
                {

                    T _m = Activator.CreateInstance<T>();
                    foreach (PropertyInfo pi in typeof(T).GetProperties())
                    {

                        foreach (XmlNode nd in pageNode.ChildNodes)
                        {
                            XmlElement element = (XmlElement)nd;
                            if (element.GetAttribute("name") == pi.Name)
                            {
                                object value = null;
                                value = element.InnerText;
                                Type type = pi.GetType();
                                pi.SetValue(_m, Convert.ChangeType(value, pi.PropertyType), null);
                            }
                        }

                    }
                    _ls.Add((T)_m);

                }
                #endregion

                return _ls;
            }
            catch
            {
                return null;
            }

        }

  

  既然登陆成功了,我们就可以将数据库下的所有库和表查询出来并展示给我们进行选择了。
数据库/表的查询展示:

  

查询所有数据库方法:    

select * from [sysdatabases] order by [name]

查询所有表方法:

select [id], [name] from [sysobjects] where [type] = ‘u‘ order by [name]

  得到数据库的数据后就可以绑定到Tree上了,并绑定点击事件,当点击的时候再展示该库下所有的表,这样就可以选择要操作的表了。

表属性查询方法:

        /// <summary>
        /// 获取表信息
        /// </summary>
        /// <param name="tablename"></param>
        /// <returns></returns>
        public DataTable GetTableInfo(string tablename)
        { try
            {
                string sql = string.Format(@"
SELECT
    表名       = d.name,--case when a.colorder=1 then d.name else ‘‘ end,
    表说明     = case when a.colorder=1 then isnull(f.value,‘‘) else ‘‘ end,
    字段序号   = a.colorder,
    fieldname     = a.name,
    标识       = case when COLUMNPROPERTY( a.id,a.name,‘IsIdentity‘)=1 then ‘√‘else ‘‘ end,
    主键       = case when exists(SELECT 1 FROM sysobjects where xtype=‘PK‘ and parent_obj=a.id and name in (
                     SELECT name FROM sysindexes WHERE indid in(
                        SELECT indid FROM sysindexkeys WHERE id = a.id AND colid=a.colid))) then ‘√‘ else ‘‘ end,
    sqltype       = b.name,
    占用字节数 = a.length,
    长度       = COLUMNPROPERTY(a.id,a.name,‘PRECISION‘),
    小数位数   = isnull(COLUMNPROPERTY(a.id,a.name,‘Scale‘),0),
    允许空     = case when a.isnullable=1 then ‘√‘else ‘‘ end,
    默认值     = isnull(e.text,‘‘),
    fieldexplain   = isnull(g.[value],‘‘)
FROM
    syscolumns a
left join
    systypes b
on
    a.xusertype=b.xusertype
inner join
    sysobjects d
on
    a.id=d.id  and d.xtype=‘U‘ and  d.name<>‘dtproperties‘
left join
    syscomments e
on
    a.cdefault=e.id
left join 

    sys.extended_properties g
on
    a.id=g.major_id and a.colid=g.minor_id
left join
    sys.extended_properties f
on
    d.id=f.major_id and f.minor_id=0
where
    d.name=‘{0}‘    --如果只查询指定表,加上此条件
order by
    a.id,a.colorder", tablename);
                return Service.Data.SqlHelper.DataTable(sql);
            }
            catch (Exception ex)
            {
                throw (ex);
            }
        }
    }

代码模板:

  模板也是存储在了XML文件里,可以配置多个模板。
生成代码:
  这里用的方法很基本了,简单的循环所有字段信息根据模板预留的占位符进行替换生成,与一些常用的代码生成器的做没法比了,不过本着方便自己的想法,这样的工具还是挺好用的,有空大家也可以学习学习他们的做法也是对自己的知识积累。

//我在替换中使用的一些占位符

[tablename] 可替换表的名称
/**************************/
[list][list]为多字段循环列表
[list=1][/list]多字段循环列表,会自动去掉最后元素的最后一个符号。
/**************************/
循环体内容中可替换内容有:
[fieldname] 字段名称
[sqltype] 字段类型
[fieldexplain] 字段说明

/**************************/
[replace=xxx][/replace]筛选替换循环体内的变量。
xxx可填:sqltype、fieldname、fieldexplain

文档生成:

  后来因为要常看一些表的结构和梳理数据文档所以就弄了一个富文本编辑插件,可以把表的属性生成一个table表格,方便查看,也可以复制到word里面。

  

知识点:
  1,窗体之间如何互相触发事件刷新数据
    这个工具就两个界面,当主界面main加载的时候会判断是否已登陆了,如果没有登陆就会加载登陆窗体login。在login中登陆成功后会刷新main中的tree。
    实现代码:

    在login中定义事件并在登陆成功后触发事件。

        /// <summary>
        /// 定义登陆成供事件委托
        /// </summary>
        public delegate void LoginSuccess();
        /// <summary>
        /// 定义登陆成功事件
        /// </summary>
        public  event LoginSuccess  LoginSuccessEvent;

        /// <summary>
        /// 触发登陆成功事件
        /// </summary>
        protected virtual void OnLoginSuccessEvent()
        {
            var handler = LoginSuccessEvent;
            if (handler != null) handler();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            this.OnLoginSuccessEvent();
        }

  main在调用login时,绑定事件回调函数。

 private void main_Load(object sender, EventArgs e)
        {
            login lg=new login();
            lg.LoginSuccessEvent += LoginSuccess;
            lg.Show();
        }

        void LoginSuccess()
        {
            textBox1.Text = DateTime.Now.ToString("u");
        }

好了,暂时就总结这么多东西。

时间: 2024-08-04 09:13:19

一个很简单的SqlServer生成常用C#语句工具的诞生的相关文章

[.NET] 打造一个很简单的文档转换器 - 使用组件 Spire.Office

打造一个很简单的文档转换器 - 使用组件 Spire.Office 目录 Spire.Office 介绍 库引用 界面预览 代码片段 Spire.Office 介绍 关于 Spire.Office,它是一个专门为开发人员创建,读取,写入设计的库,转换和从打印 word 文档文件.作为一个独立的 .NET组件,它不需要在机器上安装微软的 Word 等办公软件.然而,它可以将微软的“文档创建功能”集成到任何开发人员的网络应用程序中.它是一个可靠的 MS Word 的API,可以执行许多Word文档处

Mybatis_reveiw之Mybatis官方的一个很简单的Demo

上学的时候,一个老师讲了个故事,这个故事的大意是,我们有很多种方式去削苹果,第一种方式,使用指甲刀,第二种方式,使用机床,第三种方式,使用手摇的那种削平果小工具.我们当然都能够完成这个简单的需求,但是使用指甲刀削出来的苹果一定比较坑坑洼洼,不够美观,而且可能会让人感觉到有点没啥食欲.使用机床呢?可能会造成大量的浪费,原本一个美观大方的苹果变成了只能啃几口的正方形.第三个,因为是专门为了削苹果皮而设计的,理论上是最合适用来解决削苹果这个问题的解决方案. 一个好的架构,其实要做的事情是非常简单的,除

Gradle之旅-遇到的一个很简单但是用了很久才解决的问题

这个问题非常简单,但是对于我这个刚接触Gradle的人却是很难发现的一个错误,这个错误就是在使用gradle build的时候提示can not find tools.jar,我手动的添加了依赖,反复修改都没能解决这个错误,后来我无意中点到window->references->java->install jres发现这里定义的jre是jdk下的jre,不是jdk,然后我将定义的这个jre修改了为jdk的路径,然后重新运行gradle build,然后问题就解决了,虽然是个很小的问题,但

一个很简单的脑筋急转弯问题

你只能增加或是修改其中一个字符,使其输出20个减号.请给出3种方案int n = 20 ;for(int i=0 ; i<n ; i--){printf("-"); } 自己想了下,然后总结了大概一下5中,做下记录. ----------------i-- 改为n---i<ni+n|x| < ni++

一个很简单小数正负数行转列问题

出处:kelvin19840813 的博客 http://www.cnblogs.com/kelvin19840813/ 您的支持是对博主最大的鼓励,感谢您的认真阅读.本文版权归作者所有,欢迎转载,但请保留该声明. 发现decode行转列之后 , 小数, 负数都会自动抹去 , 需要to_char加工一下 , 并没有找到相关文献解释为什么抹去 SQL> create table test0724 (name varchar(20),month number(2),num NUMBER(6,2));

一个很简单的查看电一个很简单的查看电脑所支持的最大内存的方法

在开始---运行处输入cmd(或者按住winkdy+R键输入CMD),打开命令窗口,输入wmic memphysical get maxcapacity然后回车,得到的数字是以千字节为单位的,我们再把得到的数字除以1024再除以1024,也就是大概100万才行,比如得到的是16777216 K字节,那么除以100万左右,大概就支持16G的内存,这个是指物理内存,那么我们想扩展内存的话,就可以放心的去选购而不用害怕系统不支持而浪费资源了.

求助 一个很简单的ACM题 java代码 自己电脑上测都是正确的 但提交总是wrong answer 先谢谢了

题意大致是,给出直角三角形a,b,c(c为斜边)中两个的值(都是正数),求值为-1的那个边.比如3 4 -1,就是求c的长度,输入0 0 0表结束,输出格式如下加粗部分,我自己测自己的运行结果都是正确的,不知为什么总是wa,求大神指点! Mathematics can be so easy when you have a computer. Consider the following example. You probably know that in a right-angled trian

webStrom访问只一个很简单的html文件的时候显示local host无法访问。。

直接从文件夹运行html没问题的,,,然后百度半天,,乱七八糟的答案, 1.谷歌商店安装 JB插件--插件地址 https://chrome.google.com/webstore/detail/jetbrains-ide-support/hmhgeddbohgjknpmjagkdomcpobmllji WebStorm live edit功能与浏览器实现同步实现步骤 2.更改设置 解决webstorm本地IP访问页面出错的问题 ctrl+alt+s调出设置:改一下端口,啥的 3. html文件

一个很简单的MD5计算,python hashlib

1 import hashlib 2 import time 3 4 size = 2048 5 md5 = hashlib.md5() 6 start = time.time() 7 with open('ubuntu-18.04-desktop-amd64.iso', 'rb') as f: 8 a = f.read(2048) 9 md5.update(a) 10 while len(a) > 0: 11 # print(a) 12 a = f.read(2048) 13 md5.upda