You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用C#和SQL插入数据时日期列空值报错求助

Fixing "Cannot Insert Null for Date" & 01/01/1900 Auto-Fill Issue in C# & SQL

Hey there, let's work through this date insertion problem you're hitting. The root of the issue boils down to how C# handles DateTime values and how your SQL table is configured. Here's how to fix it step by step:

1. Check Your SQL Table Column Configuration

First, confirm if your datetime column is set to allow nulls. If it's currently datetime NOT NULL, SQL will reject any attempt to insert a null value—and if you're accidentally passing C#'s default DateTime value (which is 01/01/1900), that's why you see that date getting saved instead.

To fix this (if your business logic allows empty dates), alter your table to make the column nullable:

ALTER TABLE YourTableName
ALTER COLUMN YourDateColumn datetime NULL;

2. Update Your C# Model to Use Nullable DateTime

In your Education class, change the date property from a non-nullable DateTime to a nullable DateTime? (also called Nullable<DateTime>). This lets the property hold a null value instead of defaulting to 01/01/1900 when no date is provided:

public class Education
{
    // Other existing properties...
    public DateTime? Education_Date { get; set; } // Switch to nullable DateTime
}

3. Handle Null Values in Your Dictionary Parameter

When building your Dictionary<string, object> for the SQL command, you need to map a null DateTime? to DBNull.Value (since SQL doesn't recognize C#'s null directly). Here's how to adjust your code:

[HttpPost]
public HttpResponseMessage save(Education edu)
{
    Dictionary<string, object> xmt = new Dictionary<string, object>();
    xmt.Add("@Staff_Key", edu.Staff_Key);
    xmt.Add("@Type_Education", edu.Type_Education);
    xmt.Add("@Qual", edu.Qual);
    
    // Handle the date property correctly
    if (edu.Education_Date.HasValue)
    {
        xmt.Add("@Education_Date", edu.Education_Date.Value);
    }
    else
    {
        xmt.Add("@Education_Date", DBNull.Value);
    }
    
    // Rest of your insertion logic...
}

Why You Were Seeing 01/01/1900

C#'s DateTime is a value type, which means it can't be null by default. If you don't assign a value to a non-nullable DateTime property, it automatically gets set to DateTime.MinValue—which translates to 01/01/1900 in SQL. When your code inserted this default value, that's what ended up in your table.

Bonus: Simplify with an ORM (Optional)

If you're using raw ADO.NET right now, switching to an ORM like Entity Framework Core can take care of these null-handling details automatically. EF Core maps nullable C# value types directly to SQL nullable columns, so you won't have to manually deal with DBNull.Value anymore.

内容的提问来源于stack exchange,提问作者hassanzi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:27:23