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

C#中SqlDataAdapter无法从SQL Server填充DateOnly字段问题咨询

问题解答:SQL Server date类型映射到DataTable的DateOnly列

为什么默认不自动映射为DateOnly?

.NET 6引入DateOnly类型后,SqlDataAdapter和DataTable的默认类型映射并未更新——因为这两个组件的设计早于DateOnly,为了保证向后兼容性,微软保留了原有行为,将SQL Server的date类型默认映射为DateTime。

直接在DataTable中获取DateOnly类型列的解决方案

要实现这一点,你需要预先定义DataTable的列结构,并通过SqlDataReader手动读取数据填充,利用.NET 6+新增的SqlDataReader.GetDateOnly()方法直接获取DateOnly类型的值:

代码示例

string sql = "SELECT * FROM date_table";
DataTable dt = new DataTable();

// 手动指定列类型,将my_date设为DateOnly
dt.Columns.Add("id", typeof(int));
dt.Columns.Add("my_date", typeof(DateOnly));

using (SqlCommand command = new SqlCommand(sql, connection))
{
    connection.Open();
    using (SqlDataReader reader = command.ExecuteReader())
    {
        while (reader.Read())
        {
            DataRow row = dt.NewRow();
            row["id"] = reader.GetInt32(reader.GetOrdinal("id"));
            
            // 处理可为空的date字段:如果是DBNull则赋值DBNull.Value,否则读取为DateOnly
            int myDateOrdinal = reader.GetOrdinal("my_date");
            row["my_date"] = reader.IsDBNull(myDateOrdinal) ? DBNull.Value : reader.GetDateOnly(myDateOrdinal);
            
            dt.Rows.Add(row);
        }
    }
    connection.Close();
}

注意事项

  • 若坚持使用SqlDataAdapter.Fill()方法,目前没有官方方式让它自动将SQL date映射为DateOnly,必须手动转换列类型或值。
  • 确保项目目标框架为.NET 6或更高版本,GetDateOnly()方法才可用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 16:52:12