C#基础系列:实现自己的ORM(MiniORM的测试代码)
2008-11-17 15:11
806 查看
看到有同学反馈,说MiniORM代码有Bug,也不知道怎么用,所以今天我就写了些测试代码。希望能够给点帮助。
同时也发现了两Bug,一并罗列出:
1、MiniORM.PubFuncs.GetObjectType()函数:
public static Type GetObjectType(string assemblyname, string namespacename, string classname)
{
Type objType = (Type)_HashObjectType[assemblyname + namespacename + classname];
if (objType == null)
{
object obj = _HashObjectType[assemblyname + namespacename + classname];
obj = Assembly.Load(assemblyname).CreateInstance(namespacename + "." + classname);
_HashObjectType[assemblyname + namespacename + classname] = obj.GetType();
//需要增加这句
objType = (Type)_HashObjectType[assemblyname + namespacename + classname];
}
return objType;
}
2、MiniORM.OrmWriter.CheckValidate()函数:
public void CheckValidate(object ModelObject)
{
PropertyInfo[] infos = ModelObject.GetType().GetProperties();
object[] CustomerAttributes = null;
object[] CustomerAttributes1 = null;
//SELECT ID FROM TableName WHERE @A='' OR @B=''
string strSQL = "SELECT ID FROM {0} WHERE {1}";
string strTablename = PubFuncs.GetTableName(ModelObject);
string strWOA = "";
string strWHERE = "";
string strFieldMessage = "";
foreach (PropertyInfo info in infos)
{
CustomerAttributes = info.GetCustomAttributes(typeof(MiniORMAttribute.DataFieldNotDoubleAttribute), false);
CustomerAttributes1 = info.GetCustomAttributes(typeof(MiniORMAttribute.DataFieldAttribute), false);
if (CustomerAttributes != null && CustomerAttributes1 != null)
{
for (int i = 0; i < CustomerAttributes.Length; i++)
{
strWHERE += strWOA + ((MiniORMAttribute.DataFieldAttribute)CustomerAttributes1[0]).FieldName + "='" + info.GetValue(ModelObject, null) + "'";
strFieldMessage += ((MiniORMAttribute.DataFieldAttribute)CustomerAttributes1[0]).FieldName;
strWOA = " OR ";
}
}
}
//这里需要做strWHERE不为空的判断
if (strWHERE.Trim() != "")
{
strSQL = string.Format(strSQL, new string[] { strTablename, strWHERE });
using (SqlConnection conn = new SqlConnection(PubFuncs.ConnectionStr))
{
conn.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandType = CommandType.Text;
cmd.CommandText = strSQL;
using (SqlDataReader rdr = cmd.ExecuteReader())
{
if (rdr.Read())
{
throw new Exception("下列字段值不能重复:" + strFieldMessage);
}
}
}
}
}
测试代码如下:
首先是类关系图:
数据库表:
Person表:
Hand表:
Head表:
测试代码如下:
下面是类代码:
[DataObjectAttribute("Person", "ID", "")]
public class Person
{
private int _ID;
private string _Name;
private int _Age;
private string _Sex;
private Head _Head;
private Hand _LeftHand;
private Hand _RightHand;
[DataFieldAttribute("ID", true)]
public int ID
{
get { return _ID; }
set { _ID = value; }
}
[SubDataObjectAttribute(SubDataObjectFieldType.Object, "MiniORM", "MiniORM", "Head")]
public Head Head
{
get { return _Head; }
set { _Head = value; }
}
[SubDataObjectAttribute(SubDataObjectFieldType.Object, "MiniORM", "MiniORM", "Hand")]
public Hand LeftHand
{
get { return _LeftHand; }
set { _LeftHand = value; }
}
[SubDataObjectAttribute(SubDataObjectFieldType.Object, "MiniORM", "MiniORM", "Hand")]
public Hand RightHand
{
get { return _RightHand; }
set { _RightHand = value; }
}
[DataFieldAttribute("name", "NvarChar")]
public string Name
{
get { return this._Name; }
set { this._Name = value; }
}
[DataFieldAttribute("age", "int")]
public int Age
{
get { return this._Age; }
set { this._Age = value; }
}
[DataFieldAttribute("sex", "NvarChar")]
public string Sex
{
get { return this._Sex; }
set { this._Sex = value; }
}
public Hand Hand
{
get
{
throw new System.NotImplementedException();
}
set
{
}
}
public Head Head1
{
get
{
throw new System.NotImplementedException();
}
set
{
}
}
}
[DataObjectAttribute("Hand", "ID", "PersonID")]
public class Hand
{
private int _ID;
private int _PersonID;
private string _Name;
[DataFieldAttribute("ID", true)]
public int ID
{
get { return this._ID; }
set { this._ID = value; }
}
[DataFieldAttribute("PersonID")]
public int PersonID
{
get { return this._PersonID; }
set { this._PersonID = value; }
}
[DataFieldAttribute("name", "NvarChar")]
public string Name
{
get { return _Name; }
set { _Name = value; }
}
}
[DataObjectAttribute("Head", "ID", "PersonID")]
public class Head
{
private int _ID;
private int _PersonID;
private string _Name;
[DataFieldAttribute("ID", true)]
public int ID
{
get { return this._ID; }
set { this._ID = value; }
}
[DataFieldAttribute("PersonID")]
public int PersonID
{
get { return this._PersonID; }
set { this._PersonID = value; }
}
[DataFieldAttribute("name", "NvarChar")]
public string Name
{
get { return _Name; }
set { _Name = value; }
}
}
下面是测试代码:
[STAThread]
static void Main()
{
//插入测试
WriteTest();
//读取测试
ReadTest();
}
private static void WriteTest()
{
Person person = new Person();
person.Name = "snoopy";
person.Age = 5;
person.Sex = "male";
Hand lefthand = new Hand();
lefthand.Name = "左手";
Hand righthand = new Hand();
righthand.Name = "右手";
Head head = new Head();
head.Name = "大笨脑袋";
person.LeftHand = lefthand;
person.RightHand = righthand;
person.Head = head;
MiniORM.OrmWriter write = new OrmWriter();
write.Write(person);
}
private static void ReadTest()
{
MiniORM.OrmReader reader = new OrmReader();
Person person = (Person)reader.Read(new Person(), 1);
Console.WriteLine("person.Name:" + person.Name);
Console.WriteLine("person.Age:" + person.Age);
Console.WriteLine("person.Sex:" + person.Sex);
Console.WriteLine("LeftHand.Name:" + person.LeftHand.Name);
Console.WriteLine("RightHand.Name:" + person.RightHand.Name);
Console.WriteLine("Head.Name:" + person.Head.Name);
Console.Read();
}
ReadTest的测试结果如:
好了,各位,你可以使用这个调试代码来试试了。。。
同时也发现了两Bug,一并罗列出:
1、MiniORM.PubFuncs.GetObjectType()函数:
public static Type GetObjectType(string assemblyname, string namespacename, string classname)
{
Type objType = (Type)_HashObjectType[assemblyname + namespacename + classname];
if (objType == null)
{
object obj = _HashObjectType[assemblyname + namespacename + classname];
obj = Assembly.Load(assemblyname).CreateInstance(namespacename + "." + classname);
_HashObjectType[assemblyname + namespacename + classname] = obj.GetType();
//需要增加这句
objType = (Type)_HashObjectType[assemblyname + namespacename + classname];
}
return objType;
}
2、MiniORM.OrmWriter.CheckValidate()函数:
public void CheckValidate(object ModelObject)
{
PropertyInfo[] infos = ModelObject.GetType().GetProperties();
object[] CustomerAttributes = null;
object[] CustomerAttributes1 = null;
//SELECT ID FROM TableName WHERE @A='' OR @B=''
string strSQL = "SELECT ID FROM {0} WHERE {1}";
string strTablename = PubFuncs.GetTableName(ModelObject);
string strWOA = "";
string strWHERE = "";
string strFieldMessage = "";
foreach (PropertyInfo info in infos)
{
CustomerAttributes = info.GetCustomAttributes(typeof(MiniORMAttribute.DataFieldNotDoubleAttribute), false);
CustomerAttributes1 = info.GetCustomAttributes(typeof(MiniORMAttribute.DataFieldAttribute), false);
if (CustomerAttributes != null && CustomerAttributes1 != null)
{
for (int i = 0; i < CustomerAttributes.Length; i++)
{
strWHERE += strWOA + ((MiniORMAttribute.DataFieldAttribute)CustomerAttributes1[0]).FieldName + "='" + info.GetValue(ModelObject, null) + "'";
strFieldMessage += ((MiniORMAttribute.DataFieldAttribute)CustomerAttributes1[0]).FieldName;
strWOA = " OR ";
}
}
}
//这里需要做strWHERE不为空的判断
if (strWHERE.Trim() != "")
{
strSQL = string.Format(strSQL, new string[] { strTablename, strWHERE });
using (SqlConnection conn = new SqlConnection(PubFuncs.ConnectionStr))
{
conn.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandType = CommandType.Text;
cmd.CommandText = strSQL;
using (SqlDataReader rdr = cmd.ExecuteReader())
{
if (rdr.Read())
{
throw new Exception("下列字段值不能重复:" + strFieldMessage);
}
}
}
}
}
测试代码如下:
首先是类关系图:
数据库表:
Person表:
Hand表:
Head表:
测试代码如下:
下面是类代码:
[DataObjectAttribute("Person", "ID", "")]
public class Person
{
private int _ID;
private string _Name;
private int _Age;
private string _Sex;
private Head _Head;
private Hand _LeftHand;
private Hand _RightHand;
[DataFieldAttribute("ID", true)]
public int ID
{
get { return _ID; }
set { _ID = value; }
}
[SubDataObjectAttribute(SubDataObjectFieldType.Object, "MiniORM", "MiniORM", "Head")]
public Head Head
{
get { return _Head; }
set { _Head = value; }
}
[SubDataObjectAttribute(SubDataObjectFieldType.Object, "MiniORM", "MiniORM", "Hand")]
public Hand LeftHand
{
get { return _LeftHand; }
set { _LeftHand = value; }
}
[SubDataObjectAttribute(SubDataObjectFieldType.Object, "MiniORM", "MiniORM", "Hand")]
public Hand RightHand
{
get { return _RightHand; }
set { _RightHand = value; }
}
[DataFieldAttribute("name", "NvarChar")]
public string Name
{
get { return this._Name; }
set { this._Name = value; }
}
[DataFieldAttribute("age", "int")]
public int Age
{
get { return this._Age; }
set { this._Age = value; }
}
[DataFieldAttribute("sex", "NvarChar")]
public string Sex
{
get { return this._Sex; }
set { this._Sex = value; }
}
public Hand Hand
{
get
{
throw new System.NotImplementedException();
}
set
{
}
}
public Head Head1
{
get
{
throw new System.NotImplementedException();
}
set
{
}
}
}
[DataObjectAttribute("Hand", "ID", "PersonID")]
public class Hand
{
private int _ID;
private int _PersonID;
private string _Name;
[DataFieldAttribute("ID", true)]
public int ID
{
get { return this._ID; }
set { this._ID = value; }
}
[DataFieldAttribute("PersonID")]
public int PersonID
{
get { return this._PersonID; }
set { this._PersonID = value; }
}
[DataFieldAttribute("name", "NvarChar")]
public string Name
{
get { return _Name; }
set { _Name = value; }
}
}
[DataObjectAttribute("Head", "ID", "PersonID")]
public class Head
{
private int _ID;
private int _PersonID;
private string _Name;
[DataFieldAttribute("ID", true)]
public int ID
{
get { return this._ID; }
set { this._ID = value; }
}
[DataFieldAttribute("PersonID")]
public int PersonID
{
get { return this._PersonID; }
set { this._PersonID = value; }
}
[DataFieldAttribute("name", "NvarChar")]
public string Name
{
get { return _Name; }
set { _Name = value; }
}
}
下面是测试代码:
[STAThread]
static void Main()
{
//插入测试
WriteTest();
//读取测试
ReadTest();
}
private static void WriteTest()
{
Person person = new Person();
person.Name = "snoopy";
person.Age = 5;
person.Sex = "male";
Hand lefthand = new Hand();
lefthand.Name = "左手";
Hand righthand = new Hand();
righthand.Name = "右手";
Head head = new Head();
head.Name = "大笨脑袋";
person.LeftHand = lefthand;
person.RightHand = righthand;
person.Head = head;
MiniORM.OrmWriter write = new OrmWriter();
write.Write(person);
}
private static void ReadTest()
{
MiniORM.OrmReader reader = new OrmReader();
Person person = (Person)reader.Read(new Person(), 1);
Console.WriteLine("person.Name:" + person.Name);
Console.WriteLine("person.Age:" + person.Age);
Console.WriteLine("person.Sex:" + person.Sex);
Console.WriteLine("LeftHand.Name:" + person.LeftHand.Name);
Console.WriteLine("RightHand.Name:" + person.RightHand.Name);
Console.WriteLine("Head.Name:" + person.Head.Name);
Console.Read();
}
ReadTest的测试结果如:
好了,各位,你可以使用这个调试代码来试试了。。。
相关文章推荐
- C#基础系列:实现自己的ORM(MiniORM的测试代码)
- C#基础系列:实现自己的ORM(MiniORM的测试代码)
- C#基础系列1:实现自己的ORM…
- C#基础系列:实现自己的ORM(反射以及Attribute在ORM中的应用)
- C#基础系列:实现自己的ORM(反射以及Attribute在ORM中的应用)
- C#基础系列:实现自己的ORM(ORM的基础概念)
- C#基础系列:实现自己的ORM(反射以及Attribute在ORM中的应用)
- C#基础系列:实现自己的ORM(反射以及Attribute在ORM中的应用)
- C#基础系列:实现自己的ORM(构造我自己的ORM)
- C#基础系列:实现自己的ORM(构造我自己的ORM)
- C#基础系列:实现自己的ORM(ORM的基础概念)
- C#基础系列:实现自己的ORM(构造我自己的ORM)
- C#基础系列3:实现自己的ORM…
- C#基础系列:实现自己的ORM(ORM的基础概念)
- C#基础系列:开发自己的窗体设计器(实现控件的选择)
- C#基础系列:开发自己的窗体设计器(实现控件的拖动)
- C#基础系列:开发自己的窗体设计器(实现控件的选择)
- C#基础系列:开发自己的窗体设计器(实现控件的拖动)
- C#基础系列:开发自己的窗体设计器(实现控件的拖动)
- 曾今的代码系列——自己的分页控件+存储过程实现分页