⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 myormframework.cs

📁 一个快速的数据库访问框架。可根据需要灵活的扩展。
💻 CS
📖 第 1 页 / 共 3 页
字号:
/*
 
	简单的对象-数据库映射关系处理框架
	
    编制 袁永福 2008-6-3

*/
using System;

namespace MyORM
{
	/// <summary>
	/// 数据表名绑定特性
	/// </summary>
	/// <remarks>
	/// 本特性用于标记某个类型映射到指定名称的数据表上。可以指定数据表名,
	/// 若不指定数据表名则认为类型的名称就是绑定的数据表名。
	/// 本特许只能用于class 类型上面,不能用于其它类型。
	/// </remarks>
	[System.AttributeUsage( System.AttributeTargets.Class , AllowMultiple = false ) ]
	public class BindTableAttribute : System.Attribute
	{
		/// <summary>
		/// 初始化对象
		/// </summary>
		public BindTableAttribute( )
		{
		}

		/// <summary>
		/// 初始化对象
		/// </summary>
		/// <param name="name">数据表名</param>
		public BindTableAttribute( string name )
		{
			strName = name ;
		}

		private string strName = null;
		/// <summary>
		/// 数据表名
		/// </summary>
		public string Name
		{
			get
			{
				return strName ;
			}
		}
	}//public class BindTableAttribute : System.Attribute

	/// <summary>
	/// 数据字段名绑定信息
	/// </summary>
	/// <remarks>
	/// 本特性用于标记某个属性映射到指定名称的字段上,可以指定字段名,
	/// 若不指定则认为属性的名称就是影射的字段名。
	/// 本特性只能用于公开属性上面,不能用于其它类型成员或类型声明上面。
	/// </remarks>
	[System.AttributeUsage( System.AttributeTargets.Property , AllowMultiple = false ) ]
	public class BindFieldAttribute : System.Attribute
	{
		/// <summary>
		/// 初始化对象
		/// </summary>
		public BindFieldAttribute( )
		{
		}

		/// <summary>
		/// 初始化对象
		/// </summary>
		/// <param name="name">字段名</param>
		public BindFieldAttribute( string name )
		{
			strName = name ;
		}

		private string strName = null;
		/// <summary>
		/// 数据字段名
		/// </summary>
		public string Name
		{
			get
			{
				return strName ;
			}
		}

		private bool bolKey = false;
		/// <summary>
		/// 该字段为关键字段,可用作查询条件
		/// </summary>
		/// <remarks>
		/// 框架程序在修改和删除对象时,对象类型必须至少有一个属性标记为Key = true .
		/// </remarks>
		public bool Key
		{
			get
			{
				return bolKey ;
			}
			set
			{
				bolKey = value;
			}
		}

		private string strReadFormat = null;
		/// <summary>
		/// 数据读取格式化字符串
		/// </summary>
		/// <remarks>
		/// 本属性用于指定数据库中的数据存储格式,比如数据库中保存的是类似"20080603"
		/// 这样的表示日期数据的格式为"yyyyMMdd"的字符串。此时设置对象属性的ReadFormat
		/// 格式为"yyyyMMdd",并且对象属性的数据类型为DateTime类型。则框架读取数据时会
		/// 尝试使用"yyyyMMdd"格式解析读取的原始数据为一个日期数据并设置到对象属性值。
		/// </remarks>
		public string ReadFormat
		{
			get
			{
				return strReadFormat ;
			}
			set
			{
				strReadFormat = value ;
			}
		}

		private string strWriteFormat = null;
		/// <summary>
		/// 数据存储格式化字符串
		/// </summary>
		/// <remarks>
		/// 本属性用于指定对象属性值保存到数据库中的格式,比如对象属性数据类型为DateTime,
		/// 而数据库中保存的是类似"20080603"这样的表示日期数据的格式为"yyyyMMdd"的字符串。
		/// 此时设置对象属性的WriteFormat格式为"yyyyMMdd",则框架保存数据时会尝试使用
		/// "yyyyMMdd"格式将对象属性值进行格式化,将转化结果保存到数据库中。
		/// </remarks>
		public string WriteFormat
		{
			get
			{
				return strWriteFormat ;
			}
			set
			{
				strWriteFormat = value;
			}
		}
	}//public class BindFieldAttribute : System.Attribute

	/// <summary>
	/// 我的对象-数据库映射关系处理框架
	/// </summary>
	/// <remarks>
	/// 本对象为一个轻量级的对象-数据库映射关系处理框架,能根据编程对象向
	/// 数据库进行简单的查询,新增,修改和删除数据库记录。本框架处理的数据库
	/// 映射类型都必须使用 BindTableAttribute 和 BindFieldAttribute 进行标记。
	/// </remarks>
	public class MyORMFramework : System.IDisposable
	{
		/// <summary>
		/// 初始化对象
		/// </summary>
		public MyORMFramework()
		{
		}

		/// <summary>
		/// 初始化对象
		/// </summary>
		/// <param name="conn">数据库连接对象,该对象必须已经打开</param>
		public MyORMFramework( System.Data.IDbConnection conn )
		{
			myConnection = conn ;
		}
		
		private System.Data.IDbConnection myConnection = null;
		/// <summary>
		/// 对象使用的数据库连接对象,该对象必须已经打开。
		/// </summary>
		public System.Data.IDbConnection Connection
		{
			get
			{
				return myConnection ;
			}
			set
			{
				myConnection = value;
			}
		}
	
