C# 验证空值转换

C# 验证空值转换,c#,C#,我有一个名为project的类,其中包含以下数据成员 class Project { private int Record_Num; private int GCD_ID; private string Project_Desc; private string Proponent_Name; private string Station_ID; private string OpCentre; private string Sector_I

我有一个名为project的类,其中包含以下数据成员

class Project
{
    private int Record_Num;
    private int GCD_ID;
    private string Project_Desc;
    private string Proponent_Name;
    private string Station_ID;
    private string OpCentre;
    private string Sector_ID;
    private string PLZone;
    private string Feeder_ID;
    private string DxTx_ID;
    private string OpControl_ID;
    private string Type_ID;
    private string ConnKV_ID;
    private string Status_ID;
    private double MW;
    private string Subject;
    private int Ip_Num;
    private int H1N_ID;
    private int NOMS_Slip_Num;
    private DateTime NMS_Updated;
    private DateTime Received_Date;
    private Nullable<DateTime> Actual_IS_Date;
    private string Scheduled_IS_Date;
    private string UP_Station_ID;
    private string UP_Feeder_ID;
    private string HV_Circuit;
}
我查询数据库并通过一个数据表检索值,该数据表将值分配给项目对象,如下所示

for (int prjIdx = 0; prjIdx < dt.Rows.Count; prjIdx++)
            {
                newProject = new Project(Convert.ToInt32(dt.Rows[prjIdx]["RecordNum"].ToString()), Convert.ToInt32(dt.Rows[prjIdx]["GCDID"].ToString()),
                    dt.Rows[prjIdx]["ProjectDesc"].ToString(), dt.Rows[prjIdx]["ProponentName"].ToString(),
                    dt.Rows[prjIdx]["StationName"].ToString(), dt.Rows[prjIdx]["OpCentre"].ToString(),
                    dt.Rows[prjIdx]["SectorName"].ToString(), dt.Rows[prjIdx]["PLZone"].ToString(),
                    dt.Rows[prjIdx]["FeederDesc"].ToString(), dt.Rows[prjIdx]["DxTx"].ToString(),
                    dt.Rows[prjIdx]["OpControl"].ToString(), dt.Rows[prjIdx]["Type"].ToString(),
                    dt.Rows[prjIdx]["ConnectionKV"].ToString(), dt.Rows[prjIdx]["Status"].ToString(),
                    Convert.ToDouble(dt.Rows[prjIdx]["MW"]), dt.Rows[prjIdx]["Subject"].ToString(),
                    Convert.ToInt32(dt.Rows[prjIdx]["IpNum"]), Convert.ToInt32(dt.Rows[prjIdx]["H1NID"]),
                    Convert.ToInt32(dt.Rows[prjIdx]["NomsSlipNum"]),Convert.ToDateTime(dt.Rows[prjIdx]["NmsUpdated"]),
                    Convert.ToDateTime(dt.Rows[prjIdx]["ReceivedDate"]),Convert.ToDateTime(dt.Rows[prjIdx]["ActualIsDate"]),
                    dt.Rows[prjIdx]["ScheduledIsDate"].ToString(),dt.Rows[prjIdx]["UpStation"].ToString(),dt.Rows[prjIdx]["UpFeeder"].ToString(),
                    dt.Rows[prjIdx]["HVCircuit"].ToString());

                newProject.record_num = Convert.ToInt32(dt.Rows[prjIdx]["RecordNum"]);
                projList.Add(newProject);

            }
现在我的问题是,从数据库检索到的所有日期时间值都可以为null。因此,如果遇到null值,它将无法转换,因此无法将其分配给对象。因此它给了我一个错误

我如何解决这个问题。 我是否应该将日期时间变量更改为字符串数据类型。但这是一个蹩脚的解决方案。请帮助//

DateTime是一种值类型,您可以使用可为空的DateTime DateTime吗

并在项目实例中这样使用它:

var receivedDate = dt.Rows[prjIdx]["ReceivedDate"];
var actualDate = dt.Rows[prjIdx]["ActualIsDate"];
newProject = new Project([...],
                       receivedDate.IsNull() ? null : Convert.ToDateTime(receivedDate),
                       actualDate.IsNull() ? null : Convert.ToDateTime(actualDate),
                       [...]);
DateTime是一种值类型,可以使用可为空的DateTime DateTime

并在项目实例中这样使用它:

var receivedDate = dt.Rows[prjIdx]["ReceivedDate"];
var actualDate = dt.Rows[prjIdx]["ActualIsDate"];
newProject = new Project([...],
                       receivedDate.IsNull() ? null : Convert.ToDateTime(receivedDate),
                       actualDate.IsNull() ? null : Convert.ToDateTime(actualDate),
                       [...]);

更改为nullable DateTime。

更改为nullable DateTime。

我喜欢保留这个实用程序类来处理DBNull值

public static class DBNullConvert
{
    public static T To<T>(object value, T defaultValue)
    {
        T cast;

        try
        {
            cast = value == DBNull.Value ? defaultValue : (T)value;
        }
        catch
        {
            throw new ArgumentException(string.Format("Argument of type {0} cannot be cast to type {1}", value.GetType(), typeof(T)), "value");
        }

        return cast;
    }

    public static T To<T>(object value)
    {
        return To(value, default(T));
    }

