封了一个XPO初始化类

方便以后直接调用。

ExpandedBlockStart.gif XpoInitializer.cs
using  System;
using  System.Configuration;
using  System.Reflection;
using  DevExpress.Xpo;
using  DevExpress.Xpo.DB;

namespace  XpoHelper
{
    
public   static   class  XpoInitializer
    {
        
///   <summary>
        
///  调用XPO更新数据库结构。
        
///  需要在具有相应权限的数据库帐户下运行。
        
///   </summary>
        
///   <param name="assemblies"> 整个项目中所有包含了XPO持久类的程序集。如:typeof(LibraryA.ClassA).Assembly, typeof(LibraryB.ClassB).Assembly... </param>
         public   static   void  UpdateDatabaseSchema( params  Assembly[] assemblies)
        {
            
string  conn  =  GetConnectionString();
            IDataLayer datalayer 
=  XpoDefault.GetDataLayer(conn, AutoCreateOption.DatabaseAndSchema);
            
using  (Session session  =   new  Session(datalayer))
            {
                session.UpdateSchema(assemblies);
                session.CreateObjectTypeRecords(assemblies);
            }
        }

        
///   <summary>
        
///  根据配置文件创建并返回一个线程安全的XpoDataLayer。
        
///  用在有多线程并发访问的场合,如ASP.NET项目。
        
///  此方法同时会将该DataLayer指定给XpoDefault.DataLayer。
        
///  并且将XpoDefault.Session置空。
        
///   </summary>
        
///   <param name="assemblies"> 整个项目中所有包含了XPO持久类的程序集。如:typeof(LibraryA.ClassA).Assembly, typeof(LibraryB.ClassB).Assembly... </param>
        
///   <returns> 创建完成的ThreadSafeDataLayer </returns>
         public   static  ThreadSafeDataLayer CreateThreadSafeDataLayer( params  Assembly[] assemblies)
        {
            
string  conn  =  GetConnectionString();

            DevExpress.Xpo.Metadata.XPDictionary dict 
=   new  DevExpress.Xpo.Metadata.ReflectionDictionary();

            IDataStore store 
=  XpoDefault.GetConnectionProvider(conn, AutoCreateOption.SchemaAlreadyExists);

            dict.GetDataStoreSchema(assemblies);

            ThreadSafeDataLayer datalayer 
=   new  ThreadSafeDataLayer(dict, store);

            XpoDefault.DataLayer 
=  datalayer;

            XpoDefault.Session 
=   null ;

            
return  datalayer;
        }

        
///   <summary>
        
///  尝试根据配置文件中在appSettings节下指定的设置构造数据库连接字符串。
        
///  若失败则尝试获取connectionStrings节下指定的第一个连接字符串。
        
///   </summary>
        
///   <returns> 构造或获取到的数据库连接字符串 </returns>
         public   static   string  GetConnectionString()
        {
            
try
            {
                AppSettingsReader config 
=   new  AppSettingsReader();
                
string  serverType, server, database, user, password;
                serverType 
=  (( string )(config.GetValue( " ServerType " typeof ( string ))));
                server 
=  (( string )(config.GetValue( " Server " typeof ( string ))));
                database 
=  (( string )(config.GetValue( " Database " typeof ( string ))));
                user 
=  (( string )(config.GetValue( " User " typeof ( string ))));
                password 
=  (( string )(config.GetValue( " Password " typeof ( string ))));
                
switch  (serverType.ToUpper())
                {
                    
case   " ACCESS " :
                        
return  AccessConnectionProvider.GetConnectionString(database, user, password);
                    
case   " MSSQL " :
                        
return  MSSqlConnectionProvider.GetConnectionString(server, user, password, database);
                    
case   " MYSQL " :
                        
return  MySqlConnectionProvider.GetConnectionString(server, user, password, database);
                    
case   " ORACLE " :
                        
return  OracleConnectionProvider.GetConnectionString(server, user, password);
                    
//  ... generate connection strings for other providers, e.g. Firebird, etc.
                     default :
                        
return  ConfigurationManager.ConnectionStrings[ 0 ].ToString();
                }
            }
            
catch
            {
                
return  ConfigurationManager.ConnectionStrings[ 0 ].ToString();
            }
        }
    }
}

 

 

 

使用的方法很简单:

ExpandedBlockStart.gif Global.asax.cs
using  System;
using  DevExpress.Xpo;

namespace  Test
{
    
public   class  Global : System.Web.HttpApplication
    {
        
protected   void  Application_Start( object  sender, EventArgs e)
        {
            
//  更新数据库结构
            
//  因为需要较高的数据库帐户权限
            
//  出于安全性考虑的话,可以另起一个项目
            
//  分配一个较高权限的数据库帐户用以执行此操作
            XpoHelper.XpoInitializer.UpdateDatabaseSchema( typeof (Model.SomeClass).Assembly);

            
//  创建并获取一个线程安全的XpoDataLayer
            IDataLayer dataLayer  =  XpoHelper.XpoInitializer.CreateThreadSafeDataLayer( typeof (Model.SomeClass).Assembly);

            
//  上句代码执行完毕以后,新建的ThreadSafeDataLayer已经被指定给XpoDefault.DataLayer。
            
//  若有需要也可以另行保存一份,便于后续调用。
            Application.Add( " XpoLayer " , dataLayer);
        }
    }
}

 

 

 

配置文件中对数据库连接字符串的指定需要注意。

我们虽然可以像普通项目那样,直接在config文件中写好connectionstring,由XPO尝试根据该连接字符串去连接数据库并且判断出数据库的类型。然而这样做并不是十分的稳妥(有可能猜错>.<)。 比较好的办法是我们显式的指定数据库类型,帐号等信息,由XPO自己构建出连接字符串。

ExpandedBlockStart.gif web.config
     < appSettings >
        
<!--  Configuration for database -->
        
< add  key ="ServerType"  value ="ACCESS" />
        
< add  key ="Server"  value ="" />
        
< add  key ="Database"  value ="D:\test.mdb" />
        
< add  key ="User"  value ="" />
        
< add  key ="Password"  value ="" />
        
<!-- <add key="ServerType" value="MSSQL"/>
        <add key="Server" value="127.0.0.10"/>
     <add key="Database" value="Test"/>
     <add key="User" value="sa"/>
     <add key="Password" value="sa"/>
-->
        
<!-- <add key="ServerType" value="MySQL" />
     <add key="Server" value="127.0.0.1" />
     <add key="Database" value="Test" />
     <add key="User" value="root" />
     <add key="Password" value="sa" />
-->
    
</ appSettings >
    
< connectionStrings />

 

 

 

转载于:https://www.cnblogs.com/Elvin/archive/2010/02/05/1664313.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值