关于NHibernate下Access的使用以及NHibernate下SQL到Access的迁移
2012-05-05 15:23
316 查看
前段时间做了一个网站,是在已有的基于NHibernate和Castle ActiveRecord的平台上做的,由于原平台是基于SQL 2005 开发的,所以这次就没考虑数据库的问题,做完之后才得知说是在虚拟主机上运行的,而且该虚拟主机不支持SQL数据库,只能使用Access。一下子懵了,虽然NHibernate支持N多数据库的平滑切换,但现在使用Access的真的不太多见,NHibernate早就从主类库中把Access的支持给剔除了。再说了那么多数据表和基础数据不可能一个一个搬一遍吧?
车到山前必有路,前段时间研究过NHibernate下的Access支持问题,虽然没能成功,但方向还是有的。接下来就一步一步走一遍吧:
所用版本说明:NHibernate:3.1.0.4000,Castle.ActiveRecord:3.0.0.138
第一步:下载NHibernate.JetDriver,由于网络上的版本都是早期的,所以我下载后又在NHibernate3.1版本上进行了编译,不然版本不兼容会报错。
第二步:更新配置文件(web.config)为Access配置,如下图所示:
说明:connection.connection_string 中的Data
Source指向的是Access数据库文件(提前建好一个空Access库即可,在第三步中我们会让NHibernate自动将数据表创建到这个空库中),建议放在App_Data目录下即可,JetDriver会自动映射到网站的根目录。
第三步:让NHibernate自动建表到空的Access数据库。
1)修改文件Global.asax
2)创建一个Web页面,在Page_Load事件中随便new一个实体并Save,配置没什么问题的话,即可触发上面的CreateSchema()事件并自动在Access空库中创建所有映射实体的数据表。建议这样建表,因为发现通过SQL到Access自动导入数据并建表的方式创建的数据表,其字段类型、长度、索引、主键等和原表相去甚远。但为了使其能够自动创建字段类型、长度、主键等完全符合的数据表,在创建实体的时候就需要尽可能的把实体属性写全面(这里只针对ActiveRecord),如:
3)从SQL Server导入数据到Access(这个就不多说了,需要提醒的是SQLserver 2005需要专业版才能顺利把数据导入到Access,Express版没有相应导入功能)。
至此,Access的支持已经大功告成了,别忘了修改下Global.asax,将CreateSchema()一行注释掉。
车到山前必有路,前段时间研究过NHibernate下的Access支持问题,虽然没能成功,但方向还是有的。接下来就一步一步走一遍吧:
所用版本说明:NHibernate:3.1.0.4000,Castle.ActiveRecord:3.0.0.138
第一步:下载NHibernate.JetDriver,由于网络上的版本都是早期的,所以我下载后又在NHibernate3.1版本上进行了编译,不然版本不兼容会报错。
第二步:更新配置文件(web.config)为Access配置,如下图所示:
<?xml version="1.0"?> <configuration> <configSections> <section name="activerecord" type="Castle.ActiveRecord.Framework.Config.ActiveRecordSectionHandler, Castle.ActiveRecord"/> </configSections> <activerecord isWeb= "true" > <config> <add key="connection.driver_class" value="NHibernate.JetDriver.JetDriver, NHibernate.JetDriver"/> <add key="dialect" value="NHibernate.JetDriver.JetDialect, NHibernate.JetDriver"/> <add key="connection.provider" value="NHibernate.Connection.DriverConnectionProvider"/> <add key="connection.connection_string" value="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=App_Data/Test.mdb"/> <add key="proxyfactory.factory_class" value="NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle"/> <add key="connection.release_mode" value="on_close"/> </config> </activerecord> <appSettings>……
说明:connection.connection_string 中的Data
Source指向的是Access数据库文件(提前建好一个空Access库即可,在第三步中我们会让NHibernate自动将数据表创建到这个空库中),建议放在App_Data目录下即可,JetDriver会自动映射到网站的根目录。
第三步:让NHibernate自动建表到空的Access数据库。
1)修改文件Global.asax
void Application_Start(object sender, EventArgs e) { //在应用程序启动时运行的代码 //初始化ActiveRecord→NHibernate XmlConfigurationSource configSource = ConfigurationManager.GetSection("activerecord") as XmlConfigurationSource; ActiveRecordStarter.Initialize(configSource, /*↓数据库映射实体↓*/ typeof(RollingPic), typeof(SubSite), typeof(SubCategory), typeof(SubContent), typeof(MsgBoard), typeof(FriendLink), typeof(SignUpMsg) ); //根据初始化的实体,自动生成数据表(生成数据表后请屏蔽该行代码) ActiveRecordStarter.CreateSchema(); }
2)创建一个Web页面,在Page_Load事件中随便new一个实体并Save,配置没什么问题的话,即可触发上面的CreateSchema()事件并自动在Access空库中创建所有映射实体的数据表。建议这样建表,因为发现通过SQL到Access自动导入数据并建表的方式创建的数据表,其字段类型、长度、索引、主键等和原表相去甚远。但为了使其能够自动创建字段类型、长度、主键等完全符合的数据表,在创建实体的时候就需要尽可能的把实体属性写全面(这里只针对ActiveRecord),如:
/// <summary> /// 用户信息实体,映射数据表:xt_user。 /// </summary> [Serializable] [ActiveRecord("xt_user", DynamicInsert = true, DynamicUpdate = true)] public class UserEntity : ActiveRecordValidationBase { public static readonly ILog Log = LogManager.GetLogger(typeof(UserEntity)); #region Public Properties(实体公开属性) /// <summary> /// 主键 /// </summary> [PrimaryKey(PrimaryKeyType.Native)] public long Id { get; set; } /// <summary> /// 登录账号 /// </summary> [Property(SqlType = "nvarchar(30)", NotNull = true, Unique = true)]//Unique:唯一索引 [ValidateNonEmpty("登录账号:不能为空")] [ValidateIsUnique("登录账号:已被使用!")] [ValidateLength(0, 30, "登录账户:最大长度30")] public string UserLoginZh { get; set; } /// <summary> /// 姓名 /// </summary> [Property(SqlType = "nvarchar(20)")] [ValidateLength(0, 20, "姓名:最大长度20")] public string UserName { get; set; }
3)从SQL Server导入数据到Access(这个就不多说了,需要提醒的是SQLserver 2005需要专业版才能顺利把数据导入到Access,Express版没有相应导入功能)。
至此,Access的支持已经大功告成了,别忘了修改下Global.asax,将CreateSchema()一行注释掉。
相关文章推荐
- 无可救药的拖延症——关于asp网页使用Access及大图浏览效果以及爬虫登录及下载文件
- 关于Data Access Blok (SqlHelper.cs)使用时出现"对象必须实现 IConvertible/Object must implement IConvertible."异常
- sql T_sql 关于left join ,right join ,inner join 的使用以及区别
- 关于oracle的sql语句中 for update 的使用,以及存在的问题
- 关于sql access excel以及在web.config中数据库连接字符串的写法
- NHibernate系列学习(二)-使用sql和hql以及linq
- ACCESS与MSSQL比较:SQL语句关于时间格式使用的注意点
- 关于在使用spring出现类似java.sql.SQLException: Access denied for user 'XXX'@'localhost' (using password: YES)
- 微软企业库4.1学习笔记(三)企业库迁移和并行使用,以及企业库的扩展
- sql查询调优之where条件排序字段以及limit使用索引的奥秘
- 关于选择参加人员的返回代码以及工作汇报的sql
- 关于使用struts2时子窗体页面跳转后在父窗体打开的问题以及Session过期后的页面跳转问题
- 关于动态SQL的使用
- 【学习笔记】汇编:关于CLD以及DF的用法,还有一点REP的使用
- SQL server和access两种用SQL语句计算两个日期间隔的年、月以及天数
- 关于cocos2d-js中使用 ClippingNode 以及 BlendFunc 来实现遮罩
- 笔记一:关于在Windows环境下使用cmd向mysql数据库中导入.sql数据表文件
- 关于JAVA连接ORACLE以及使用的相关知识
- 关于aspnet_regsql的使用
- 关于Qt使用QNetworkAccessManager下载文件(实现断点续传功能)