为什么1/1/1900插入SQL?在某些情况下,它是否可以替代NULL?

时间:2016-12-05 21:31:01

标签: c# sql

我有一个传递了一个字符串的API,这个特定系统将其视为NULL“1/1/1900”。我已经看到other users插入了类似的值,其中SQL需要为null。我尝试了这个古怪的设置:

static void Main(string[] args)
{
    var input = "01/1/1900";//this does NOT evaluate to DBNull
    var result = IsBasicallyNull(input);
}

private static bool IsBasicallyNull(string input)
{
    if (String.IsNullOrWhiteSpace(input))
        return true;
    if (DBNull.Value.Equals(input))//THis doesn't work
        return true;

    //hack and slash
    DateTime output;
    var isValidDateTime = DateTime.TryParse(input, out output);

    if (isValidDateTime)
    {
        if (output == DateTime.MinValue)
            return true;
        else if (output.Year.ToString() == "1900" && output.Day.ToString() == "1" && output.Month.ToString() == "1")
            return true;
    }
    return false;
}

很明显,DBNull.Value并非构建为支持此"1/1/1900"(MM / DD / YYY)奇怪。在SQL中获取此值并将其视为NULL是否异常?你知道这个价值来自哪里吗?

3 个答案:

答案 0 :(得分:3)

过去我有一个类似的问题。某些类型为smalldatetime但未接受空值的列填充了Minumum Value of a smalldatetime字段。而这正好恰好是1/1/1900。

要考虑这些列,因为它们是空值,我以这种方式强制使用像你这样的代码

$.ajax({
    url: "http://127.0.0.1:8081/del_user",
    type: "DELETE"
});

答案 1 :(得分:0)

如果您想检查某个特殊日期的字符串表示,input,您永远无法与DBNull.Value进行比较,因为它完全不同。尝试与new DateTime( 1900, 1, 1 ).ToString()进行比较而不是。

答案 2 :(得分:0)

如果我理解您的意思,那么在空DateTime的情况下,您的API会插入1/1/1900。如果是这种情况,API也可能具有实现此功能的自定义对象。我刚刚处理了一个与此类似的案例。检查'null'的正确方法是将其强制转换回自定义对象,并使用提供的字段测试null。像这样:

if (CustomDateObject.Parse(input).IsDateTimeNull)
    return true;