将原始类型转换为OleDbType枚举

时间:2017-09-11 10:34:12

标签: c# database ms-access enums oledb

我试图编写一个通用函数,用于在我的数据库的几个表中填充复合键。

不幸的是,我仅限于使用OleDbConnection,因此无法利用SqlConnection(及相关)类的许多细节。

作为此项工作的一部分,我需要能够将通用系统类型(始终为原始stringint等)转换为其OleDbType枚举对象。

我查看了this question,其中有几条建议:主要是使用类地图。这种方法可以正常工作,但是我很奇怪,没有预先构建和预先测试的.NET Framework组件可以比我编写的任何代码都更好地完成这项工作。我也不喜欢重新发明轮子。建议的第二种方法是在Parameter.ConvertTypeToDbType命名空间中使用System.Web方法(一个愚蠢的地方把它放到恕我直言,但我离题了)。这似乎工作正常,它会产生DbType枚举,而不是OleDbType,我担心这可能导致兼容性问题。

我目前尝试使用这种方法看起来像这样:

OleDbParameter searchValueOne = new OleDbParameter("@searchValueOne", System.Web.UI.WebControls.Parameter.ConvertTypeCodeToDbType(Type.GetTypeCode(typeof(T1))));

所以我的问题是,是否有一个类似的内置函数提供OleDbType而不是DbType或者TypeMap只是最好的方法?

1 个答案:

答案 0 :(得分:0)

在阅读评论并进行进一步研究后,似乎TypeMap确实是最佳选择。

鉴于很多情况下,不同的数据库类型映射到同一个Type(请参阅VarCharBStr等),有许多不同的选项可供您选择将取决于您的数据库结构。

话虽如此,这是我提出的用于执行此映射的课程,对于任何希望将来尝试此操作的人来说,它应该是一个很好的起点。

static class OleDbTypeMap
{
    private static readonly Dictionary<Type,OleDbType> TypeMap = new Dictionary<Type, OleDbType> {
        {typeof(string), OleDbType.VarChar },
        {typeof(long), OleDbType.BigInt },
        {typeof(byte[]), OleDbType.Binary },
        {typeof(bool), OleDbType.Boolean },
        {typeof(decimal), OleDbType.Decimal },
        {typeof(DateTime), OleDbType.Date },
        {typeof(TimeSpan), OleDbType.DBTime },
        {typeof(double), OleDbType.Double },
        {typeof(Exception),OleDbType.Error },
        {typeof(Guid), OleDbType.Guid },
        {typeof(int), OleDbType.Integer },
        {typeof(float), OleDbType.Single },
        {typeof(short), OleDbType.SmallInt },
        {typeof(sbyte), OleDbType.TinyInt },
        {typeof(ulong), OleDbType.UnsignedBigInt },
        {typeof(uint), OleDbType.UnsignedInt },
        {typeof(ushort), OleDbType.UnsignedSmallInt },
        {typeof(byte), OleDbType.UnsignedTinyInt }
    };
    public static OleDbType GetType(Type type) => TypeMap[type];
}

这可以通过GetType(OleDbType type)重载来修改,该重载访问包含第一个反转的不同字典以使其成为双向的,但是,我不需要此功能,所以我自己没有实现它。

我的OleDbParameter行现在看起来像这样:

OleDbParameter searchValueOne = new OleDbParameter("@searchValueOne", OleDbTypeMap.GetType(typeof(T1)));

这比以前更加整洁。

相关问题