C# 取消绑定数据库值的正确方法

C# 取消绑定数据库值的正确方法,c#,database,unboxing,C#,Database,Unboxing,我正在使用一个较旧的Oracle数据库,我觉得有一种更好的方法可以取消绑定从数据库检索到的值 目前,我有一个静态类,其中包含各种类型特定的方法: public static int? Int(object o) { try { return (int?)Convert.ToInt32(o); } catch (Exception) { return null; } } …等等,但我觉得应该有更好的方法?如果我想取消一

我正在使用一个较旧的Oracle数据库,我觉得有一种更好的方法可以取消绑定从数据库检索到的值

目前,我有一个静态类,其中包含各种类型特定的方法:

public static int? Int(object o)
{
    try
    {
        return (int?)Convert.ToInt32(o);
    }
    catch (Exception)
    {
        return null;
    }
}
…等等,但我觉得应该有更好的方法?如果我想取消一个值的装箱,我会按照

inti;
i=nvl.Int(数据行[“列])//在本例中,“列”是数字数据库类型

我曾想过使用泛型类来处理所有不同的类型,但我真的不知道最好的方法


有什么想法吗?

我发现以下帮助方法在您的场景中很有用-测试DBNull比捕获异常(如示例中所示)更有效:

public static MyHelper
{
    public static Nullable<T> ToNullable<T>(object value) where T : struct
    {
        if (value == null) return null;
        if (Convert.IsDBNull(value)) return null;
        return (T) value;
    }

    public static string ToString(object value)
    {
        if (value == null) return null;
        if (Convert.IsDBNull(value)) return null;
        return (string)value;
    }
}
publicstaticmyhelper
{
公共静态可空Tonulable(对象值),其中T:struct
{
if(value==null)返回null;
if(Convert.IsDBNull(value))返回null;
返回(T)值;
}
公共静态字符串ToString(对象值)
{
if(value==null)返回null;
if(Convert.IsDBNull(value))返回null;
返回(字符串)值;
}
}
这适用于字符串和常见的基本值类型(int、decimal、double、bool、DateTime)

它与您的示例稍有不同,它是强制转换而不是转换,但我个人更喜欢这样。也就是说,如果数据库列是数字(十进制),如果要将值转换为int,我宁愿显式,例如:

int? myIntValue = (int?) MyHelper.ToNullable<decimal>(reader["MyNumericColumn"]);
int?myIntValue=(int?)MyHelper.tonulable(读卡器[“MyNumericColumn]”);

您可以引入简单的模型类并在它们之间映射

例如:

public class Customer
{
   public Customer(DataRow row) 
   {
      Name = row["Name"];
   }
   public Name { get; private set; }
}
当然,为了减少重复代码,可以为模型数据类创建基类


根据您想要花费的精力,您可以使用ORM映射器NHibernate。

太好了,乔,谢谢。很抱歉我的无知,但我不太清楚第一行:publicstaticnullabletonnullable(objectvalue),其中T:struct,尤其是“Nullable”,后面是“ToNullable”部分。这是创建类/方法的简写方法吗?这是一个方法声明:为了更清楚,我在示例中添加了一个类声明(类MyHelper)。“Nullable”是方法的返回类型,“ToNullable”是方法的名称。您可以将“T”替换为任何类型,因为它必须是值类型或结构(其中T:struct)。因此,如果使用类型decimal(ToNullable)调用该方法,则返回类型将为null,即“decimal?”。希望这更清楚一点。啊,我对你使用的“可空”类不太熟悉。谢谢乔。我很感激。
public class Customer
{
   public Customer(DataRow row) 
   {
      Name = row["Name"];
   }
   public Name { get; private set; }
}