一个很简单的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=][/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#语句工具的诞生的更多相关文章
- [.NET] 打造一个很简单的文档转换器 - 使用组件 Spire.Office
打造一个很简单的文档转换器 - 使用组件 Spire.Office [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6024827.html 序 之前,& ...
- java(itext) 一个很简单的PDF表格生成工具
先上个效果图 因为做的项目涉及到数据预测,其中有大量打印业务来支撑实体店的运营,因为注重的是数据,要求简洁,清晰,所以写了个很简单也很实用的工具类. 如果需要编写样式或者插入背景,都可以查阅itex官 ...
- 一个很简单的jQuery插件实例教程(菜鸟级)
很多公司的前端设计开发人员都是女孩子,而这些女孩子很多JavaScript技能都不是很好.而前端开发过程中,JavaScript技能又是必不可少的.所以,如果前端小MM正在为某个JavaScript效 ...
- PJzhang:crunch,一个很好的字典生成工具
猫宁!!! 之前收集子域名的时候使用过子域名挖掘机这个windows软件,查看了它所使用的字典,基本上是小写字母数字1-4位的一个合集. 36+36*36+36*36*36+36*36*36*36 ...
- 一个很简单的php留言板。。。。搭建在sae上的。。。
我在sae上搭建了一个个人简历的页面: 有兴趣的可以访问 http://671coder.sinaapp.com/ 在做下面一个简单的留言板的时候,卡了我很久,虽然完全没用过php..但是还是最后勉 ...
- 『NYIST』第八届河南省ACM竞赛训练赛[正式赛一]-CodeForces 236A,虽然很水,但有一个很简单的函数用起来方便
A. Boy or Girl time limit per test 1 second memory limit per test 256 megabytes input standard input ...
- 一个很简单的SpringCloud项目,集成Feign、Hystrix
Feign的功能:这是个消费者,根据服务注册在Eureka的ID去找到该服务,并调用接口Hystrix的功能:熔断器,假如A服务需要调用B服务的/cities接口获取数据,那就在A服务的control ...
- createjs easal.js制作了一个很简单的链路图
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- webStrom访问只一个很简单的html文件的时候显示local host无法访问。。
直接从文件夹运行html没问题的,,,然后百度半天,,乱七八糟的答案, 1.谷歌商店安装 JB插件--插件地址 https://chrome.google.com/webstore/detail/je ...
随机推荐
- ByteArrayInputStream 和 ByteArrayOutputStream
package java.io; /** * A <code>ByteArrayInputStream</code> contains * an internal buffer ...
- C#与C++的几个不同之处知识点
1.索引器 索引器是C#自创的内容,这是C++当中没有的内容,所以做一次笔记. 索引器是用于书写一个可以通过使用[]想数组一样直接访问集合元素的方法.我们只需要指定待访问实例或元素的索引.索引器的语法 ...
- bootstrap datepicker时间插件显示位置不对
bppystrap-datetimepicker.min.js中,修改如下:将原来的 if(!b(this.element)){l=l+document.body.scrollTop}改 ...
- 2016 年开发者应该掌握的十个 Postgres 技巧
[编者按]作为一款开源的对象-关系数据库,Postgres 一直得到许多开发者喜爱.近日,Postgres 正式发布了9.5版本,该版本进行了大量的修复和功能改进.而本文将分享10个 Postgres ...
- 编写自己的C语言头文件
一些初学C语言的人,不知道头文件(*.h文件)原来还可以自己写的.只知道调用系统库 函数时,要使用#include语句将某些头文件包含进去.其实,头文件跟.C文件一样,是可以自己写的.头文件是一种文本 ...
- android开发之使用shape来画线,有一些注意点
注意:Android3.0以上系统开始支持硬件加速特性hardwareAccelerated,默认是启用的.当你的某个activity用到了“虚线”效果的时候,必须要设置AndroidManifest ...
- 坑爹的Android Ble 问题记录日志
开发Ble(公司项目,防丢器)已经有一段时间,由于是第一次接触Ble而网上资料又不多,且android平台自身的差异性,遇到了很多问题.为了将来方便查阅,在此做下记录.1.中兴手机,蓝牙手动断开后,无 ...
- C++ Prime:switch内部的变量定义
如果需要为某个case分支定义并初始化一个变量,我们应该把变量定义在块内,从而确保后面的所有case标签都在变量的作用域之外. case true: { // 正确,声明语句位于语句块内部 strin ...
- Android MonkeyRunner自动拨打电话
from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice import time device = MonkeyRunner.wa ...
- 重读JAVA编程思想
当年如猪八戒吃人生果般的读了java编程思想,只是知道这是本好书,但是具体细节,真是不知所云,很多都是工作中用到哪些,然后就翻<think in java >和<core java& ...