向ms数据库中插入DateTime类型的数据,C#

wang315235277 2011-10-16 05:05:08
我向数据库中一个表的一个字段插入数据,是DateTimen类型,我在代码中写了DateTime a=DateTime.Parse(DateTime.Now.ToString());把a插入数据库中,但总是提示,“”附近有语法错误,后来我在数据库中写了插入语句发现是在datatime类型的字段出错,比如:2011/10/16 17:05:00中是说"17"附近有语法错误

跪求高手解决,为什么C#中的DateTime类型插不进数据库中的DateTime类型的字段中
...全文
455 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
huijunliang 2011-10-17
  • 打赏
  • 举报
回复
楼主代码没有贴全 没办法帮你,以前我也有过这个问题,后来找了半天就是一个转型小错误,瞎折腾!
回头是岸 2011-10-17
  • 打赏
  • 举报
回复
如果不想要后面的时分秒 可采用 convert()函数
flybisu 2011-10-17
  • 打赏
  • 举报
回复
你sql语句有问题吧
wang315235277 2011-10-17
  • 打赏
  • 举报
回复
看到12楼的话,才想起来
wang315235277 2011-10-17
  • 打赏
  • 举报
回复
各位哥哥,感谢你们的回答,终于解决了,写了几千行的代码,到最后犯了个低级错误:单引号没加,我自己都无语了
wang315235277 2011-10-17
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 zmcici 的回复:]
引用楼主 wang315235277 的回复:
我向数据库中一个表的一个字段插入数据,是DateTimen类型,我在代码中写了DateTime a=DateTime.Parse(DateTime.Now.ToString());把a插入数据库中,但总是提示,“”附近有语法错误,后来我在数据库中写了插入语句发现是在datatime类型的字段出错,比如:2011/10/16 17:05:00中是说"……
[/Quote]


我用三层写的,还要调用实体层,对实体层的字段付值,
qin_0 2011-10-17
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 ruanwei1987 的回复:]

DateTime a=DateTime.Parse(DateTime.Now.ToString());

DateTime.Now是日期类型

DateTime.Now.ToString() 字符串类型

DateTime.Parse(DateTime.Now.ToString()); 日期类型

lz 拐弯了

lz 不要怀疑 C#的日期类型为什么 插不进你的 数据库的日……
[/Quote]
说的蛮详细了
梦纷飞舞 2011-10-17
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 beyond_me21 的回复:]

如果是拼接sql直接这样string sql="insert into tbname(date) values ('"+DateTime.Now.ToString()+"')";就可以了,记得要加单引号
[/Quote]+1
zthsn 2011-10-17
  • 打赏
  • 举报
回复
帮顶了
insus 2011-10-17
  • 打赏
  • 举报
回复
取当前时存储表中,为如直接给表一个default值,DEFAULT(GETDATE())
这样在sql语句时,根本无再去写。
ruanwei1987 2011-10-17
  • 打赏
  • 举报
回复
DateTime a=DateTime.Parse(DateTime.Now.ToString());

DateTime.Now是日期类型

DateTime.Now.ToString() 字符串类型

DateTime.Parse(DateTime.Now.ToString()); 日期类型

lz 拐弯了

lz 不要怀疑 C#的日期类型为什么 插不进你的 数据库的日期类型
因为都是 微软的东西,这个不可能

唯一可能的是,你把你 连接的sql 和 调试时可以在 数据库运行的sql 发出来,让大家 鉴定鉴定
骑猪看海 2011-10-17
  • 打赏
  • 举报
回复
[Quote=引用楼主 wang315235277 的回复:]
我向数据库中一个表的一个字段插入数据,是DateTimen类型,我在代码中写了DateTime a=DateTime.Parse(DateTime.Now.ToString());把a插入数据库中,但总是提示,“”附近有语法错误,后来我在数据库中写了插入语句发现是在datatime类型的字段出错,比如:2011/10/16 17:05:00中是说"17"附近有语法错误

跪求高手解决,为什么C……
[/Quote]
为什么要DateTime.Parse(DateTime.Now.ToString());
直接在INSERT里拼'"+DateTime.Now+"'不就可以了
灵雨飘零 2011-10-17
  • 打赏
  • 举报
回复
无码无真相!
让IE灭亡 2011-10-17
  • 打赏
  • 举报
回复
肯定是你的sql语句有问题的,最好贴出来
beyond_me21 2011-10-16
  • 打赏
  • 举报
回复
如果是拼接sql直接这样string sql="insert into tbname(date) values ('"+DateTime.Now.ToString()+"')";就可以了,记得要加单引号
theillusion 2011-10-16
  • 打赏
  • 举报
回复
楼主是拼sql字符串的么
wang315235277 2011-10-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hhqsy 的回复:]
string sql="@insert into tbname(date) values (cast('2011-10-16'as datetime ))";
[/Quote]


