我试图编写一个通用函数,用于在我的数据库的几个表中填充复合键。
不幸的是,我仅限于使用OleDbConnection
,因此无法利用SqlConnection
(及相关)类的许多细节。
作为此项工作的一部分,我需要能够将通用系统类型(始终为原始string
,int
等)转换为其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
只是最好的方法?
答案 0 :(得分:0)
在阅读评论并进行进一步研究后,似乎TypeMap
确实是最佳选择。
鉴于很多情况下,不同的数据库类型映射到同一个Type
(请参阅VarChar
和BStr
等),有许多不同的选项可供您选择将取决于您的数据库结构。
话虽如此,这是我提出的用于执行此映射的课程,对于任何希望将来尝试此操作的人来说,它应该是一个很好的起点。
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)));
这比以前更加整洁。