将SqlDbType转换为.net类型

时间:2018-08-03 14:50:23

标签: .net ado.net

有很多示例,我们如何从标准的:net类或实例转换SqlDbType枚举。我在互联网上找不到任何向后的解决方案。这似乎不那么常见,但应该(以我认为)更简单的方法,而不是对所有31个枚举成员进行大量转换。

有人知道如何以更好的方式将SqlDbType转换为.net Type,然后仅切换所有可能的枚举值吗?

感谢Tim Schmelter的评论。看来那只是解决方案。

1 个答案:

答案 0 :(得分:0)

.NET不包含此映射(并且SqlType也很烂),这确实很奇怪,但是“更好的方式”是键入枚举的字典。如果您的项目仅支持可用列类型的子集,这也使测试有效性变得容易。我维护了一个项目,该项目处理动态定义的SQL表布局。这样,我的图书馆用户就只需要考虑SqlDbType,而不必担心内部DataColumn的映射。

internal static readonly Dictionary<SqlDbType, Type> equivalentSystemType = new Dictionary<SqlDbType, Type>
{
    { SqlDbType.BigInt, typeof(long) },
    { SqlDbType.Binary, typeof(byte[]) },
    { SqlDbType.Bit, typeof(bool) },
    { SqlDbType.Char, typeof(string) },
    { SqlDbType.Date, typeof(DateTime) },
    { SqlDbType.DateTime, typeof(DateTime) },
    { SqlDbType.DateTime2, typeof(DateTime) }, // SQL2008+
    { SqlDbType.DateTimeOffset, typeof(DateTimeOffset) }, // SQL2008+
    { SqlDbType.Decimal, typeof(decimal) },
    { SqlDbType.Float, typeof(double) },
    { SqlDbType.Image, typeof(byte[]) },
    { SqlDbType.Int, typeof(int) },
    { SqlDbType.Money, typeof(decimal) },
    { SqlDbType.NChar, typeof(string) },
    { SqlDbType.NVarChar, typeof(string) },
    { SqlDbType.Real, typeof(float) },
    { SqlDbType.SmallDateTime, typeof(DateTime) },
    { SqlDbType.SmallInt, typeof(short) },
    { SqlDbType.SmallMoney, typeof(decimal) },
    { SqlDbType.Time, typeof(TimeSpan) }, // SQL2008+
    { SqlDbType.TinyInt, typeof(byte) },
    { SqlDbType.UniqueIdentifier, typeof(Guid) },
    { SqlDbType.VarBinary, typeof(byte[]) },
    { SqlDbType.VarChar, typeof(string) },
    { SqlDbType.Xml, typeof(SqlXml) }
    // omitted special types: timestamp
    // omitted deprecated types: ntext, text
    // not supported by enum: numeric, FILESTREAM, rowversion, sql_variant
};