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
- <?xml version="1.0"?>
- <!--
- 注意: 除了手动编辑此文件以外,您还可以使用
- Web 管理工具来配置应用程序的设置。可以使用 Visual Studio 中的
- “网站”->“Asp.Net 配置”选项。
- 设置和注释的完整列表在
- machine.config.comments 中,该文件通常位于
- /Windows/Microsoft.Net/Framework/v2.x/Config 中
- -->
- <configuration>
- <appSettings/>
- <connectionStrings>
- <add connectionString="server=127.0.0.1; User ID=sa;Password=cherry; database=citylife" name="conn1" providerName="sqlclient"/>
- <add connectionString="Provider=Microsoft.Jet.OleDb.4.0;Data Source=D://Program Files//Galbanum//OrmTest//App_Data//Test.mdb" name="conn2" providerName="oledb"/>
- </connectionStrings>
- <system.web>
- <!--
- 设置 compilation debug="true" 将调试符号插入
- 已编译的页面中。但由于这会
- 影响性能,因此只在开发过程中将此值
- 设置为 true。
- -->
- <compilation debug="true">
- <assemblies>
- <add assembly="System.Data.OracleClient, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/></assemblies></compilation>
- <!--
- 通过 <authentication> 节可以配置 ASP.NET 使用的
- 安全身份验证模式,
- 以标识传入的用户。
- -->
- <authentication mode="Windows"/>
- <!--
- 如果在执行请求的过程中出现未处理的错误,
- 则通过 <customErrors> 节可以配置相应的处理步骤。具体说来,
- 开发人员通过该节可以配置
- 要显示的 html 错误页
- 以代替错误堆栈跟踪。
- <customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm">
- <error statusCode="403" redirect="NoAccess.htm" />
- <error statusCode="404" redirect="FileNotFound.htm" />
- </customErrors>
- -->
- </system.web>
- </configuration>
上面的只是在自动生成的web.config配置了connectionstring节点,
在新建页面中添加using Orm;
- //添加Orm引用
- using Orm;
用一段代码来说明使用方式
- protected void Page_Load(object sender, EventArgs e)
- {
- //本例用SQL和OleDb测试,Oracle可加行自测
- //accesss数据库为绝对路径,可自行改为Request.MapPath
- if (!IsPostBack)
- {
- IDataBase dbase = DataBaseFactory.GetDataBase("conn1");//注:conn1为你在web.config节点connectionString中的name
- // <add connectionString="server=127.0.0.1; User ID=sa;Password=cherry; database=citylife" name="conn1"(即不些) providerName="sqlclient"/>
- IStatement stmt = dbase.GetStatement();
- stmt.CommandText = "select * from Employee";
- dbase.Open();
- DataTable sqldt = stmt.ExecuteTable();
- dbase.Close();
- this.SqlGridView.DataSource = sqldt;
- this.SqlGridView.DataBind();
- //access用实体来查询
- dbase = DataBaseFactory.GetDataBase("conn2");//同上注释
- dbase.Open();
- List<Employee> ls = dbase.Load<Employee>();
- dbase.Close();
- this.AccessGridView.DataSource =ls;
- this.AccessGridView.DataBind();
- }
- }
当你要把SqlGridView控件绑定access数据库的时候,你只要把
IDataBase dbase = DataBaseFactory.GetDataBase( "conn1" );
更改为:
IDataBase dbase = DataBaseFactory.GetDataBase( "conn2" );
这样就轻易的转换成不同的数据库操作了。Oracle数据库在本例中没有测试,你可以自行测试,以看看效果,当然,两个数据库的表名和结构必须得相同。。
Employ实体类代码为:
- using System;
- using System.Data;
- using System.Configuration;
- using System.Web;
- using System.Web.Security;
- using System.Web.UI;
- using System.Web.UI.WebControls;
- using System.Web.UI.WebControls.WebParts;
- using System.Web.UI.HtmlControls;
- using Orm;
- using Orm.Attribute;
- /// <summary>
- /// Employee 的摘要说明
- /// </summary>
- [Table("employee")]
- public class Employee:IEntity
- {
- public Employee()
- {
- //
- // TODO: 在此处添加构造函数逻辑
- //
- }
- private int? id;
- private string name;
- private bool? sex;
- private int? age;
- private DateTime? birthday;
- [Column("id",true)]
- public int? Id
- {
- get { return this.id; }
- }
- [Column("name")]
- public string Name
- {
- get { return this.name; }
- set { this.name = value; }
- }
- [Column("sex")]
- public bool? Sex
- {
- get { return this.sex; }
- set { this.sex = value; }
- }
- [Column("age")]
- public int? Age
- {
- get { return this.age; }
- set { this.age = value; }
- }
- [Column("birthday")]
- public DateTime? BirthDay
- {
- get { return this.birthday; }
- set { this.birthday = value; }
- }
- #region IEntity 成员
- public IEntity GetEntity(System.Data.Common.DbDataReader dr)
- {
- Employee emp = new Employee();
- if (dr.Read())
- {
- emp.id = int.Parse(dr["id"].ToString());
- emp.Name = (string)dr["name"];
- if (dr["sex"] != DBNull.Value) emp.Sex =(bool)dr["sex"];
- if(dr["age"]!=DBNull.Value) emp.Age = int.Parse(dr["age"].ToString());
- if(dr["birthday"]!=DBNull.Value) emp.BirthDay= (DateTime)dr["birthday"];
- }
- dr.Dispose();
- return emp;
- }
- public IEntity GetEntity(DataRow dr)
- {
- Employee emp = new Employee();
- emp.id = int.Parse(dr["id"].ToString());
- emp.Name = (string)dr["name"];
- if (dr["sex"] != DBNull.Value) emp.Sex = (bool)dr["sex"];
- if (dr["age"] != DBNull.Value) emp.Age = int.Parse(dr["age"].ToString());
- if (dr["birthday"] != DBNull.Value) emp.BirthDay = (DateTime)dr["birthday"];
- return emp;
- }
- public void SetSqlParameters(IStatement stmt, IEntity entity, bool isAddKey)
- {
- Employee emp = entity as Employee;
- stmt.AddParameter("@name", emp.Name);
- if (emp.Sex == null) stmt.AddParameter("@sex", DBNull.Value);
- else stmt.AddParameter("@sex", emp.Sex);
- if (emp.Age == null) stmt.AddParameter("@age", DBNull.Value);
- else stmt.AddParameter("@age", emp.Age);
- if (emp.BirthDay == null) stmt.AddParameter("@birthday", DBNull.Value);
- else stmt.AddParameter("@birthday", emp.BirthDay);
- if (isAddKey) stmt.AddParameter("@id", emp.Id);
- }
- public void SetOracleParameters(IStatement stmt, IEntity entity, bool isAddKey)
- {
- Employee emp = entity as Employee;
- stmt.AddParameter(":name", emp.name);
- stmt.AddParameter(":sex", emp.sex);
- stmt.AddParameter(":age", emp.age);
- if (isAddKey)
- stmt.AddParameter(":id", emp.id);
- }
- #endregion
- }
更详细的实体使用我会在后面文章中介绍。。。