问题描述:
当数据库列类型有Money类型的时候,CodeSmith生成数据访问层会出错。有不能识别的类型。
解决方法:
通过查找资料得知,数据库中的Money类型在DbType中是Currency(货币类型),在C#中对应SqlDbType.Decimal。
①在
public string GetCSharpVariableType2(ColumnSchema column)
{
if (column.Name.EndsWith("TypeCode")) return column.Name;
switch (column.DataType)
{
case DbType.AnsiString: return "SqlDbType.VarChar";
case DbType.AnsiStringFixedLength: return "SqlDbType.VarChar";
case DbType.Binary: return "SqlDbType.Binary";
case DbType.Boolean: return "SqlDbType.Bit";
case DbType.Date: return "SqlDbType.DateTime";
case DbType.DateTime: return "SqlDbType.DateTime";
case DbType.Decimal: return "SqlDbType.Decimal";
case DbType.Double: return "SqlDbType.Decimal";
case DbType.Int16: return "SqlDbType.Int";
case DbType.Int32: return "SqlDbType.Int";
case DbType.Int64: return "SqlDbType.Float";
case DbType.String: return "SqlDbType.VarChar";
case DbType.StringFixedLength: return "SqlDbType.NChar";
case DbType.Currency: return "SqlDbType.Decimal";
default:
{
return "__UNKNOWN__" + column.NativeType;
}
}
}
中查找case DbType.Currency: return "SqlDbType.Decimal";
若没有,就加上;有则不管。
②在public string GetCode(ColumnSchema column)方法中,查找
case DbType.Decimal:
case DbType.Currency:
case DbType.Double:
{
sb.Append(" if (dr.Table.Columns.Contains(\""+column.Name+"\") && !dr.IsNull(\""+column.Name+"\"))\r\n");
sb.Append(" {\r\n");
sb.Append(" model."+GetPropertyNameUpperFirstSub_(column)+" = decimal.Parse(dr[\""+column.Name+"\"].ToString());\r\n");
sb.Append(" }\r\n");
break;
}
其中,若没有case DbType.Currency: 那就加上;有则不管。
谭家泉
2014年3月24日 15:19:04