		/// <summary>
		/// 判断数据库中是否存在指定的对象
		/// </summary>
		/// <param name="obj">对象</param>
		/// <returns>true:数据库中存在指定关键字的记录 false:数据库中不存在指定关键字的记录</returns>
		public bool Contains( object obj )
		{
			if( obj == null )
			{
				throw new ArgumentNullException("obj");
			}
			this.CheckBindInfo( obj.GetType() , true );
			this.CheckConnetion();
			TableBindInfo table = this.GetBindInfo( obj.GetType());
			System.Collections.ArrayList values = new System.Collections.ArrayList();
			string strSQL = this.BuildCondition( obj , values );
			bool result = false;
			if( strSQL != null )
			{
				using( System.Data.IDbCommand cmd = myConnection.CreateCommand())
				{
					strSQL = "Select 1 from " + FixTableName( table.TableName ) + " Where " + strSQL ;
					cmd.CommandText = strSQL ;
					foreach( object v in values )
					{
						System.Data.IDbDataParameter p = cmd.CreateParameter();
						p.Value = v ;
						cmd.Parameters.Add( p );
					}
					object v2 = cmd.ExecuteScalar();
					if( v2 != null && DBNull.Value.Equals( v2 ) == false )
					{
						result = ( Convert.ToInt32( v2 ) == 1 );
					}
				}
			}
			return false;
		}

		#region 更新数据库记录的接口 ******************************************

		/// <summary>
		/// 更新一个对象
		/// </summary>
		/// <param name="obj">要更新的对象</param>
		/// <returns>更新修改的数据库记录个数</returns>
		public int UpdateObject( object obj )
		{
			if( obj == null )
			{
				throw new ArgumentNullException("obj");
			}
			this.CheckBindInfo( obj.GetType() , true );
			this.CheckConnetion();
			return UpdateObjects( new object[]{ obj } );
		}

		/// <summary>
		/// 更新多个对象
		/// </summary>
		/// <param name="Objects">对象列表</param>
		/// <returns>更新修改的数据库记录个数</returns>
		public int UpdateObjects( System.Collections.IEnumerable Objects )
		{
			if( Objects == null )
			{
				throw new ArgumentNullException("Objects");
			}
			this.CheckBindInfo( Objects , true );
			this.CheckConnetion();
			int RecordCount = 0 ;
			using( System.Data.IDbCommand cmd = myConnection.CreateCommand())
			{
				foreach( object obj in Objects )
				{
					TableBindInfo table = this.GetBindInfo( obj.GetType());
					// 拼凑生成SQL更新语句
					System.Collections.ArrayList values = new System.Collections.ArrayList();
					System.Text.StringBuilder myStr = new System.Text.StringBuilder();
					foreach( FieldBindInfo field in table.Fields )
					{
						object v = field.Property.GetValue( obj , null );
						if( myStr.Length > 0 )
						{
							myStr.Append(" , " + System.Environment.NewLine );
						}
						myStr.Append( FixFieldName( field.FieldName ) + " = ? " );
						values.Add( field.ToDataBase( v ));
					}
					myStr.Insert( 0 , "Update " + FixTableName( table.TableName ) + " Set " );
					string strSQL = BuildCondition( obj , values );
					myStr.Append( " Where " + strSQL );
					strSQL = myStr.ToString();
					// 设置SQL命令对象,填充参数
					cmd.Parameters.Clear();
					cmd.CommandText = strSQL ;
					foreach( object v in values )
					{
						System.Data.IDbDataParameter p = cmd.CreateParameter();
						cmd.Parameters.Add( p );
						p.Value = v ;
					}

					RecordCount += cmd.ExecuteNonQuery();
				}//foreach
			}//using
			return RecordCount ;
		}

		#endregion 

		#region 删除数据库记录的接口 ******************************************

		/// <summary>
		/// 删除一个对象记录
		/// </summary>
		/// <param name="obj">要删除的对象</param>
		/// <returns>删除的数据库记录个数</returns>
		public int DeleteObject( object obj )
		{
			if( obj == null )
			{
				throw new ArgumentNullException("obj");
			}
			this.CheckBindInfo( obj.GetType() , true );
			return DeleteObjects( new object[]{ obj } );
		}

		/// <summary>
		/// 删除若干条对象的数据
		/// </summary>
		/// <param name="Objects">对象列表</param>
		/// <returns>删除的记录个数</returns>
		public int DeleteObjects( System.Collections.IEnumerable Objects )
		{
			if( Objects == null )
			{
				throw new ArgumentNullException("Objects");
			}
			this.CheckBindInfo( Objects , true );
			this.CheckConnetion();
			int RecordCount = 0 ;
			using( System.Data.IDbCommand cmd = myConnection.CreateCommand())
			{
				foreach( object obj in Objects )
				{
					TableBindInfo table = this.GetBindInfo( obj.GetType() );
					// 拼凑SQL语句
					System.Collections.ArrayList values = new System.Collections.ArrayList();
					string strSQL = BuildCondition( obj , values );
					strSQL = "Delete From " + FixTableName( table.TableName ) + " Where " + strSQL ;

					// 设置SQL命令对象
					cmd.Parameters.Clear();
					cmd.CommandText = strSQL ;
					foreach( object v in values )
					{
						System.Data.IDbDataParameter p = cmd.CreateParameter();
						p.Value = v ;
						cmd.Parameters.Add( p );
					}
					// 执行SQL,删除记录
					RecordCount += cmd.ExecuteNonQuery();
				}
			}
			return RecordCount ;
		}

		#endregion

		#region 查询数据库记录的接口 ******************************************

		/// <summary>
		/// 读取指定类型的所有的对象
		/// </summary>
		/// <param name="ObjectType">记录对象类型</param>
		/// <returns>读取的记录对象数组</returns>
		public object[] ReadAllObjects( Type ObjectType )
		{
			if( ObjectType == null )
			{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -