您的位置:首页 > 编程语言 > C#

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的测试结果如:



好了,各位,你可以使用这个调试代码来试试了。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: