Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Newtonsoft.Json.JsonConvert.DeserializeObject存在空值问题_C#_Sql Server_Date Formatting_Sqlbulkcopy - Fatal编程技术网

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",