使用IDataReader解决数据库差异的最佳实践

时间:2009-06-25 09:09:55

标签: c# database casting idatareader

我有一个简单的值对象,我用IDataReader中的数据填充(可能是查询到Oracle或MS SQL数据库的结果)。此对象的工厂方法如下所示:

internal static SomeClass CreateFromDataReader(IDataReader data)
{
    string message = data.GetString(0);
    short id = data.GetInt16(1);
    DateTime dateStamp = data.GetDateTime(2);
    return new SomeClass(message, id, dateStamp);
}

然后我遇到了一个问题,该问题与Oracle和MS SQL数据库用于该特定列的数据类型的差异有关:在Oracle中,数据类型是数字,而对于MS SQL,使用的数据类型是smallint。

现在,虽然我可以通过执行以下操作来“修复”此问题:

short id = Convert.ToInt16(data.GetValue(1));

有更好或更优雅的方式吗?

2 个答案:

答案 0 :(得分:1)

我不知道ORM如何处理这种情况。

但是,你应该使用一种能够适应这种场的两种(所有)情况的类型 我查看了this table&似乎decimal是你可以使用的合适的.net数据类型。

答案 1 :(得分:0)

你的想法是正确的。也许更短:

short id = Convert.ToInt16(data[1]); //8 characters less

或制作扩展方法。

public static short ToShort(this IDataReader r, int index)
{
    return Convert.ToInt16(r[index]);
}

现在你可以:

short id = data.ToShort(1); //18 characters less

:)