- 浏览: 138875 次
- 性别:
- 来自: 成都
文章分类
最新评论
-
老八牛:
利用迭代器让异步操作更加“人性化”-山寨版的AsyncEnumerator -
老八牛:
为什么看不到代码?
利用迭代器让异步操作更加“人性化”-山寨版的AsyncEnumerator -
xi4nyu:
如果启动Application中的settings 的debu ...
玩蛇记-使用Tornado构建高性能Web之二-autoreload -
huacnlee:
"且在python下工作多日才发现原来在.NET下的 ...
玩蛇记-使用tornado构建高性能Web应用之一 -
jasongreen:
异步数据库操作,在web上有什么作用吗?
玩蛇记-使用tornado构建高性能Web应用之一
看过《朝花夕拾:代码生成器的基础——获取数据源的架构信息》一文,感觉,方法正确但是点到即止,没有完全说透,所以来个补全版。经验之谈,欢迎拍砖
首先是获取的方法,没错,都是采用的Connection的GetSchema方法,但是这个方法对于不通的Connection来说,也就是底层连接的数据库有所不同的话,返回的DataTable其实是有区别的。有的是返回所有表和视图,有的是返回系统表+用户表+视图,注意,这个跟数据库有关,而不是XXXConnection,用OledbConnection连接Access和SqlServer返回的就是完全不同的。比如OledbConnection连接Access返回的DataTable里面第4列的值必须是“Table”的才是用户表,其余的都是系统表。如果用MysqlConnection连接Mysql的话第四列必须等于“BASE TABLE”的才是用户表。就算使用SqlClient去连接SqlServer2000和SqlServer2005也是有区别的。前者的第四列是“Base Table”而后者根本不需要判断,返回的都是用户表。
SqlServer2005:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> 1 using (SqlConnection conn = new SqlConnection(ConnStr))
2 {
3 if (conn.State == ConnectionState.Closed)
4 {
5 conn.Open();
6 }
7 DataTable sc = conn.GetSchema("Tables");
8 conn.Close();
9 foreach (DataRow row in sc.Rows)
10 {
11 Tables.Add(row[2].ToString());
12 }
13 }
14
SqlServer2000:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> 1 using (SqlConnection conn = new SqlConnection(ConnStr))
2 {
3 if (conn.State == ConnectionState.Closed)
4 {
5 conn.Open();
6 }
7 DataTable sc = conn.GetSchema("Tables");
8 conn.Close();
9 foreach (DataRow row in sc.Rows)
10 {
11 if (row[3].ToString().Equals("BASE TABLE"))
12 {
13 Tables.Add(row[2].ToString());
14 }
15 }
16 }
17
MySql:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> 1 using (MySqlConnection conn = new MySqlConnection(ConnStr))
2 {
3 if (conn.State == ConnectionState.Closed)
4 {
5 conn.Open();
6 }
7 DataTable sc = conn.GetSchema("Tables");
8 conn.Close();
9 foreach (DataRow row in sc.Rows)
10 {
11 if (row[3].ToString().Equals("BASE TABLE"))
12 {
13 Tables.Add(row[2].ToString());
14 }
15 }
16 }
17
Access:
Access
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> 1using (OleDbConnection conn = new OleDbConnection(ConnStr))
2{
3 if (conn.State == ConnectionState.Closed)
4 {
5 conn.Open();
6 }
7
8 DataTable sc = conn.GetSchema("Tables");
9 conn.Close();
10 foreach (DataRow row in sc.Rows)
11 {
12 if (row[3].ToString().Equals("TABLE"))
13 {
14 Tables.Add(row[2].ToString());
15 }
16 }
17}
18
19
获取到表名后就可以通过表名去获取表的列信息,但是这个时候并不是单纯的说通过DataReader去GetSchama。这样子说纯粹是让人走弯路。
using (SqlDataReader rd = cmd.ExecuteReader(CommandBehavior.KeyInfo))
{
Schema = rd.GetSchemaTable();
rd.Close();
}
注意需要CommandBehavior.KeyInfo这个参数,加了这个参数获得的DataReader才能够通过GetSchemaTable()获得列信息。
同样的,通过不通的DataReader和不通的数据库,所得到的DataTable的数据还是有很多的差别,而且差别足够大到影响我们开发了,我不是单单获取一个列名就够了。
我们这里假设我们要获取的关键数据有
列名
类型(Varchar之类)
数据类型(程序里的类型,比如String)
是否主键
是否自动增加的列
我这里定义了一个类,也算是一个数据结构来获取数据表里的这些数据
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> 1public class ColumnProperty
2{
3 /**//// <summary>
4 /// Column Name of DataTable
5 /// 列名
6 /// </summary>
7 public string ColumnName { get; set; }
8 /**//// <summary>
9 /// Data Column's DataType
10 /// 用数值表示的数据列类型(其实也就是枚举的值)
11 /// </summary>
12 public int TypeNumber { get; set; }
13 /**//// <summary>
14 /// Property's Datatype in program
15 /// 实体字段的类型(string或者int之类)
16 /// </summary>
17 public string DataType { get; set; }
18 /**//// <summary>
19 /// if is Primary Key
20 /// 是否是主键
21 /// </summary>
22 public bool IsKey { get; set; }
23 /**//// <summary>
24 /// if is auto upgrede
25 /// 是否是自增字段(表示不能插入数据)
26 /// </summary>
27 public bool IsAuto { get; set; }
28
29 /**//// <summary>
30 /// print schema result,this method used for test
31 /// </summary>
32 /// <returns>schema infomation</returns>
33}
34
35
这里注意第二个field,这个属性是数据库里的类型,也就是用来给Parameter对象使用的,也就是数据定义在数据库里的类型。在程序里一般使用SqlDbType这个枚举来标示,其实这里我们用int来表示也就是说这个int的值和枚举的值是一一对应的。我们得到这个数值之后只需要
(SqlDbType)System.Enum.Parse(typeof(SqlDbType), “数值”)就能够得到对应的Type了。
下面的代码是不同数据库读取关键信息的不通点,注意看读取的列序号的不同
SqlServer2005:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> 1foreach (DataRow row in Schema.Rows)
2 {
3 ppt = new ColumnProperty();
4 ppt.ColumnName = row[0].ToString();
5 ppt.TypeNumber = int.Parse(row[29].ToString());
6 ppt.DataType = row[12].ToString();
7 ppt.IsKey = bool.Parse(row[6].ToString().ToLower());
8 ppt.IsAuto = bool.Parse(row[17].ToString().ToLower());
9 Rs.Add(ppt);
10 }
SqlServer2000:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> 1foreach (DataRow row in Schema.Rows)
2 {
3 ppt = new ColumnProperty();
4 ppt.ColumnName = row[0].ToString();
5 ppt.TypeNumber = int.Parse(row[29].ToString());
6 ppt.DataType = row[12].ToString();
7 ppt.IsKey = bool.Parse(row[6].ToString().ToLower());
8 ppt.IsAuto = bool.Parse(row[17].ToString().ToLower());
9 Rs.Add(ppt);
10 }
11
12
MySql:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> 1foreach (DataRow row in Schema.Rows)
2 {
3 ppt = new ColumnProperty();
4 ppt.ColumnName =<s
发表评论
-
关于ORM和内存数据库的遐想
2007-01-23 13:21 534最近有消息说韩国电信 ... -
继续ORM-欧德巴赫猜想-Mapping
2007-01-23 14:34 631最近从项目组单离出来开始在公司实施过程化管理,整个QA Off ... -
剑走偏锋,小心走火入魔
2007-01-23 15:07 674这是很久前写好的文字,闲得无聊就发上来,几个月前的感想,上午一 ... -
手把手教你写ORM(三)
2007-01-24 11:50 575昨天处于晕死状态,少写了一个组件,还需要一个组件用来专门管理C ... -
手把手教你写ORM(四)
2007-01-24 13:51 596现在中午不睡一会儿就头晕。前一篇有人留言说为什么不写web.c ... -
手把手教你写ORM(五)
2007-01-24 15:29 571CMMI是魔鬼继续上面的内容,这里我们要实现一个插件的结构来动 ... -
谈谈我们的学习和我们的Blog
2007-01-24 20:07 364第一,学习编程是一个很枯燥的过程,所以我们更要讲究效率(要把有 ... -
手把手教你写代码生成器(也算ORM的续)
2007-01-25 11:45 671因为ORM还是需要配置,还是需要EntityObject,所以 ... -
粒度细到控件的权限管理系统的设计(概要篇)
2007-01-25 21:40 1024其实这个设计是已经做过了,那个时候我才进公司还在试用期,给我的 ... -
粒度细到控件的权限管理组件(构想篇)
2007-01-26 10:34 711说老实话我现在还没开 ... -
手把手教你写ORM大全篇
2007-01-26 19:36 636根据dudu boss的建议将本系列作一个归纳,下一个系列正在 ... -
架构设计的非侵入性原则
2007-01-27 00:41 657最近常常看到JAVA社区热 ... -
手把手教你可复用SSO组件的设计(原理篇)
2007-01-27 14:55 726在结构设计上复用性 ... -
对《万事欠备设计先行》的一点想法,兼谈XP和CMMI
2007-01-29 09:31 606周末陪女友,故沉默了,其实大脑并没有沉默,之前看到《万事欠备设 ... -
手把手教你可复用的SSO组件设计(设计篇)
2007-01-29 16:24 553周末陪女朋友去了,没写,告罪,上班后急忙补上。 这里说到了可复 ... -
手把手教你可复用的SSO组件设计(实现篇)
2007-01-29 22:30 572费了一夜的功夫写完这些代码,有些凌乱,望见谅。 首先是对加密解 ... -
玩具级嵌入式内存对象数据库^V^
2007-02-01 19:46 458纯粹是为了好玩:} 最近几天很忙所以写得少了,昨天在清理硬盘的 ... -
差之毫厘谬以千里-计算中的精度问题
2007-02-27 10:04 547如果你只是i++来作计数 ... -
动态语言,涅磐重生还是死路一条?
2007-03-06 10:31 541最近花时间一直在看python和ruby,为了在Web应用又看 ... -
ASP.NET's MVC is what a joke!
2007-03-08 13:43 455很早前还在毁人不倦的 ...
相关推荐
社服新消费行业周报:复盘百年乐高发展,探究泡泡玛特成功奥义.pdf
20210726-国信证券-宏观经济专题研究:破六合、观四象,探寻至简配置奥义.pdf
20201123-长江证券-恒力石化-600346-优质龙头深度复盘系列:未来国际龙头公司的成长奥义.rar
。。。
恒力石化600346优质龙头深度复盘系列:未来国际龙头公司的成长奥义
。。。
20201123-长江证券-恒力石化-600346-优质龙头深度复盘系列:未来国际龙头公司的成长奥义.pdf
端午节习俗中的养生奥义PPT.ppt
Matlab图形的编辑(含绘图修改的奥义[收集].pdf
方正证券_20160907_持仓量的奥义:从交易行为到CTA策略.pdf
淘宝螺旋成败的终极奥义原来是。。。.zip
淘宝螺旋成败的终极奥义原来是。。。.doc
奥义前端源码
探索数据的奥义 华为机器学习的发展 什么是机器学习 行业通用的机器学习类型 监督学习(分类、回归) 无监督学习(聚类) 行业通用的机器学习算法选择 企业应用AI的难点
在本课程中,你将探索基本的建立,修改和在3ds Max软件里提供的动画工具。打开现有的场景─最后的惊异加油站帮它添加一个招牌。然后,设计依个仅残留一条链子连结而悬挂于半空中的招牌。播放赶快Breaking.avi看看在...
淘宝螺旋成败的终极奥义原来是。。。-知识杂货店.doc
A股投资启示录(十一)-行业轮动奥义四大周期与八大属性招商证券.zip
「Adobe国际认证」字体与字体有区别吗?字体区别的真正“奥义”秘籍,你掌握了吗!.doc
一本国外的经典计算机原理书籍,翻译的夜不错,大家值得看一看,PDF格式。