关键我从代码中传来了的数据是DateTime类型,是有时间的,我也像过把时间去掉,虽然时间去掉了,但是最后还是要转换到dateTime类型又加上默认的时间00:00:000
  • 打赏
  • 举报
回复
string sql="@insert into tbname(date) values (cast('2011-10-16'as datetime ))";
数据系统 课程实验报告 "实验名称 "实验四 简单图书馆管理数据的实现 " "班级 " "学号 " "姓名 " " "指导教师 " " "(一、一、实验目的 " "学习数据的设计,了解存储过程、触发器MS Sql Server的使用。 " "二、实验内容 " "【数据设计】 " "简单图书管理系统应包括读者和图书的管理,借、还管理等功能。为此我们设计三张" "表分别记录读者、图书和借阅信息。同时为了降低复杂度,我们假定每本书只有一本" ",每个读者借阅时间为一个月并且针对借阅权限不做限制。由此数据设计如下: " "表:图书信息表 " "字段名 " "数据类型 " "长度 " "允许空 " " " "书号 " "varchar " "10 " "否 " " " "书名 " "varchar " "15 " "否 " " " "作者 " "varchar " "15 " "是 " " " "状态 " "bit " "1 " "否 " " " "说明:书号是书的唯一标识即主键;状态表示是否在库可借。 " " " "表:读者信息表 " "字段名 " "数据类型 " "长度 " "允许空 " " " "借书证号 " "varchar " "10 " "否 " " " "姓名 " "varchar " "15 " "否 " " " "住址 " "varchar " "20 " "是 " " " "说明:借书证号是读者的唯一标识即主键。 " " " "表:借阅信息表 " "字段名 " "数据类型 " "长度 " "允许空 " " " "编号 " "int " "4 " "否 " " " "书号 " "varchar " "10 " "否 " " " "借书证号 " "varchar " "10 " "否 " " " "借书时间 " "datetime " "8 " "否 " " " "应还时间 " "datetime " "8 " "否 " " " "说明:编号是借阅记录的标识,主键,自动增长;书号 " "图4-1为ER图: " "图4-1 " " " "【实验过程】 " "建数据数据表 " "按前述分析,利用企业管理器或者查询分析器(推荐)建"图书馆管理"数据数据" "表。 " "数据的基本操作 " "增加记录: " " " "图书信息表: " "书号 " "书名 " "作者 " "状态 " " " "1 " "sql语言 " "sql " "1 " " " "2 " "c++语言 " "c++ " "1 " " " "3 " "sql server " "ms " "1 " " " "4 " "java教程 " "java " "1 " " " "5 " "c#教程 " "c# " "1 " " " "6 " "计算机网络 " "net " "1 " " " " " "读者信息表: " "借书证号 " "姓名 " "住址 " " " "1 " "张三 " "学三 " " " "2 " "李四 " "学四 " " " "3 " "王五 " "学五 " " " "并对这两个表进行删除、更新、和查询等操作 " " " "创建触发器、和存储过程进行借、还书操作 " "针对借阅信息表的插入操作创建触发器,当借阅信息表进行插入操作时,自动根据书" "号,将图书信息表相应记录的"状态"字段改为0。 " "针对借阅信息表的删除操作创建触发器,当借阅信息表进行删除操作时,自动根据书" "号,将图书信息表相应记录的"状态"字段改为1。 " "创建存储过程:sf_borrow,实现借书功能即:向借阅信息表进行插入操作,将书号 " "、借书证号,借书时间作为参数,并自动的将还书时间设置为借书时间后一个月。 " "创建存储过程:sf_return,现实还书功能即:根据书号对借阅信息表进行删除操作 " ",将书号作为参数。 " "利用sf_borrow,sf_return进行借、还操作,并注意数据三个表的数据变化情况" "。 " "三、实验结果及分析 " "(一)创建数据数据表: " "选择用企业管理器创建数据数据表 " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " "(二)数据相关操作: " "1.查询: " " " " " " " " " " " " " " " " " " " " " " " " " " " "2.删除: " " " " " "删除后: " " " " " "
V1.1比V1.0增强了IDBSession功能,可查询得到 IDataReader;修改了查询 in 操作符的bug。
内含代码生成器,支持Oracle/SqlServer/MSAccess,ORMap性能大大优于iBatisNet,终身免费无限制使用,绝无任何版权问题。
===========
软件说明:
1.1 引言
约有90%的企业信息化管理系统基于数据实现,这类系统又有超过30%的代码集数据访问层负责业务数据存取。除了实现数据的增删改查,数据访问层还要提供一些与业务无关功能,例如面向对象的持久化与访问机制、本地事务与分布式事务支持、多数据支持,这些机制或功能形成相对独立的逻辑领域,其主要目的有:

1、 提供简单易用的数据访问方法,提高开发效率;

2、 提供面向对象的方式来简化对数据访问与操作,也就是ORMap方式;

3、 屏蔽数据差异,使开发出的产品容易在不同数据产品上移植。

为了适应软件快速开发的需要,软件企业应该借助组件产品或开源软件项目来搭建这些基础设施。在.Net平台上,目前比较成功和应用较广的开源项目有NHibernate和IBatisNet等,它们在ORMap方面的表现尤为突出。依赖这些平台,软件开发效率和产品质量都得到了极大提高,ORMap机制渐渐成为大势所趋。

本公司致力于软件组件开发,提供的AppFramework数据访问组件具有高效的ORMap机制,调用接口简单灵活,支持各种主流的数据平台,是个非常优秀的数据访问组件。本文详尽描述了AppFramework数据访问组件使用的方法和技巧,有助于开发者最大程度发挥出AppFramework的优势。

1.2 各种优秀ORMap工具比较
NHibernate和IBatisNet等虽然都实现了ORMap,但它们的设计侧重点有所不同,有着各自的优势和缺陷,适合于特定的项目。NHibernate实现了纯对象化的ORMap,在屏蔽数据差异、面向对象方面做的非常好,但在访问与操作海量数据时其性能表现较差,也不易实现复杂的查询统计功能。NHibernate适合那些数据量不大、性能要求不高、复杂度不高的场合。

IBatisNet是一个轻量级ORMap工具,它把所有的SQL脚本以模板的方式集到若干个XML配置文件里,用反射的方式向把C#类实体对象属性与SQL模板的参数绑定,动态生成参数化的SQL语句发送给数据执行,查询的结果集也用反射的方式构造为对象集合返回给程序。由于提供了灵活的SQL模板机制,在海量数据的访问与操作方面其性能比NHibernate要高得多,也很容易实现各种复杂的数据查询统计功能。但是IBatisNet也存在许多几个不足之处,有些还是先天因素造成的:

第一,数据可移植性差。IBatisNet获得高性能与灵活性也是付出代价的,它牺牲了数据可移植性:由于编写SQL模板不得不用到数据产品的一些语法差异,例如ORACLE的TO_DATE、Length()、SYSDATE等,为了把产品移植到其它数据,开发人员不得不对大量的SQL模板进行翻译。

第二,无法方便地向数据插入NULL值。因为IBatisNet是直接把C#的基本类型(如int/DateTime)插入数据字段的。对于一些C#类型,例如int,并没有NULL状态。于是不得不采用一些特殊的值来表示NULL,例如int.MinValue。IBatisNet数据映射器会自动把int.MinValue转换为NULL插入数据,而从数据获得NULL时,也会转化为C#的int.MinValue。这样,程序就要对int.MinVaue这个值进行特殊处理,例如不能把int.MinValue直接显示在DataGrid里或界面上。有一种规避的方法,就是避免向数据插入NULL,即要求所有业务数据入库的值都不为空。但这样作实际上是限制了程序的行为能力,例如无法实现单据草稿的保存。

第三,在插入数据时无法方便的使用字段默认值。最明显的就是类似于LAST_UPDATE_TIME了,通常为了保证这个字段的一致性,通常在插入新记录时采用当前数据时间作为字段值。但IBatisNet接收的实体类对象属性都是普通C#类型,并不具备传入表达式的能力。如果采用动态SQL,则会导致SQL模板和参数实体类过于复杂,将极大降低性能。

第四,在查询返回大量对象时,用反射的方式构造实体的方式性能损失是相当大的。实体类属性数目越多、返回记录数越多,用到反射的次数也越多,查询性能降低就越明显。

第五,不能方便地限定查询语句返回的字段。ADO.Net执行查询时,select语句里设置了几个字段就返回几个字段到DataTable。而IBatisNet若要返回不同的字段就要定义多套ResultMap,否则就定义一套所有字段的ResultMap,任何查询都返回所有字段。这样无疑浪费了数据服务器与应用服务器之间的网络带宽,在进行海量数据访问时性能将严重降低。

第六,返回的结果IList不能够方便地进行二次查询。相比之下,ADO.Net返回的DataTable虽然性能差一些,但可以实现在应用程序内存灵活和高性能的二次查询。

第七,无法直接利用数据的特殊语法支持海量数据的分页查询功能。众所周知Oracle提供了ROWNUM实现数据数据内分页功能,若要利用这一特性,就要在SQL模板里直接硬编码这些特殊语法,这必然导致大量的移植工作。

第八、缺少代码生成和检查工具。程序里的变量名与Sql模板里的变量经常会出现不一致,而这些错误无法在编译时发现,靠人工检查很容易造成错误泄漏。也没提供工具直接生成SQL模板和映射配置文件。

第九,IBatisNet的SqlMap文件里的SQL语句以明文存放,容易被修改造成重大安全隐患,尤其不适合开发C/S应用程序。

第十,由于Sql模板采用动态加载的方式,如果写错了SQL,程序里难以跟踪调试,这对初学者来说无疑是对耐心和信心的极大考验。

总之,IBatisNet虽然提灵活、高性能的ORMap机制,但却损失了数据可移植性的,在使用方便性和局部性能方面也都有很大提高的余地。

1.3 AppFramework数据访问组件的组成和优势
AppFramework数据访问组件由下列文件组成:

1、 AppFramework.DBAccess.dll

提供多数据统一的访问接口,提供DAO管理器、数据会话管理器。

2、 AppFramework.Data.dll

提供核心的数据结构和基础类。

3、 AppFramework.Tools.CodeGenPlugin.msi

提供集成于Visual Studio 2005的C#代码生成器插件,用于生成DAO/Model/各种接口。

4、 DBAccess.config

配置数据连接串。

5、 CodeGenPlogin.config

配置代码生成器参数。

6、 *.DaoGen文件

配置DAO生成信息,并由CodeGenPlugin解析生成代码。



AppFramework数据访问组件针对IBatisNet的种种缺陷提出相应的解决方案,相比之下有如下优势:

1、 从扩展基础数据类型入手,解决了空值问题和默认值问题;

2、 提供了内置的数据内分页访问机制,极大地提高了海量查询的响应速度;

3、 增加ObjectTable泛型类来承载查询返回的对象集,不但比IList更加强类型化,还提供了二分查找功能,使得对象结果集可以在应用程序内存进行重排序和快速查找;

4、 提供了强大的QueryFilter类构造查询条件,使得实现数据查询不再需要编写复杂的SQL语句;

5、 提供类似IBatisNet的Sql模板功能,为复杂的查询统计提供较直观的开发模式;

6、 提供代码生成工具,生成的类代码的同时可以类之间的继承关系和接口实现关系,所有DAO类方法均以接口作为参数,使得代码更加具有可扩展性和灵活性。

7、 Sql模板和ORMap直接生成.cs原代码,编译为可执行代码,各种ORMap映射文件无需再随主程序集一起部署,提高了代码的安全性,提高了代码的可调试性,也提高了ORMap的性能。



下面三张表格罗列的测试数据,可以明显看出AppFramework数据访问组件的性能全面超越了IBatisNet:



表I –10并发20循环(数据和测试机分开)

对比项目
iBatis2.0

(毫秒)
AppFramework

(毫秒)
后者前者性能对比

(倍)

根据主键获取实体

(20次单条select)
19.8
16.1

QueryFilter:18.0
1.23

1.10

每秒插入实体

(20次insert)
41
21
1.95

更新实体

(20次单条update)
27
19

SqlMap:24
1.42

1.13

查询结果集(平均101行)

(2循环200次select)
1100
690

不定字段:720
1.59

1.53




表II –50并发4循环(数据和测试机分开)

对比项目
iBatis2.0

(毫秒)
AppFramework

(毫秒)
后者前者性能对比

(倍)

根据主键获取实体

(20次单条select)
17.5
13.3

QueryFilter:14.5
1.32

1.21

插入实体

(20次insert)
36.1
17.4
2.07

更新实体

(20次单条update)
23.5
15.9

SqlMap:20.3
1.48

1.16

查询结果集(平均101行)

(1循环200次select)
1055.1
666.8

不定字段:710.1
1.58

1.50




表III –50并发10循环(数据和测试机同机)

对比项目
iBatis2.0

(毫秒)
AppFramework

(毫秒)
后者前者性能对比

(倍)

根据主键获取实体

(20次单条select)
6.1
5.3

QueryFilter: 5.75
1.15

1.06

插入实体

(20次insert)
15.1
10.8
1.40

更新实体

(20次单条update)
10.4
7.5

SqlMap:9.3
1.38

1.12

查询结果集(平均101行)

(1循环200次select)
560
360

不定字段:380
1.56

1.47




总之,AppFramework数据访问组件是一个高性能、接口简单、可移植性强、高灵活性的综合数据访问解决方案。使用AppFramework数据访问组件,可以降低企业的开发人员培训成本,提高产品的开发速度,提高产品稳定可靠性,提高产品的可伸缩性和可移植性。下文将分入门、精通、高级三个篇章,详细讲述如何使用AppFramework数据访问组件来搭建应用程序。
代码生成器,ORMap,支持Oracle/SqlServer/MSAccess,性能大大优于iBatisNet,终身免费,随意使用。
===========
软件说明:
1.1 引言
约有90%的企业信息化管理系统基于数据实现,这类系统又有超过30%的代码集数据访问层负责业务数据存取。除了实现数据的增删改查,数据访问层还要提供一些与业务无关功能,例如面向对象的持久化与访问机制、本地事务与分布式事务支持、多数据支持,这些机制或功能形成相对独立的逻辑领域,其主要目的有:

1、 提供简单易用的数据访问方法,提高开发效率;

2、 提供面向对象的方式来简化对数据访问与操作,也就是ORMap方式;

3、 屏蔽数据差异,使开发出的产品容易在不同数据产品上移植。

为了适应软件快速开发的需要,软件企业应该借助组件产品或开源软件项目来搭建这些基础设施。在.Net平台上,目前比较成功和应用较广的开源项目有NHibernate和IBatisNet等,它们在ORMap方面的表现尤为突出。依赖这些平台,软件开发效率和产品质量都得到了极大提高,ORMap机制渐渐成为大势所趋。

本公司致力于软件组件开发,提供的AppFramework数据访问组件具有高效的ORMap机制,调用接口简单灵活,支持各种主流的数据平台,是个非常优秀的数据访问组件。本文详尽描述了AppFramework数据访问组件使用的方法和技巧,有助于开发者最大程度发挥出AppFramework的优势。

1.2 各种优秀ORMap工具比较
NHibernate和IBatisNet等虽然都实现了ORMap,但它们的设计侧重点有所不同,有着各自的优势和缺陷,适合于特定的项目。NHibernate实现了纯对象化的ORMap,在屏蔽数据差异、面向对象方面做的非常好,但在访问与操作海量数据时其性能表现较差,也不易实现复杂的查询统计功能。NHibernate适合那些数据量不大、性能要求不高、复杂度不高的场合。

IBatisNet是一个轻量级ORMap工具,它把所有的SQL脚本以模板的方式集到若干个XML配置文件里,用反射的方式向把C#类实体对象属性与SQL模板的参数绑定,动态生成参数化的SQL语句发送给数据执行,查询的结果集也用反射的方式构造为对象集合返回给程序。由于提供了灵活的SQL模板机制,在海量数据的访问与操作方面其性能比NHibernate要高得多,也很容易实现各种复杂的数据查询统计功能。但是IBatisNet也存在许多几个不足之处,有些还是先天因素造成的:

第一,数据可移植性差。IBatisNet获得高性能与灵活性也是付出代价的,它牺牲了数据可移植性:由于编写SQL模板不得不用到数据产品的一些语法差异,例如ORACLE的TO_DATE、Length()、SYSDATE等,为了把产品移植到其它数据,开发人员不得不对大量的SQL模板进行翻译。

第二,无法方便地向数据插入NULL值。因为IBatisNet是直接把C#的基本类型(如int/DateTime)插入数据字段的。对于一些C#类型,例如int,并没有NULL状态。于是不得不采用一些特殊的值来表示NULL,例如int.MinValue。IBatisNet数据映射器会自动把int.MinValue转换为NULL插入数据,而从数据获得NULL时,也会转化为C#的int.MinValue。这样,程序就要对int.MinVaue这个值进行特殊处理,例如不能把int.MinValue直接显示在DataGrid里或界面上。有一种规避的方法,就是避免向数据插入NULL,即要求所有业务数据入库的值都不为空。但这样作实际上是限制了程序的行为能力,例如无法实现单据草稿的保存。

第三,在插入数据时无法方便的使用字段默认值。最明显的就是类似于LAST_UPDATE_TIME了,通常为了保证这个字段的一致性,通常在插入新记录时采用当前数据时间作为字段值。但IBatisNet接收的实体类对象属性都是普通C#类型,并不具备传入表达式的能力。如果采用动态SQL,则会导致SQL模板和参数实体类过于复杂,将极大降低性能。

第四,在查询返回大量对象时,用反射的方式构造实体的方式性能损失是相当大的。实体类属性数目越多、返回记录数越多,用到反射的次数也越多,查询性能降低就越明显。

第五,不能方便地限定查询语句返回的字段。ADO.Net执行查询时,select语句里设置了几个字段就返回几个字段到DataTable。而IBatisNet若要返回不同的字段就要定义多套ResultMap,否则就定义一套所有字段的ResultMap,任何查询都返回所有字段。这样无疑浪费了数据服务器与应用服务器之间的网络带宽,在进行海量数据访问时性能将严重降低。

第六,返回的结果IList不能够方便地进行二次查询。相比之下,ADO.Net返回的DataTable虽然性能差一些,但可以实现在应用程序内存灵活和高性能的二次查询。

第七,无法直接利用数据的特殊语法支持海量数据的分页查询功能。众所周知Oracle提供了ROWNUM实现数据数据内分页功能,若要利用这一特性,就要在SQL模板里直接硬编码这些特殊语法,这必然导致大量的移植工作。

第八、缺少代码生成和检查工具。程序里的变量名与Sql模板里的变量经常会出现不一致,而这些错误无法在编译时发现,靠人工检查很容易造成错误泄漏。也没提供工具直接生成SQL模板和映射配置文件。

第九,IBatisNet的SqlMap文件里的SQL语句以明文存放,容易被修改造成重大安全隐患,尤其不适合开发C/S应用程序。

第十,由于Sql模板采用动态加载的方式,如果写错了SQL,程序里难以跟踪调试,这对初学者来说无疑是对耐心和信心的极大考验。

总之,IBatisNet虽然提灵活、高性能的ORMap机制,但却损失了数据可移植性的,在使用方便性和局部性能方面也都有很大提高的余地。

1.3 AppFramework数据访问组件的组成和优势
AppFramework数据访问组件由下列文件组成:

1、 AppFramework.DBAccess.dll

提供多数据统一的访问接口,提供DAO管理器、数据会话管理器。

2、 AppFramework.Data.dll

提供核心的数据结构和基础类。

3、 AppFramework.Tools.CodeGenPlugin.msi

提供集成于Visual Studio 2005的C#代码生成器插件,用于生成DAO/Model/各种接口。

4、 DBAccess.config

配置数据连接串。

5、 CodeGenPlogin.config

配置代码生成器参数。

6、 *.DaoGen文件

配置DAO生成信息,并由CodeGenPlugin解析生成代码。



AppFramework数据访问组件针对IBatisNet的种种缺陷提出相应的解决方案,相比之下有如下优势:

1、 从扩展基础数据类型入手,解决了空值问题和默认值问题;

2、 提供了内置的数据内分页访问机制,极大地提高了海量查询的响应速度;

3、 增加ObjectTable泛型类来承载查询返回的对象集,不但比IList更加强类型化,还提供了二分查找功能,使得对象结果集可以在应用程序内存进行重排序和快速查找;

4、 提供了强大的QueryFilter类构造查询条件,使得实现数据查询不再需要编写复杂的SQL语句;

5、 提供类似IBatisNet的Sql模板功能,为复杂的查询统计提供较直观的开发模式;

6、 提供代码生成工具,生成的类代码的同时可以类之间的继承关系和接口实现关系,所有DAO类方法均以接口作为参数,使得代码更加具有可扩展性和灵活性。

7、 Sql模板和ORMap直接生成.cs原代码,编译为可执行代码,各种ORMap映射文件无需再随主程序集一起部署,提高了代码的安全性,提高了代码的可调试性,也提高了ORMap的性能。



下面三张表格罗列的测试数据,可以明显看出AppFramework数据访问组件的性能全面超越了IBatisNet:



表I –10并发20循环(数据和测试机分开)

对比项目
iBatis2.0

(毫秒)
AppFramework

(毫秒)
后者前者性能对比

(倍)

根据主键获取实体

(20次单条select)
19.8
16.1

QueryFilter:18.0
1.23

1.10

每秒插入实体

(20次insert)
41
21
1.95

更新实体

(20次单条update)
27
19

SqlMap:24
1.42

1.13

查询结果集(平均101行)

(2循环200次select)
1100
690

不定字段:720
1.59

1.53




表II –50并发4循环(数据和测试机分开)

对比项目
iBatis2.0

(毫秒)
AppFramework

(毫秒)
后者前者性能对比

(倍)

根据主键获取实体

(20次单条select)
17.5
13.3

QueryFilter:14.5
1.32

1.21

插入实体

(20次insert)
36.1
17.4
2.07

更新实体

(20次单条update)
23.5
15.9

SqlMap:20.3
1.48

1.16

查询结果集(平均101行)

(1循环200次select)
1055.1
666.8

不定字段:710.1
1.58

1.50




表III –50并发10循环(数据和测试机同机)

对比项目
iBatis2.0

(毫秒)
AppFramework

(毫秒)
后者前者性能对比

(倍)

根据主键获取实体

(20次单条select)
6.1
5.3

QueryFilter: 5.75
1.15

1.06

插入实体

(20次insert)
15.1
10.8
1.40

更新实体

(20次单条update)
10.4
7.5

SqlMap:9.3
1.38

1.12

查询结果集(平均101行)

(1循环200次select)
560
360

不定字段:380
1.56

1.47




总之,AppFramework数据访问组件是一个高性能、接口简单、可移植性强、高灵活性的综合数据访问解决方案。使用AppFramework数据访问组件,可以降低企业的开发人员培训成本,提高产品的开发速度,提高产品稳定可靠性,提高产品的可伸缩性和可移植性。下文将分入门、精通、高级三个篇章,详细讲述如何使用AppFramework数据访问组件来搭建应用程序。
1.1 引言
约有90%的企业信息化管理系统基于数据实现,这类系统又有超过30%的代码集数据访问层负责业务数据存取。除了实现数据的增删改查,数据访问层还要提供一些与业务无关功能,例如面向对象的持久化与访问机制、本地事务与分布式事务支持、多数据支持,这些机制或功能形成相对独立的逻辑领域,其主要目的有:

1、 提供简单易用的数据访问方法,提高开发效率;

2、 提供面向对象的方式来简化对数据访问与操作,也就是ORMap方式;

3、 屏蔽数据差异,使开发出的产品容易在不同数据产品上移植。

为了适应软件快速开发的需要,软件企业应该借助组件产品或开源软件项目来搭建这些基础设施。在.Net平台上,目前比较成功和应用较广的开源项目有NHibernate和IBatisNet等,它们在ORMap方面的表现尤为突出。依赖这些平台,软件开发效率和产品质量都得到了极大提高,ORMap机制渐渐成为大势所趋。

本公司致力于软件组件开发,提供的AppFramework数据访问组件具有高效的ORMap机制,调用接口简单灵活,支持各种主流的数据平台,是个非常优秀的数据访问组件。本文详尽描述了AppFramework数据访问组件使用的方法和技巧,有助于开发者最大程度发挥出AppFramework的优势。

1.2 各种优秀ORMap工具比较
NHibernate和IBatisNet等虽然都实现了ORMap,但它们的设计侧重点有所不同,有着各自的优势和缺陷,适合于特定的项目。NHibernate实现了纯对象化的ORMap,在屏蔽数据差异、面向对象方面做的非常好,但在访问与操作海量数据时其性能表现较差,也不易实现复杂的查询统计功能。NHibernate适合那些数据量不大、性能要求不高、复杂度不高的场合。

IBatisNet是一个轻量级ORMap工具,它把所有的SQL脚本以模板的方式集到若干个XML配置文件里,用反射的方式向把C#类实体对象属性与SQL模板的参数绑定,动态生成参数化的SQL语句发送给数据执行,查询的结果集也用反射的方式构造为对象集合返回给程序。由于提供了灵活的SQL模板机制,在海量数据的访问与操作方面其性能比NHibernate要高得多,也很容易实现各种复杂的数据查询统计功能。但是IBatisNet也存在许多几个不足之处,有些还是先天因素造成的:

第一,数据可移植性差。IBatisNet获得高性能与灵活性也是付出代价的,它牺牲了数据可移植性:由于编写SQL模板不得不用到数据产品的一些语法差异,例如ORACLE的TO_DATE、Length()、SYSDATE等,为了把产品移植到其它数据,开发人员不得不对大量的SQL模板进行翻译。

第二,无法方便地向数据插入NULL值。因为IBatisNet是直接把C#的基本类型(如int/DateTime)插入数据字段的。对于一些C#类型,例如int,并没有NULL状态。于是不得不采用一些特殊的值来表示NULL,例如int.MinValue。IBatisNet数据映射器会自动把int.MinValue转换为NULL插入数据,而从数据获得NULL时,也会转化为C#的int.MinValue。这样,程序就要对int.MinVaue这个值进行特殊处理,例如不能把int.MinValue直接显示在DataGrid里或界面上。有一种规避的方法,就是避免向数据插入NULL,即要求所有业务数据入库的值都不为空。但这样作实际上是限制了程序的行为能力,例如无法实现单据草稿的保存。

第三,在插入数据时无法方便的使用字段默认值。最明显的就是类似于LAST_UPDATE_TIME了,通常为了保证这个字段的一致性,通常在插入新记录时采用当前数据时间作为字段值。但IBatisNet接收的实体类对象属性都是普通C#类型,并不具备传入表达式的能力。如果采用动态SQL,则会导致SQL模板和参数实体类过于复杂,将极大降低性能。

第四,在查询返回大量对象时,用反射的方式构造实体的方式性能损失是相当大的。实体类属性数目越多、返回记录数越多,用到反射的次数也越多,查询性能降低就越明显。

第五,不能方便地限定查询语句返回的字段。ADO.Net执行查询时,select语句里设置了几个字段就返回几个字段到DataTable。而IBatisNet若要返回不同的字段就要定义多套ResultMap,否则就定义一套所有字段的ResultMap,任何查询都返回所有字段。这样无疑浪费了数据服务器与应用服务器之间的网络带宽,在进行海量数据访问时性能将严重降低。

第六,返回的结果IList不能够方便地进行二次查询。相比之下,ADO.Net返回的DataTable虽然性能差一些,但可以实现在应用程序内存灵活和高性能的二次查询。

第七,无法直接利用数据的特殊语法支持海量数据的分页查询功能。众所周知Oracle提供了ROWNUM实现数据数据内分页功能,若要利用这一特性,就要在SQL模板里直接硬编码这些特殊语法,这必然导致大量的移植工作。

第八、缺少代码生成和检查工具。程序里的变量名与Sql模板里的变量经常会出现不一致,而这些错误无法在编译时发现,靠人工检查很容易造成错误泄漏。也没提供工具直接生成SQL模板和映射配置文件。

第九,IBatisNet的SqlMap文件里的SQL语句以明文存放,容易被修改造成重大安全隐患,尤其不适合开发C/S应用程序。

第十,由于Sql模板采用动态加载的方式,如果写错了SQL,程序里难以跟踪调试,这对初学者来说无疑是对耐心和信心的极大考验。

总之,IBatisNet虽然提灵活、高性能的ORMap机制,但却损失了数据可移植性的,在使用方便性和局部性能方面也都有很大提高的余地。

1.3 AppFramework数据访问组件的组成和优势
AppFramework数据访问组件由下列文件组成:

1、 AppFramework.DBAccess.dll

提供多数据统一的访问接口,提供DAO管理器、数据会话管理器。

2、 AppFramework.Data.dll

提供核心的数据结构和基础类。

3、 AppFramework.Tools.CodeGenPlugin.msi

提供集成于Visual Studio 2005的C#代码生成器插件,用于生成DAO/Model/各种接口。

4、 DBAccess.config

配置数据连接串。

5、 CodeGenPlogin.config

配置代码生成器参数。

6、 *.DaoGen文件

配置DAO生成信息,并由CodeGenPlugin解析生成代码。



AppFramework数据访问组件针对IBatisNet的种种缺陷提出相应的解决方案,相比之下有如下优势:

1、 从扩展基础数据类型入手,解决了空值问题和默认值问题;

2、 提供了内置的数据内分页访问机制,极大地提高了海量查询的响应速度;

3、 增加ObjectTable泛型类来承载查询返回的对象集,不但比IList更加强类型化,还提供了二分查找功能,使得对象结果集可以在应用程序内存进行重排序和快速查找;

4、 提供了强大的QueryFilter类构造查询条件,使得实现数据查询不再需要编写复杂的SQL语句;

5、 提供类似IBatisNet的Sql模板功能,为复杂的查询统计提供较直观的开发模式;

6、 提供代码生成工具,生成的类代码的同时可以类之间的继承关系和接口实现关系,所有DAO类方法均以接口作为参数,使得代码更加具有可扩展性和灵活性。

7、 Sql模板和ORMap直接生成.cs原代码,编译为可执行代码,各种ORMap映射文件无需再随主程序集一起部署,提高了代码的安全性,提高了代码的可调试性,也提高了ORMap的性能。



下面三张表格罗列的测试数据,可以明显看出AppFramework数据访问组件的性能全面超越了IBatisNet:



表I –10并发20循环(数据和测试机分开)

对比项目
iBatis2.0

(毫秒)
AppFramework

(毫秒)
后者前者性能对比

(倍)

根据主键获取实体

(20次单条select)
19.8
16.1

QueryFilter:18.0
1.23

1.10

每秒插入实体

(20次insert)
41
21
1.95

更新实体

(20次单条update)
27
19

SqlMap:24
1.42

1.13

查询结果集(平均101行)

(2循环200次select)
1100
690

不定字段:720
1.59

1.53




表II –50并发4循环(数据和测试机分开)

对比项目
iBatis2.0

(毫秒)
AppFramework

(毫秒)
后者前者性能对比

(倍)

根据主键获取实体

(20次单条select)
17.5
13.3

QueryFilter:14.5
1.32

1.21

插入实体

(20次insert)
36.1
17.4
2.07

更新实体

(20次单条update)
23.5
15.9

SqlMap:20.3
1.48

1.16

查询结果集(平均101行)

(1循环200次select)
1055.1
666.8

不定字段:710.1
1.58

1.50




表III –50并发10循环(数据和测试机同机)

对比项目
iBatis2.0

(毫秒)
AppFramework

(毫秒)
后者前者性能对比

(倍)

根据主键获取实体

(20次单条select)
6.1
5.3

QueryFilter: 5.75
1.15

1.06

插入实体

(20次insert)
15.1
10.8
1.40

更新实体

(20次单条update)
10.4
7.5

SqlMap:9.3
1.38

1.12

查询结果集(平均101行)

(1循环200次select)
560
360

不定字段:380
1.56

1.47




总之,AppFramework数据访问组件是一个高性能、接口简单、可移植性强、高灵活性的综合数据访问解决方案。使用AppFramework数据访问组件,可以降低企业的开发人员培训成本,提高产品的开发速度,提高产品稳定可靠性,提高产品的可伸缩性和可移植性。下文将分入门、精通、高级三个篇章,详细讲述如何使用AppFramework数据访问组件来搭建应用程序。

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