- 浏览: 145875 次
- 性别:
- 来自: 成都
文章分类
最新评论
-
老八牛:
利用迭代器让异步操作更加“人性化”-山寨版的AsyncEnumerator -
老八牛:
为什么看不到代码?
利用迭代器让异步操作更加“人性化”-山寨版的AsyncEnumerator -
xi4nyu:
如果启动Application中的settings 的debu ...
玩蛇记-使用Tornado构建高性能Web之二-autoreload -
huacnlee:
"且在python下工作多日才发现原来在.NET下的 ...
玩蛇记-使用tornado构建高性能Web应用之一 -
jasongreen:
异步数据库操作,在web上有什么作用吗?
玩蛇记-使用tornado构建高性能Web应用之一
看过很多强类型查询的实现,觉得通过层层嵌套的方法来构造,感觉很不直观,昨天下午花了点时间写了个验证的代码,现在发上来大家看看这样子实现的查询方便不方便,有什么问题,因为是突发奇想,所以未经过严格验证,所以如果发现问题请温柔提出.
这里只是个验证想法的代码,所以没有作任何容错和扩展性处理.也不要提出OO不OO的看法,毫无疑义.
我所设想的是一个查询 Select [Columnlist] From [TableName] Where [Exp] Order By [PK] 一般来说是这个格式,我们最难表述的其实就是[Exp]这个部分。前面的都比较格式化,所以可以通过嵌套方法来实现还是比较合适的,但是[Exp]这个部分用诸如AND(Exp1,Exp2)这样子的形式不能很直观的看出表达式的意义,所以通过重载操作符的方式来实现,这里我们假设在Entity的Class里有static成员来存储列的名称。那么
Exp Rs=new Exp(User.ID) == 2 & new Exp(User.State) > 0 ;
这样子的格式就能表达Where后面的 ID=2 AND State>0 这个表达式
具体代码如下
这里只是个验证想法的代码,所以没有作任何容错和扩展性处理.也不要提出OO不OO的看法,毫无疑义.
我所设想的是一个查询 Select [Columnlist] From [TableName] Where [Exp] Order By [PK] 一般来说是这个格式,我们最难表述的其实就是[Exp]这个部分。前面的都比较格式化,所以可以通过嵌套方法来实现还是比较合适的,但是[Exp]这个部分用诸如AND(Exp1,Exp2)这样子的形式不能很直观的看出表达式的意义,所以通过重载操作符的方式来实现,这里我们假设在Entity的Class里有static成员来存储列的名称。那么
Exp Rs=new Exp(User.ID) == 2 & new Exp(User.State) > 0 ;
这样子的格式就能表达Where后面的 ID=2 AND State>0 这个表达式
具体代码如下
1 class Program
2 {
3 static void Main(string[] args)
4 {
5
6 Exp rs = new Exp("C1") == 25 & new Exp("C2") > 3 | new Exp("C3") < 5 ^ new Exp("C4") % "hehe";
7 Console.WriteLine(rs.Sql);
8 foreach (SqlParameter sp in rs.Sps)
9 {
10 Console.WriteLine(sp.ParameterName);
11 }
12 Console.Read();
13 }
14 }
15
16 class Exp
17 {
18 private string _Sql;
19
20 private List<SqlParameter> sps;
21
22 public List<SqlParameter> Sps
23 {
24 get { return sps; }
25 set { sps = value; }
26 }
27
28 private SqlParameter sp;
29
30 public string Sql
31 {
32 get { return _Sql; }
33 }
34
35 private Exp()
36 {
37 sps = new List<SqlParameter>();
38 }
39
40 public Exp(string CollumnName)
41 {
42 _Sql = CollumnName;
43 }
44
45 public static Exp operator ==(Exp Left, Object Value)
46 {
47 Exp Next = new Exp();
48 Next.sp = new SqlParameter(Left._Sql, Value);
49 Next.sps.Add(Next.sp);
50 Next._Sql = Left._Sql + " = @" + Left.Sql;
51 return Next;
52 }
53 public static Exp operator !=(Exp Left, Object Value)
54 {
55 Exp Next = new Exp();
56 Next.sp = new SqlParameter(Left._Sql, Value);
57 Next.sps.Add(Next.sp);
58 Next._Sql = Left._Sql + " <> @" + Left._Sql;
59 return Next;
60 }
61
62 public static Exp operator <(Exp Left, Object Value)
63 {
64 Exp Next = new Exp();
65 Next.sp = new SqlParameter(Left._Sql, Value);
66 Next.sps.Add(Next.sp);
67 Next._Sql = Left._Sql + " < @" + Left._Sql;
68 return Next;
69 }
70 public static Exp operator >(Exp Left, Object Value)
71 {
72 Exp Next = new Exp();
73 Next.sp = new SqlParameter(Left._Sql, Value);
74 Next.sps.Add(Next.sp);
75 Next._Sql = Left._Sql + " > @" + Left._Sql;
76 return Next;
77 }
78
79 public static Exp operator %(Exp Left, Object Value)
80 {
81 Exp Next = new Exp();
82 Next.sp = new SqlParameter(Left._Sql, Value);
83 Next.sps.Add(Next.sp);
84 Next._Sql = Left._Sql + " Like @" + Left._Sql;
85 return Next;
86 }
87
88 public static Exp operator &(Exp Left, Exp Right)
89 {
90 Exp Next = new Exp();
91 foreach (SqlParameter sp in Left.sps)
92 {
93 Next.sps.Add(sp);
94 }
95 foreach (SqlParameter sp in Right.sps)
96 {
97 Next.sps.Add(sp);
98 }
99 Next._Sql = Left.Sql + " AND " + Right.Sql;
100 return Next;
101 }
102
103
104 public static Exp operator |(Exp Left, Exp Right)
105 {
106 Exp Next = new Exp();
107 foreach (SqlParameter sp in Left.sps)
108 {
109 Next.sps.Add(sp);
110 }
111 foreach (SqlParameter sp in Right.sps)
112 {
113 Next.sps.Add(sp);
114 }
115 Next._Sql = Left.Sql + " OR " + Right.Sql;
116 return Next;
117 }
118
119 public static Exp operator ^(Exp Left, Exp Right)
120 {
121 Exp Next = new Exp();
122 foreach (SqlParameter sp in Left.sps)
123 {
124 Next.sps.Add(sp);
125 }
126 foreach (SqlParameter sp in Right.sps)
127 {
128 Next.sps.Add(sp);
129 }
130 Next._Sql = Left.Sql + " NOT " + Right.Sql;
131 return Next;
132 }
133 }
134
2 {
3 static void Main(string[] args)
4 {
5
6 Exp rs = new Exp("C1") == 25 & new Exp("C2") > 3 | new Exp("C3") < 5 ^ new Exp("C4") % "hehe";
7 Console.WriteLine(rs.Sql);
8 foreach (SqlParameter sp in rs.Sps)
9 {
10 Console.WriteLine(sp.ParameterName);
11 }
12 Console.Read();
13 }
14 }
15
16 class Exp
17 {
18 private string _Sql;
19
20 private List<SqlParameter> sps;
21
22 public List<SqlParameter> Sps
23 {
24 get { return sps; }
25 set { sps = value; }
26 }
27
28 private SqlParameter sp;
29
30 public string Sql
31 {
32 get { return _Sql; }
33 }
34
35 private Exp()
36 {
37 sps = new List<SqlParameter>();
38 }
39
40 public Exp(string CollumnName)
41 {
42 _Sql = CollumnName;
43 }
44
45 public static Exp operator ==(Exp Left, Object Value)
46 {
47 Exp Next = new Exp();
48 Next.sp = new SqlParameter(Left._Sql, Value);
49 Next.sps.Add(Next.sp);
50 Next._Sql = Left._Sql + " = @" + Left.Sql;
51 return Next;
52 }
53 public static Exp operator !=(Exp Left, Object Value)
54 {
55 Exp Next = new Exp();
56 Next.sp = new SqlParameter(Left._Sql, Value);
57 Next.sps.Add(Next.sp);
58 Next._Sql = Left._Sql + " <> @" + Left._Sql;
59 return Next;
60 }
61
62 public static Exp operator <(Exp Left, Object Value)
63 {
64 Exp Next = new Exp();
65 Next.sp = new SqlParameter(Left._Sql, Value);
66 Next.sps.Add(Next.sp);
67 Next._Sql = Left._Sql + " < @" + Left._Sql;
68 return Next;
69 }
70 public static Exp operator >(Exp Left, Object Value)
71 {
72 Exp Next = new Exp();
73 Next.sp = new SqlParameter(Left._Sql, Value);
74 Next.sps.Add(Next.sp);
75 Next._Sql = Left._Sql + " > @" + Left._Sql;
76 return Next;
77 }
78
79 public static Exp operator %(Exp Left, Object Value)
80 {
81 Exp Next = new Exp();
82 Next.sp = new SqlParameter(Left._Sql, Value);
83 Next.sps.Add(Next.sp);
84 Next._Sql = Left._Sql + " Like @" + Left._Sql;
85 return Next;
86 }
87
88 public static Exp operator &(Exp Left, Exp Right)
89 {
90 Exp Next = new Exp();
91 foreach (SqlParameter sp in Left.sps)
92 {
93 Next.sps.Add(sp);
94 }
95 foreach (SqlParameter sp in Right.sps)
96 {
97 Next.sps.Add(sp);
98 }
99 Next._Sql = Left.Sql + " AND " + Right.Sql;
100 return Next;
101 }
102
103
104 public static Exp operator |(Exp Left, Exp Right)
105 {
106 Exp Next = new Exp();
107 foreach (SqlParameter sp in Left.sps)
108 {
109 Next.sps.Add(sp);
110 }
111 foreach (SqlParameter sp in Right.sps)
112 {
113 Next.sps.Add(sp);
114 }
115 Next._Sql = Left.Sql + " OR " + Right.Sql;
116 return Next;
117 }
118
119 public static Exp operator ^(Exp Left, Exp Right)
120 {
121 Exp Next = new Exp();
122 foreach (SqlParameter sp in Left.sps)
123 {
124 Next.sps.Add(sp);
125 }
126 foreach (SqlParameter sp in Right.sps)
127 {
128 Next.sps.Add(sp);
129 }
130 Next._Sql = Left.Sql + " NOT " + Right.Sql;
131 return Next;
132 }
133 }
134
发表评论
-
关于ORM和内存数据库的遐想
2007-01-23 13:21 571最近有消息说韩国电信 ... -
继续ORM-欧德巴赫猜想-Mapping
2007-01-23 14:34 666最近从项目组单离出来开始在公司实施过程化管理,整个QA Off ... -
剑走偏锋,小心走火入魔
2007-01-23 15:07 707这是很久前写好的文字,闲得无聊就发上来,几个月前的感想,上午一 ... -
手把手教你写ORM(三)
2007-01-24 11:50 607昨天处于晕死状态,少写了一个组件,还需要一个组件用来专门管理C ... -
手把手教你写ORM(四)
2007-01-24 13:51 642现在中午不睡一会儿就头晕。前一篇有人留言说为什么不写web.c ... -
手把手教你写ORM(五)
2007-01-24 15:29 606CMMI是魔鬼继续上面的内容,这里我们要实现一个插件的结构来动 ... -
谈谈我们的学习和我们的Blog
2007-01-24 20:07 408第一,学习编程是一个很枯燥的过程,所以我们更要讲究效率(要把有 ... -
手把手教你写代码生成器(也算ORM的续)
2007-01-25 11:45 725因为ORM还是需要配置,还是需要EntityObject,所以 ... -
粒度细到控件的权限管理系统的设计(概要篇)
2007-01-25 21:40 1068其实这个设计是已经做过了,那个时候我才进公司还在试用期,给我的 ... -
粒度细到控件的权限管理组件(构想篇)
2007-01-26 10:34 748说老实话我现在还没开 ... -
手把手教你写ORM大全篇
2007-01-26 19:36 682根据dudu boss的建议将本系列作一个归纳,下一个系列正在 ... -
架构设计的非侵入性原则
2007-01-27 00:41 698最近常常看到JAVA社区热 ... -
手把手教你可复用SSO组件的设计(原理篇)
2007-01-27 14:55 759在结构设计上复用性 ... -
对《万事欠备设计先行》的一点想法,兼谈XP和CMMI
2007-01-29 09:31 652周末陪女友,故沉默了,其实大脑并没有沉默,之前看到《万事欠备设 ... -
手把手教你可复用的SSO组件设计(设计篇)
2007-01-29 16:24 593周末陪女朋友去了,没写,告罪,上班后急忙补上。 这里说到了可复 ... -
手把手教你可复用的SSO组件设计(实现篇)
2007-01-29 22:30 611费了一夜的功夫写完这些代码,有些凌乱,望见谅。 首先是对加密解 ... -
玩具级嵌入式内存对象数据库^V^
2007-02-01 19:46 496纯粹是为了好玩:} 最近几天很忙所以写得少了,昨天在清理硬盘的 ... -
差之毫厘谬以千里-计算中的精度问题
2007-02-27 10:04 587如果你只是i++来作计数 ... -
动态语言,涅磐重生还是死路一条?
2007-03-06 10:31 581最近花时间一直在看python和ruby,为了在Web应用又看 ... -
ASP.NET's MVC is what a joke!
2007-03-08 13:43 478很早前还在毁人不倦的 ...
相关推荐
由于PL-SQL融合了SQL语言的灵活性和过程化的概念,使得PL-SQL成为了一种功能强大的结构化语言,可以设计复杂的应用。 在实践中,SQL、T-SQL和PL-SQL都是关系数据库中的必备语言,但它们之间存在着一定的区别。SQL是...
Squirrel是一个静态类型的SQL构造库,它允许开发者以一种类型安全的方式构建SQL查询,避免了字符串拼接导致的潜在错误。Go-sqrl在Squirrel的基础上,通过优化内部实现,提升了查询构建和执行的速度,这对于大数据...
3. **动态构建**:由于Go语言的强类型特性,Go-SQLBuilder可以根据不同的条件或循环结构动态生成SQL,这在处理复杂查询逻辑时非常有用。 4. **支持多种操作**:除了基本的SELECT、INSERT、UPDATE和DELETE语句外,Go...
《Microsoft SQL Server 2008技术内幕:T-SQL查询》内容丰富、文字简洁明快,列举的实例具有一定的难度,而且实用性很强,可以把它们作为解决实际问题的标准模式。阅读《Microsoft SQL Server 2008技术内幕:T-SQL...
总结起来,强类型面向对象动态SQL生成器Wiz是一种创新的数据库访问解决方案,它通过提供一种更安全、高效且易于使用的SQL构造方式,降低了开发难度,提高了开发速度,同时保证了数据库操作的安全性。其设计和实现对...
6. **用户界面设计**: `VisualSQLQueryBuilder` 提供了一种图形化的方式来构建查询,可能包括表选择、字段选择、条件设置等,界面设计要直观且易于理解。 7. **事件监听和响应**: 用户在界面上的每一步操作,如添加...
在探讨GKD-Base数据库管理系统中嵌入式SQL的设计与实现之前,我们首先需要了解嵌入式SQL的基本概念及其在数据库管理系统中的作用和重要性。嵌入式SQL是指将SQL语句直接嵌入到高级编程语言中,如C或COBOL,从而实现对...
在本节《Access数据库应用技术》课程中,主要聚焦于教授如何创建SQL查询,这是数据库管理中的核心技能之一。SQL,全称为结构化查询语言(Structured Query Language),是用于管理和处理关系数据库的标准语言。以下...
通过以上内容的详细介绍,我们可以看出,《Mastering SQL Server Profiler》不仅是一本理论性强的参考书,更是一本实践性极高的指导手册,对于希望提升数据库管理技能的专业人士来说,无疑是一本极具价值的学习资源...
**LINQ to Datasets:通过LINQ访问强类型数据集** ...总之,LINQ to Datasets提供了一种高效、类型安全的方式来处理内存中的数据集,使得.NET开发者能够更便捷、更直观地进行数据操作,从而提升开发效率和代码质量。
它的强类型、安全性以及对.NET Framework的全面支持,使得开发者可以方便地创建复杂的管理系统。 SQL Server是微软公司推出的一款关系型数据库管理系统,以其强大的数据处理能力、稳定性和安全性受到广大开发者的...
网上商城购物系统是一种基于互联网技术,利用C#编程语言、SQL数据库管理和ASP.NET框架构建的电子商务平台。这个系统集成了商品展示、用户注册与登录、购物车管理、订单处理、支付接口等多种功能,旨在为用户提供便捷...
SQL DSL(Domain Specific Language)是一种专门用于数据库查询的语言,它将SQL语句的构建与执行封装为一种类型安全、易于理解和使用的API,通常与ORM(对象关系映射)框架结合使用,如JPA(Java Persistence API)...
SQL-Front 5.1.4.16 注册版是一款专为MySQL数据库设计的第三方图形界面客户端工具,它提供了一个直观且用户友好的界面,使得数据库开发与管理变得更加便捷。这款软件支持多种操作,包括数据查询、编辑、导入导出、...
XML数据查询语言X-SQL是一种新型的数据库查询语言,它的设计初衷是为了弥补现有XML查询语言的一些不足之处。X-SQL借鉴了SQL数据库查询语言的结构和特点,能够支持路径表达式查询,并且能够在多个数据源中选取数据。...
考生应熟悉Transact-SQL(T-SQL)语言,用于编写查询、更新和删除语句。理解数据类型、约束和关系模型至关重要,以确保数据的一致性和完整性。此外,考生还应掌握如何利用索引来提高查询性能,并了解分区视图和链接...
在SQL中,有时候我们需要将查询结果中多行的数据合并成一行,这在处理某些特定的报表或数据分析时非常有用。这种技术通常被称为行合并或行聚合。在本例中,我们将探讨如何使用纯SQL实现这一功能,特别是针对Oracle...