C# Newtonsoft.Json.JsonConvert.DeserializeObject存在空值问题
我使用的是一个C# Newtonsoft.Json.JsonConvert.DeserializeObject存在空值问题,c#,sql-server,date-formatting,sqlbulkcopy,C#,Sql Server,Date Formatting,Sqlbulkcopy,我使用的是一个SqlBulkCopy,它来自使用C#和SQLServer2016的json数据 原始字符串是:“1979-09-30T23:00:00.000+0000” 但是当使用SqlBulkCopy复制到SQL Server表中时,字符串变成“01/10/1979 00:00:00” 我使用varchar(100)作为此列的数据类型 我尝试了date、datetime和datetimeoffset数据类型,但每次都出现转换错误 create table Employees( matricu
SqlBulkCopy
,它来自使用C#和SQLServer2016的json数据
原始字符串是:“1979-09-30T23:00:00.000+0000”
但是当使用SqlBulkCopy
复制到SQL Server表中时,字符串变成“01/10/1979 00:00:00”
我使用varchar(100)
作为此列的数据类型
我尝试了date
、datetime
和datetimeoffset
数据类型,但每次都出现转换错误
create table Employees(
matricule nvarchar(20),
pname nvarchar(100),
birthdate varchar(100),
hiredate varchar(100))
--我尝试使用date、datetime和datetimeoffset数据类型,但每次都会出现转换错误。
)
如何保存原始数据
经过分析,我找到了问题的根源
Json在日期字段中有空值
日期是这样的
“字段\日期\名称”:空
json序列化程序在此字段中出错
public static void BulkCopy(DataTable myDataTable)
{
using (SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["2"].ConnectionString))
{
connection.Open();
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection))
{
foreach (DataColumn c in myDataTable.Columns)
bulkCopy.ColumnMappings.Add(c.ColumnName, c.ColumnName);
bulkCopy.DestinationTableName = myDataTable.TableName;
try
{
bulkCopy.WriteToServer(myDataTable);
}
catch (Exception ex)
{
log.Error(ex.Message);
}
}
}
}
下面是调用它的方法
public static void Employee()
{
try
{
DataTable MyTable = Clapi.GetApiData(ConfigurationManager.AppSettings.Get("api_employe"), "imp_Employees").GetAwaiter().GetResult();
log.Info(String.Format("Table: {0} Count {1}", MyTable.TableName, MyTable.Rows.Count));
Cldb.BulkCopy(MyTable);
}
catch(Exception ex)
{
log.Error(ex.Message);
}
}
//这是我们的数据
public static async Task<DataTable> GetApiData(string Url ,string TableName)
{
try
{
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, Url);
var response = await client.SendAsync(request);
var contents = response.Content.ReadAsStringAsync().Result;
var Mytable = JsonConvert.DeserializeObject<DataTable>(contents);
Mytable.TableName = TableName;
return Mytable;
}
catch(Exception ex)
{
log.Error("GetApiData; url="+Url+";TableName:"+TableName+ex.Message);
return null;
}
}
publicstaticasync任务GetApiData(字符串Url,字符串TableName)
{
尝试
{
var client=新的HttpClient();
var request=newhttprequestmessage(HttpMethod.Get,Url);
var response=wait client.sendaync(请求);
var contents=response.Content.ReadAsStringAsync().Result;
var Mytable=JsonConvert.DeserializeObject(内容);
Mytable.TableName=表名;
返回Mytable;
}
捕获(例外情况除外)
{
log.Error(“GetApiData;url=“+url+”;TableName:“+TableName+ex.Message”);
返回null;
}
}
Json数据
[{
“矩阵”:“0009”,
“pname”:“xxxx”,“出生日期”:“1961-02-25T23:00:00.000+0000”, “雇佣关系”:“1976-02-14T23:00:00.000+0000”
}] 批量复制到sql server后,这两个日期变为 “1961-02-25T23:00:00.000+0000”变为1961年2月26日00:00:00
“1976-02-14T23:00:00.000+0000”变为1976年2月15日00:00:00 我也尝试了设置,但仍然得到错误 NullValueHandling=NullValueHandling.Ignore
您可能在代码中使用了DateTimeOffset DateTimeOffset=日期时间+偏移量(从UTC) 这种差异可能是客户机和服务器(两个不同区域)之间偏移的原因 如果使用DateTime,则不会出现此问题 1) 首先试着调试代码,看看要保存在数据库中的值是否与保存的值相同 2) 因此,您的数据已经表示了客户的本地日期和时间。只要将其转换为DateTime,您将获得客户的本地日期和时间
更多信息将
JsonSerializationSettings
与DateTimeZoneHandling=DateTimeZoneHandling.Utc
一起使用,然后将表日期列声明为datetime
数据类型
public static async Task<DataTable> GetApiData(string Url, string TableName)
{
try
{
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, Url);
var response = await client.SendAsync(request);
var contents = response.Content.ReadAsStringAsync().Result;
var settings = new JsonSerializerSettings
{
DateTimeZoneHandling = DateTimeZoneHandling.Utc
};
var Mytable = JsonConvert.DeserializeObject<DataTable>(contents, settings);
Mytable.TableName = TableName;
return Mytable;
}
catch (Exception ex)
{
log.Error("GetApiData; url=" + Url + ";TableName:" + TableName + ex.Message);
return null;
}
}
publicstaticasync任务GetApiData(字符串Url,字符串TableName)
{
尝试
{
var client=新的HttpClient();
var request=newhttprequestmessage(HttpMethod.Get,Url);
var response=wait client.sendaync(请求);
var contents=response.Content.ReadAsStringAsync().Result;
var设置=新的JsonSerializerSettings
{
DateTimeZoneHandling=DateTimeZoneHandling.Utc
};
var Mytable=JsonConvert.DeserializeObject(内容、设置);
Mytable.TableName=表名;
返回Mytable;
}
捕获(例外情况除外)
{
log.Error(“GetApiData;url=“+url+”;TableName:“+TableName+ex.Message”);
返回null;
}
}
如果是日期,则应使用日期类型。请显示创建datatable并从Json填充它的代码。这是发生事情的地方,而不是BulkCopy方法我更新了我的问题,添加了创建表的sql脚本:我尝试了date、datetime和datetimeoffset数据类型,但每次都会出现转换错误。)通过webapi来自json的日期具有以下格式“2020-05-07T10:58:07.812Z”,我指的是创建System.Data.DataTable myDataTable
并从json填充它的代码。我相信问题就在这里我已经发布了我问题中的代码(c#代码)上面的数据来自外部源(API)谢谢你的贡献和帮助,我找到了问题的根源,因为Json中的日期字段中的值=null,我要求API供应商用日期替换它"1900/01/01",