- 浏览: 145712 次
- 性别:
- 来自: 成都
文章分类
最新评论
-
老八牛:
利用迭代器让异步操作更加“人性化”-山寨版的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 570最近有消息说韩国电信 ... -
继续ORM-欧德巴赫猜想-Mapping
2007-01-23 14:34 666最近从项目组单离出来开始在公司实施过程化管理,整个QA Off ... -
剑走偏锋,小心走火入魔
2007-01-23 15:07 706这是很久前写好的文字,闲得无聊就发上来,几个月前的感想,上午一 ... -
手把手教你写ORM(三)
2007-01-24 11:50 605昨天处于晕死状态,少写了一个组件,还需要一个组件用来专门管理C ... -
手把手教你写ORM(四)
2007-01-24 13:51 641现在中午不睡一会儿就头晕。前一篇有人留言说为什么不写web.c ... -
手把手教你写ORM(五)
2007-01-24 15:29 604CMMI是魔鬼继续上面的内容,这里我们要实现一个插件的结构来动 ... -
谈谈我们的学习和我们的Blog
2007-01-24 20:07 407第一,学习编程是一个很枯燥的过程,所以我们更要讲究效率(要把有 ... -
手把手教你写代码生成器(也算ORM的续)
2007-01-25 11:45 724因为ORM还是需要配置,还是需要EntityObject,所以 ... -
粒度细到控件的权限管理系统的设计(概要篇)
2007-01-25 21:40 1066其实这个设计是已经做过了,那个时候我才进公司还在试用期,给我的 ... -
粒度细到控件的权限管理组件(构想篇)
2007-01-26 10:34 747说老实话我现在还没开 ... -
手把手教你写ORM大全篇
2007-01-26 19:36 680根据dudu boss的建议将本系列作一个归纳,下一个系列正在 ... -
架构设计的非侵入性原则
2007-01-27 00:41 698最近常常看到JAVA社区热 ... -
手把手教你可复用SSO组件的设计(原理篇)
2007-01-27 14:55 758在结构设计上复用性 ... -
对《万事欠备设计先行》的一点想法,兼谈XP和CMMI
2007-01-29 09:31 650周末陪女友,故沉默了,其实大脑并没有沉默,之前看到《万事欠备设 ... -
手把手教你可复用的SSO组件设计(设计篇)
2007-01-29 16:24 592周末陪女朋友去了,没写,告罪,上班后急忙补上。 这里说到了可复 ... -
手把手教你可复用的SSO组件设计(实现篇)
2007-01-29 22:30 610费了一夜的功夫写完这些代码,有些凌乱,望见谅。 首先是对加密解 ... -
玩具级嵌入式内存对象数据库^V^
2007-02-01 19:46 495纯粹是为了好玩:} 最近几天很忙所以写得少了,昨天在清理硬盘的 ... -
差之毫厘谬以千里-计算中的精度问题
2007-02-27 10:04 586如果你只是i++来作计数 ... -
动态语言,涅磐重生还是死路一条?
2007-03-06 10:31 580最近花时间一直在看python和ruby,为了在Web应用又看 ... -
ASP.NET's MVC is what a joke!
2007-03-08 13:43 477很早前还在毁人不倦的 ...
相关推荐
。。Matlab11图形的编辑(含绘图修改的奥义.pdf
。。(完整)11Matlab图形的编辑(含绘图修改的奥义.pdf
社服新消费行业周报:复盘百年乐高发展,探究泡泡玛特成功奥义.pdf
《Matlab图形编辑与绘图修改的奥义》 在MATLAB中,图形的编辑与绘图修改是数据可视化过程中的重要环节。本篇将详细阐述如何通过MATLAB实现线型、颜色、字体的设置,以及各类标注和绘图设置等关键功能。 1. 线型、...
《恒力石化600346优质龙头深度复盘系列:未来国际龙头公司的成长奥义》这篇压缩包文件中的核心内容聚焦于恒力石化这一公司在行业中的地位、发展历程以及其未来的成长策略。恒力石化作为中国乃至全球石化行业的领军...
通过`ginput`函数,用户可以使用鼠标点选屏幕上的点,这对于获取图形上的特定数据点非常有用。`axis`命令可以控制坐标轴的范围、比例和方向,以更好地展示数据。 在绘图设置方面,`grid on`开启网格显示,增强图形...
本报告《宏观经济专题研究:破六合、观四象,探寻至简配置奥义》由国信证券撰写,聚焦于宏观经济分析以及金融资产配置的简化原理,探讨了如何在中国特色经济体制下,通过宏观经济指标预测并制定投资策略。...
《恒力石化:未来国际龙头公司的成长奥义》 这篇研究报告是长江证券针对恒力石化进行的一次深度分析,旨在探讨这家公司在行业中的领先地位以及其持续发展的关键因素。恒力石化,作为A股市场上的重要企业,代码为...
端午节习俗中的养生奥义PPT.ppt
首先,从标题“***-长江证券-恒力石化-600346-优质龙头深度复盘系列:未来国际龙头公司的成长奥义.pdf”中,我们可以提炼出以下几个关键词:恒力石化(600346)、优质龙头、深度复盘、国际龙头公司、成长奥义。...
"奥义前端源码"这个标题暗示我们即将探讨的是一个关于前端开发的源代码库,可能是一个项目或者框架,而“奥义”一词可能是开发者对其技术深度或独特性的象征性表述。描述中的内容简洁,没有提供具体的技术细节,所以...
方正证券_20160907_持仓量的奥义:从交易行为到CTA策略.pdf
淘宝螺旋成败的终极奥义原来是。。。.zip
淘宝螺旋成败的终极奥义原来是。。。.doc
在信息科技的浩瀚海洋中,有一本被誉为“经典的不能再经典”的计算机原理书籍——《编码的奥义》。这本书不仅是计算机专业人士的智慧宝典,也是那些对计算机科学充满好奇的读者的最佳读物。其内容深入浅出,详尽阐述...
2. 无监督学习:无监督学习处理没有人为标注结果的输入数据,模型需要自行发现数据中的结构和数值。无监督学习的一个典型方法是聚类,通过用户基本信息将用户划分为不同的群组。 3. 强化学习:强化学习是通过输入...
在本课程中,你将探索基本的建立,修改和在3ds Max软件里提供的动画工具。打开现有的场景─最后的惊异加油站帮它添加一个招牌。然后,设计依个仅残留一条链子连结而悬挂于半空中的招牌。播放赶快Breaking.avi看看在...
在Matlab中,图形编辑是数据可视化的重要环节,它能够帮助我们更好地理解并展示数据分析结果。以下是一些关于Matlab图形编辑的关键知识点: 1. **线型、颜色及字体设置**: - `plot`函数是Matlab中最基础的绘图...
淘宝螺旋成败的终极奥义原来是。。。-知识杂货店.doc