前言:  

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

正文:

  在开发项目的时,常常会要维护或变更一些老项目,涉及到简单的几张表的操作,大部分都是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=][/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");
}

纯属初期学习项目,没什么技术。

如果做的更好点可以用T4之类的模板技术。

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

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

    打造一个很简单的文档转换器 - 使用组件 Spire.Office [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6024827.html 序 之前,& ...

  2. java(itext) 一个很简单的PDF表格生成工具

    先上个效果图 因为做的项目涉及到数据预测,其中有大量打印业务来支撑实体店的运营,因为注重的是数据,要求简洁,清晰,所以写了个很简单也很实用的工具类. 如果需要编写样式或者插入背景,都可以查阅itex官 ...

  3. 一个很简单的jQuery插件实例教程(菜鸟级)

    很多公司的前端设计开发人员都是女孩子,而这些女孩子很多JavaScript技能都不是很好.而前端开发过程中,JavaScript技能又是必不可少的.所以,如果前端小MM正在为某个JavaScript效 ...

  4. PJzhang:crunch,一个很好的字典生成工具

    猫宁!!! 之前收集子域名的时候使用过子域名挖掘机这个windows软件,查看了它所使用的字典,基本上是小写字母数字1-4位的一个合集.   36+36*36+36*36*36+36*36*36*36 ...

  5. 一个很简单的php留言板。。。。搭建在sae上的。。。

    我在sae上搭建了一个个人简历的页面: 有兴趣的可以访问  http://671coder.sinaapp.com/ 在做下面一个简单的留言板的时候,卡了我很久,虽然完全没用过php..但是还是最后勉 ...

  6. 『NYIST』第八届河南省ACM竞赛训练赛[正式赛一]-CodeForces 236A,虽然很水,但有一个很简单的函数用起来方便

    A. Boy or Girl time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  7. 一个很简单的SpringCloud项目,集成Feign、Hystrix

    Feign的功能:这是个消费者,根据服务注册在Eureka的ID去找到该服务,并调用接口Hystrix的功能:熔断器,假如A服务需要调用B服务的/cities接口获取数据,那就在A服务的control ...

  8. createjs easal.js制作了一个很简单的链路图

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

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

    直接从文件夹运行html没问题的,,,然后百度半天,,乱七八糟的答案, 1.谷歌商店安装 JB插件--插件地址 https://chrome.google.com/webstore/detail/je ...

随机推荐

  1. UltraEdit软件破解方法

    一.说明 UltraEdit破解软件虽然带有“安装说明.txt”,但是我并没有弄懂--安装说明太模糊.经过一番摸索,找到了破解方法,现记录于此. 二.操作步骤 1.断开网络 2.安装软件 3.打开软件 ...

  2. 趣味C程序100.1 .1 绘制余弦曲线

    说明:1.本问题来源于<C语言经典.趣味.实用程序设计编程百例精解>,所有程序为本人自己编写.与原程序不同之处作有标记. 2.本系列所有程序均使用codeblocks编译,操作系统为Win ...

  3. nutch 二次开发

    /*深度控制*/ 深度控制:nutch是广域网的深度遍历,我们需要的是垂直采集(即只采集某一个栏目),举例,索引页总计20页,如果只有下一页,则深度为20,如果是1 2 3 4 5……20则深度为2即 ...

  4. BZOJ 3083 遥远的国度 树链剖分

    3083: 遥远的国度 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 797  Solved: 181[Submit][Status] Descrip ...

  5. bzoj 1045: [HAOI2008] 糖果传递 贪心

    1045: [HAOI2008] 糖果传递 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1812  Solved: 846[Submit][Stat ...

  6. 直接将视频文件原码流转换成YUV,输出到屏幕显示

    #include "stdafx.h" #define inline _inline#ifndef INT64_C#define INT64_C(c) (c ## LL)#defi ...

  7. Eclipse配置Git

    一.Eclipse上安装GIT插件EGit Eclipse的版本eclipse-java-helios-SR2-win32.zip(在Eclipse3.3版本找不到对应的 EGit插件,无法安装) E ...

  8. 换成gnome3桌面后国际版qq不能输入中文问题

    困扰了好久的问题今天终于解决了,网上也没有完整的教程,所以在这里整理下 前几天给自己的ubuntu装上了gnome桌面,一切都挺正常的,桌面很炫,用着也很舒服,不过之前的qq却没办法输入中文了,下面我 ...

  9. JavaScript 兼容 Array.prototype.slice.call

    IE9之前的IE版本的HTMLCollection以及NodeList不是Object的子类. 在通过Array.prototype.slice.call进行数组化的时候,IE9之前的IE版本会抛出异 ...

  10. 《University Calculus》-chape10-向量与空间几何学-向量夹角

    点积.向量夹角: 无论对于空间向量还是平面向量,我们所熟知的是:给出任意两个向量,我们都能够根据公式计算它们的夹角,但是这个夹角必须是将两个向量的起点重合后所夹成的小于等于π的角,可是,这是为什么呢? ...