📄 myormframework.cs
字号:
/*
简单的对象-数据库映射关系处理框架
编制 袁永福 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 + -