NHibernate1.02使用MsAccess2000Dialect 提供对 Access 数据库的支持

本文介绍如何使用NHibernateContrib的MsAccess2000Dialect解决访问Access数据库时遇到的问题,包括修改源代码、编译步骤及配置示例。

      NHibernateContrib 提供的JetDriver访问Access数据库简直是噩梦连连。插入更新含有日期类型的都回出现异常。在网上找到用 MsAccess2000Dialect 访问Access数据库的方法。1.02版本的NHibernate 或者NHibernateContrib本身没有包含MsAccess2000Dialect 在这里找到了它的下载地址 http://wiki.nhibernate.org/pages/viewpageattachments.action?pageId=345
       包含两个文件:msaccess2000joinfragment.cs 和 msaccess2000dialect.cs 。
       打开NHibernate的项目后把两个文件放到这里
1.jpg
然后重新编译NHibernate的项目就可以了。但是下载下来的文件有几个地方要修改一下。

  1. MsAccess2000Dialect.cs文件的这个地方
         protected   override   char  CloseQuote
            {
                
    get  {  return   ' ] ' ; }
            }

            
    ///   <summary></summary>
             protected   override   char  OpenQuote
            {
                
    get  {  return   ' [ ' ; }
            }
    的访问修饰符应该改为public。
  2. MsAccess2000Dialect.cs的构造函数
    public  MsAccess2000Dialect() :  base ()
            {
                Register( DbType.AnsiStringFixedLength, 
    " CHAR(255) "  );
                Register( DbType.AnsiStringFixedLength, 
    255 , " CHAR($1) "  );
                Register( DbType.AnsiStringFixedLength, 
    8000 " LONGTEXT "  );
                Register( DbType.AnsiString, 
    " VARCHAR(255) "  );
                Register( DbType.AnsiString, 
    255 , " VARCHAR($1) "  );
                Register( DbType.AnsiString, 
    2147483647 " LONGTEXT "  );
                Register( DbType.Binary, 
    " IMAGE "  );
                Register( DbType.Boolean, 
    " BIT "  );
                Register( DbType.Byte, 
    " TINYINT "  );
                Register( DbType.Currency, 
    " MONEY "  );
                Register( DbType.Date, 
    " DATETIME "  );
                Register( DbType.DateTime, 
    " DATETIME "  );
                Register( DbType.Decimal, 
    " NUMERIC "  );
                Register( DbType.Double, 
    " DOUBLE "  );  // synonym for FLOAT(53)
                Register( DbType.Guid,  " UNIQUEIDENTIFIER "  );
                Register( DbType.Int16, 
    " INT "  );
                Register( DbType.Int32, 
    " LONG "  );
                Register( DbType.Int64, 
    " NUMERIC "  );
                Register( DbType.Single, 
    " REAL "  );  // synonym for FLOAT(24) 
                Register( DbType.StringFixedLength,  " CHAR(255) "  );
                Register( DbType.StringFixedLength, 
    255 , " CHAR($1) "  );
                Register( DbType.StringFixedLength, 
    4000 " LONGTEXT "  );
                Register( DbType.String, 
    " VARCHAR(255) "  );
                Register( DbType.String, 
    255 , " VARCHAR($1) "  );
                Register( DbType.String, 
    1073741823 " LONGTEXT "  );
                Register( DbType.Time, 
    " DATETIME "  );

                DefaultProperties[ Environment.OuterJoin ] 
    =   " true " ;
                DefaultProperties[ Environment.ConnectionDriver ] 
    =   " NHibernate.Driver.OleDbDriver " ;
                DefaultProperties[ Environment.PrepareSql ] 
    =   " false " ;
            }
    中的Register方法应该全部改为RegisterColumnType方法.
  3. 构造函数中
    DefaultProperties[ Environment.UseOuterJoin ]  =   " true " ;
    的定义改为 Environment.UseOuterJoin。

修改完毕后使用这个连接配置文件就可以了。

  < configSections >
    
< section  name ="nhibernate"  type ="System.Configuration.NameValueSectionHandler, System, Version=1.0.3300.0,Culture=neutral, PublicKeyToken=b77a5c561934e089"   />
   
</ configSections >
  
  
< nhibernate >
    
< add  key ="hibernate.connection.provider"  value ="NHibernate.Connection.DriverConnectionProvider" />
    
< add  key ="hibernate.dialect"  value ="NHibernate.Dialect.MsAccess2000Dialect" />
    
< add  key ="hibernate.connection.driver_class"  value ="NHibernate.Driver.OleDbDriver" />
    
< add  key ="hibernate.connection.connection_string"  value ="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Access数据库的路径和名称" />
  
</ nhibernate >

 

 懒得重新编译的朋友下可以下这个已经重新编译过的NHibernate的单项目 /Files/Bruce_H21/NHibernate.rar
 不知道有没有人用SQL Server 7 dialect来访问Access数据库?
 
  如需转载请注明出处

转载于:https://www.cnblogs.com/Bruce_H21/archive/2006/04/29/388643.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值