    public static T? ToNullable<T>(object value) where T : struct
    {
        T? cast;

        try
        {
            cast = value == DBNull.Value ? null : (T?)value;
        }
        catch
        {
            throw new ArgumentException(string.Format("Argument of type {0} cannot be cast to type {1}", value.GetType(), typeof(T?)), "value");
        }

        return cast;
    }

    public static string ToString(object value)
    {
        return To(value, String.Empty);
    }
}
然后你可以这样使用它:

DBNullConvert.ToNullable<DateTime>(dt.Rows[prjIdx]["ReceivedDate"])

如果字段为DBNull.Value,则返回null;如果有,则返回字段中存储的日期时间。

我希望保留此实用程序类以处理DBNull值

public static class DBNullConvert
{
    public static T To<T>(object value, T defaultValue)
    {
        T cast;

        try
        {
            cast = value == DBNull.Value ? defaultValue : (T)value;
        }
        catch
        {
            throw new ArgumentException(string.Format("Argument of type {0} cannot be cast to type {1}", value.GetType(), typeof(T)), "value");
        }

        return cast;
    }

    public static T To<T>(object value)
    {
        return To(value, default(T));
    }

    public static T? ToNullable<T>(object value) where T : struct
    {
        T? cast;

        try
        {
            cast = value == DBNull.Value ? null : (T?)value;
        }
        catch
        {
            throw new ArgumentException(string.Format("Argument of type {0} cannot be cast to type {1}", value.GetType(), typeof(T?)), "value");
        }

        return cast;
    }

    public static string ToString(object value)
    {
        return To(value, String.Empty);
    }
}
然后你可以这样使用它:

DBNullConvert.ToNullable<DateTime>(dt.Rows[prjIdx]["ReceivedDate"])

如果字段为DBNull.Value,则返回null;如果有,则返回字段中存储的日期时间。

如Dynamy所述,您可以使用

约会时间?这是一种可为空的日期类型


N.

如Dynamy所述,您可以使用

约会时间?这是一种可为空的日期类型


N.

每个人都已经说过,您可以在模型中使用可空类型。至于将它们从行中取出并检查DBNull,MS已经足够聪明地想到了这一点,并提供了一组扩展方法来实现这一点

只要您的底层类型实际上是一个int,那么就可以了

该方法不执行类型转换 转换。如果类型转换是 如果需要,您应首先获得 通过使用字段指定的列值 方法然后,列值应为 可以转换为其他类型


正如大家已经说过的,您可以在模型中使用可为null的类型。至于将它们从行中取出并检查DBNull,MS已经足够聪明地想到了这一点,并提供了一组扩展方法来实现这一点

只要您的底层类型实际上是一个int,那么就可以了

该方法不执行类型转换 转换。如果类型转换是 如果需要,您应首先获得 通过使用字段指定的列值 方法然后,列值应为 可以转换为其他类型


这是真的,他的最终对象应该具有可为null的属性来存储字段,但他仍然不能对这些字段使用Convert.ToDateTime,他必须显式地处理DBNull.Value.true,在这种情况下,我将添加一些关于这方面的详细信息。项目实例中的细微更改:NMS_Updated.IsNull?约会时间?null:Convert.ToDateTimeNMS\u Updated这是真的,他的最终对象应该有可为空的属性来存储字段,但他仍然不能在这些字段上使用Convert.ToDateTime,他必须显式地处理DBNull.Value。如果是真的,我将添加一些有关这方面的详细信息。项目实例中的细微更改:NMS\u Updated.IsNull?约会时间?null:Convert.ToDateTimeNMS\u UpdatedI曾为每个项目编写过类似的方法,但惊喜地发现MS提供了一组扩展方法来实现这一点。请参阅我的答案以了解详细信息:我曾经为每个项目编写过类似的方法,但当我惊喜地发现MS提供了一组扩展方法来实现这一点时,我感到非常惊讶。详见我的答案:我刚刚学到了两件事。我了解了字段扩展方法,并且在.NET3.5中,可以将可为null的类型传递到泛型中,这在.NET2.0中是不可能的,因此我的类有一个可为tonulable的方法。自从2.0以来我就没有使用过DataTables,我已经成为了一个ORM迷。不过,学点新东西还是不错的。希望你得到更多的选票,因为你有最好的答案。。。答案的另一半:我也成为了和ORM的瘾君子,所以我并没有真正使用这个,但它确实很棒。。。我可以在我的代码中实现它吗?对象关系映射器-谷歌它,你的脑袋会爆炸,但这是值得的。谷歌的一些框架:1 NHibernate 2亚音速3实体框架4 LINQ to SQLI刚刚学到了两件事。我了解了字段扩展方法,并且在.NET3.5中,可以将可为null的类型传递到泛型中,这在.NET2.0中是不可能的,因此我的类有一个可为tonulable的方法。自从2.0以来我就没有使用过DataTables,我已经成为了一个ORM迷。不过,学点新东西还是不错的。希望你得到更多的选票,因为你有最好的答案。。。答案的另一半:我也有
成为和ORM的瘾君子,所以我没有真正使用这个,但它是可怕的。我在哪里可以得到更多关于ORM的细节。。。我可以在我的代码中实现它吗?对象关系映射器-谷歌它,你的脑袋会爆炸,但这是值得的。谷歌的一些框架:1 NHibernate 2亚音速3实体框架4 LINQ to SQL