【问题标题】:Converting primitive Type to OleDbType Enum将原始类型转换为 OleDbType 枚举
【发布时间】:2017-09-11 10:34:11
【问题描述】:

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

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

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

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

我目前使用这种方法的尝试如下所示:

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

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

【问题讨论】:

  • ((int)DbType.Date)==((int)OleDbType.Double) 所以你是正确的,使用你当前的代码会有问题。我认为没有内置函数,因为首选映射可能取决于您要连接的特定数据库,而这些枚举与数据库无关。

标签: c# database ms-access enums oledb


【解决方案1】:

阅读 cmets 并进行进一步研究后,TypeMap 似乎确实是最好的选择。

鉴于在很多情况下不同的 DB 类型映射到相同的 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)));

比以前整洁多了。

【讨论】:

  • 考虑使用 OleDbType.VarWChar 来支持字符串类型的 Unicode(实际上你应该这样做)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-21
  • 2010-12-21
  • 2012-09-30
  • 1970-01-01
  • 2010-10-11
相关资源
最近更新 更多