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()方法,目前没有官方方式让它自动将SQLdate映射为DateOnly,必须手动转换列类型或值。 - 确保项目目标框架为.NET 6或更高版本,
GetDateOnly()方法才可用。
内容的提问来源于stack exchange,提问作者Yndigo Dream
相关产品推荐
相关产品推荐

