我有一个处理与数据库通信的框架。它调用我的 SP(search、ins、del、upd)通过将对象的属性名称与参数名称匹配来自动填充参数。一切都很好,直到我得到一个只包含数字的字符串值,第一个数字为零。即使我的属性和 DB 列都是字符串,代码也会自动删除前导零。这是我的代码的一部分:
var property = from p in entityProperties
where p.Name.ToUpper().Equals(dvSchema[index][0].ToString().ToUpper())
select p;
object propertyNewValue;
if (property.First().PropertyType.BaseType != typeof(Enum))
propertyNewValue = dr[index];
...
property.First().SetValue(businessEntity, propertyNewValue, null);
我正在使用 .NET 3.5 和 SQL Server2008
有谁知道如何避免这种情况,希望除了添加一个 if 来检查属性类型是否为字符串?
提前致谢!
编辑
这是我的完整过程,我没有在任何地方明确地转换属性:
public virtual void MapEntityFromDataBase(BE businessEntity, IDataReader dr)
{
DataView dvSchema = dr.GetSchemaTable().DefaultView;
Type thisType = businessEntity.GetType();
while (thisType != typeof(Object))
{
PropertyInfo[] entityProperties = thisType.GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly);
for (int index = 0; index < dvSchema.Count; index++)
{
if (dr[index] != DBNull.Value)
{
var property = from p in entityProperties
where p.Name.ToUpper().Equals(dvSchema[index][0].ToString().ToUpper())
select p;
if (property.Count() > 0)
{
object propertyNewValue;
if (property.First().PropertyType.BaseType != typeof(Enum))
{
propertyNewValue = dr[index];
}
else //enums throw a cast exception
{
if (dr[index].GetType() == typeof(string) || dr[index].GetType() == typeof(char))
propertyNewValue = Enum.Parse(property.First().PropertyType, ((int)dr[index].ToString()[0]).ToString());
else
propertyNewValue = Enum.Parse(property.First().PropertyType, dr[index].ToString());
}
if (property.First().CanWrite)
{
if (property.First().PropertyType.IsGenericType && property.First().PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>))
{
Type[] typeCol = property.First().PropertyType.GetGenericArguments();
Type nullableType;
if (typeCol.Length > 0)
{
nullableType = typeCol[0];
if (nullableType.BaseType == typeof(Enum))
{
propertyNewValue = Enum.Parse(nullableType, propertyNewValue.ToString());
}
}
}
property.First().SetValue(businessEntity, propertyNewValue, null);
}
}
}
}
thisType = thisType.BaseType;
}
}
奇怪的是,当我到达属性设置语句时
property.First().SetValue(businessEntity, propertyNewValue, null);
propertyNewValue 的值为“091234”(如调试器所见)