DataTable转JSON时DateTime格式异常及SQL插入报错的解决方案咨询
解决DataTable转JSON时DateTime格式不兼容SQL Server的问题
将DataTable序列化为JSON时,DateTime字段被转成/Date(1722796200000)/格式,导致写入SQL Server时抛出Conversion failed when converting date and/or time from character string错误。需要把DateTime转成标准ISO格式(如"2024-08-05T00:00:00"),以下是两种可行方案:
方案一:修改现有JavaScriptSerializer序列化逻辑
直接在遍历DataTable列的环节,对DateTime类型字段做格式化处理,转成ISO标准字符串:
修改后的序列化代码:
string JsonData = DataTableToJSONWithJavaScriptSerializer(dt); public string DataTableToJSONWithJavaScriptSerializer(DataTable table) { List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>(); Dictionary<string, object> row; foreach (DataRow dr in table.Rows) { row = new Dictionary<string, object>(); foreach (DataColumn col in table.Columns) { // 判断字段类型为DateTime时,转成ISO格式字符串 if (col.DataType == typeof(DateTime)) { var dateValue = dr[col] as DateTime?; row.Add(col.ColumnName, dateValue?.ToString("yyyy-MM-ddTHH:mm:ss") ?? DBNull.Value); } else { row.Add(col.ColumnName, dr[col]); } } rows.Add(row); } System.Web.Script.Serialization.JavaScriptSerializer serializer = new System.Web.Script.Serialization.JavaScriptSerializer(); return serializer.Serialize(rows); }
修改后序列化结果:
[{"No":1,"CDate":"2024-08-05T00:00:00"}]
SQL Server可直接解析该格式字符串为DateTime类型。
方案二:改用Newtonsoft.Json(Json.NET)序列化
若允许引入第三方库,Newtonsoft.Json默认会将DateTime序列化为ISO标准格式,代码更简洁:
先安装Newtonsoft.Json NuGet包,再使用以下代码:
using Newtonsoft.Json; // 直接序列化DataTable string JsonData = JsonConvert.SerializeObject(dt, Formatting.None);
该方式无需额外处理DateTime字段,序列化结果同样为标准ISO格式,且Newtonsoft.Json的性能与兼容性优于JavaScriptSerializer。
注意事项
- 若DataTable存在
DBNull的DateTime字段,方案一中的?? DBNull.Value可保证空值正确序列化; - 方案二中Newtonsoft.Json会自动将
DBNull序列化为null,SQL Server可正确识别。
内容的提问来源于stack exchange,提问作者Dev
相关产品推荐
相关产品推荐

