Galbanum 之Orm(一)

来源:互联网 发布:2014年以前网络歌曲 编辑:程序博客网 时间:2024/04/29 14:43

 Galbanum为小巫主发开源项目,其中思想大凡是我个人的,不足之处凡请指出,联系方式:ojek@163.com

首个Orm基本完成,因为个人能力和时候上的限制,源码注释主要为接口和一些虚类为主。

 

Orm.dll文件下载地址:http://download.csdn.net/source/858438

Orm源程序下载地址:http://download.csdn.net/source/858454

Orm思想主要考虑到多数据库环境的兼容和实体操作中的反射的性能。

多数据库兼容通过在IStatement接口中多态AddParameter来实现,
反射主要是被IEntity接口的逆向外接代替,所以大家用的时候会感觉实体类要写太多的代码,虽然是自动生成的:(
这样主要是减少在反射特性和属性带来性能消耗,不过引发的是类型转换。于是建议在查询数据集的时候直接使用IStatment接口下的ExcuteDataTable或者ExcuteDataSet。

下面主要讲一下使用方法:
首先添加引用orm.dll
新建网站,配置web.config

  1. <?xml version="1.0"?>
  2. <!-- 
  3.     注意: 除了手动编辑此文件以外,您还可以使用 
  4.     Web 管理工具来配置应用程序的设置。可以使用 Visual Studio 中的
  5.      “网站”->“Asp.Net 配置”选项。
  6.     设置和注释的完整列表在 
  7.     machine.config.comments 中,该文件通常位于 
  8.     /Windows/Microsoft.Net/Framework/v2.x/Config 中
  9. -->
  10. <configuration>
  11.     <appSettings/>
  12.     <connectionStrings>
  13.         <add connectionString="server=127.0.0.1; User ID=sa;Password=cherry; database=citylife" name="conn1" providerName="sqlclient"/>
  14.         <add connectionString="Provider=Microsoft.Jet.OleDb.4.0;Data Source=D://Program Files//Galbanum//OrmTest//App_Data//Test.mdb" name="conn2" providerName="oledb"/>
  15.     </connectionStrings>
  16.     <system.web>
  17.         <!-- 
  18.             设置 compilation debug="true" 将调试符号插入
  19.             已编译的页面中。但由于这会 
  20.             影响性能,因此只在开发过程中将此值 
  21.             设置为 true。
  22.         -->
  23.         <compilation debug="true">
  24.             <assemblies>
  25.                 <add assembly="System.Data.OracleClient, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/></assemblies></compilation>
  26.         <!--
  27.             通过 <authentication> 节可以配置 ASP.NET 使用的 
  28.             安全身份验证模式,
  29.             以标识传入的用户。 
  30.         -->
  31.         <authentication mode="Windows"/>
  32.         <!--
  33.             如果在执行请求的过程中出现未处理的错误,
  34.             则通过 <customErrors> 节可以配置相应的处理步骤。具体说来,
  35.             开发人员通过该节可以配置
  36.             要显示的 html 错误页
  37.             以代替错误堆栈跟踪。
  38.         <customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm">
  39.             <error statusCode="403" redirect="NoAccess.htm" />
  40.             <error statusCode="404" redirect="FileNotFound.htm" />
  41.         </customErrors>
  42.         -->
  43.     </system.web>
  44. </configuration>

上面的只是在自动生成的web.config配置了connectionstring节点,

在新建页面中添加using Orm;
  1. //添加Orm引用
  2. using Orm;
当然,在些之前,要添加这个.dll, 这也就不介绍了。
用一段代码来说明使用方式
  1. protected void Page_Load(object sender, EventArgs e)
  2.     {
  3.         //本例用SQL和OleDb测试,Oracle可加行自测
  4.         //accesss数据库为绝对路径,可自行改为Request.MapPath
  5.         if (!IsPostBack)
  6.         {  
  7.             IDataBase dbase = DataBaseFactory.GetDataBase("conn1");//注:conn1为你在web.config节点connectionString中的name
  8.             // <add connectionString="server=127.0.0.1; User ID=sa;Password=cherry; database=citylife" name="conn1"(即不些) providerName="sqlclient"/>
  9.             IStatement stmt = dbase.GetStatement();
  10.             stmt.CommandText = "select * from Employee";
  11.             dbase.Open();
  12.             DataTable sqldt = stmt.ExecuteTable();
  13.             dbase.Close();
  14.             this.SqlGridView.DataSource = sqldt;
  15.             this.SqlGridView.DataBind();
  16.             //access用实体来查询
  17.             dbase = DataBaseFactory.GetDataBase("conn2");//同上注释
  18.             dbase.Open();
  19.             List<Employee> ls = dbase.Load<Employee>();
  20.             dbase.Close();
  21.             this.AccessGridView.DataSource =ls;
  22.             this.AccessGridView.DataBind();
  23.         }
  24.     }
SqlGridView和AccessGridView 分别为GridView控件,即数据绑定到GridView的例子,
当你要把SqlGridView控件绑定access数据库的时候,你只要把
 IDataBase dbase = DataBaseFactory.GetDataBase("conn1");

更改为:

 IDataBase dbase = DataBaseFactory.GetDataBase("conn2");

这样就轻易的转换成不同的数据库操作了。Oracle数据库在本例中没有测试,你可以自行测试,以看看效果,当然,两个数据库的表名和结构必须得相同。。

Employ实体类代码为:

  1. using System;
  2. using System.Data;
  3. using System.Configuration;
  4. using System.Web;
  5. using System.Web.Security;
  6. using System.Web.UI;
  7. using System.Web.UI.WebControls;
  8. using System.Web.UI.WebControls.WebParts;
  9. using System.Web.UI.HtmlControls;
  10. using Orm;
  11. using Orm.Attribute;
  12. /// <summary>
  13. /// Employee 的摘要说明
  14. /// </summary>
  15. [Table("employee")]
  16. public class Employee:IEntity
  17. {
  18.     public Employee()
  19.     {
  20.         //
  21.         // TODO: 在此处添加构造函数逻辑
  22.         //
  23.     }
  24.     private int? id;
  25.     private string name;
  26.     private bool? sex;
  27.     private int? age;
  28.     private DateTime? birthday;
  29.     [Column("id",true)]
  30.     public int? Id
  31.     {
  32.         get { return this.id; }
  33.     }
  34.     [Column("name")]
  35.     public string Name
  36.     {
  37.         get { return this.name; }
  38.         set { this.name = value; }
  39.     }
  40.     [Column("sex")]
  41.     public bool? Sex
  42.     {
  43.         get { return this.sex; }
  44.         set { this.sex = value; }
  45.     }
  46.     [Column("age")]
  47.     public int? Age
  48.     {
  49.         get { return this.age; }
  50.         set { this.age = value; }
  51.     }
  52.     [Column("birthday")]
  53.     public DateTime? BirthDay
  54.     {
  55.         get { return this.birthday; }
  56.         set { this.birthday = value; }
  57.     }
  58.     #region IEntity 成员
  59.     public IEntity GetEntity(System.Data.Common.DbDataReader dr)
  60.     {
  61.         Employee emp = new Employee();
  62.         if (dr.Read())
  63.         {
  64.             emp.id = int.Parse(dr["id"].ToString());
  65.             emp.Name = (string)dr["name"];
  66.             if (dr["sex"] != DBNull.Value) emp.Sex =(bool)dr["sex"];
  67.             if(dr["age"]!=DBNull.Value) emp.Age = int.Parse(dr["age"].ToString());
  68.             if(dr["birthday"]!=DBNull.Value) emp.BirthDay= (DateTime)dr["birthday"];
  69.         }
  70.         dr.Dispose();
  71.         return emp;
  72.     }
  73.     public IEntity GetEntity(DataRow dr)
  74.     {
  75.         Employee emp = new Employee();
  76.         emp.id = int.Parse(dr["id"].ToString());
  77.         emp.Name = (string)dr["name"];
  78.         if (dr["sex"] != DBNull.Value) emp.Sex = (bool)dr["sex"];
  79.         if (dr["age"] != DBNull.Value) emp.Age = int.Parse(dr["age"].ToString());
  80.         if (dr["birthday"] != DBNull.Value) emp.BirthDay = (DateTime)dr["birthday"];
  81.         return emp;
  82.     }
  83.     public void SetSqlParameters(IStatement stmt, IEntity entity, bool isAddKey)
  84.     {
  85.         Employee emp = entity as Employee;
  86.         
  87.         stmt.AddParameter("@name", emp.Name);
  88.         if (emp.Sex == null) stmt.AddParameter("@sex", DBNull.Value);
  89.         else stmt.AddParameter("@sex", emp.Sex);
  90.         if (emp.Age == null) stmt.AddParameter("@age", DBNull.Value);
  91.         else stmt.AddParameter("@age", emp.Age);
  92.         if (emp.BirthDay == null) stmt.AddParameter("@birthday", DBNull.Value);
  93.         else stmt.AddParameter("@birthday", emp.BirthDay);
  94.         if (isAddKey) stmt.AddParameter("@id", emp.Id);
  95.     }
  96.     public void SetOracleParameters(IStatement stmt, IEntity entity, bool isAddKey)
  97.     {
  98.         Employee emp = entity as Employee;
  99.         stmt.AddParameter(":name", emp.name);
  100.         stmt.AddParameter(":sex", emp.sex);
  101.         stmt.AddParameter(":age", emp.age);
  102.         if (isAddKey)
  103.             stmt.AddParameter(":id", emp.id);
  104.     }
  105.     #endregion
  106. }


更详细的实体使用我会在后面文章中介绍。。。








原创粉丝点击