Newtonsoft.Json.JsonConvert.DeserializeObject出现空值的问题。

问题描述 投票:0回答:2

我使用的是 SqlBulkCopy 使用C#和SQL Server 2016从json数据中提取。

原始字符串是。"1979-09-30T23:00:00.000+0000"

但是当用C#将其复制到SQL Server表中的时候 SqlBulkCopy,字符串变成了 "01/10/1979 00:00:00"

我使用的是 varchar(100) 作为此列的数据类型。

我尝试用 date, datetimedatetimeoffset 数据类型,但每次都出现转换错误。

create table Employees(
matricule  nvarchar(20),
pname  nvarchar(100),
birthdate  varchar(100),
hiredate varchar(100))

-- 我试过用date、datetime和datetimeoffset数据类型,但每次都出现转换错误。 )

如何做才能保留原始数据?

经过分析,我发现问题的根源在于Json中的日期字段有空值,日期的json是这样的。

"field_date_name":null

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);
            }
        }

/ 和这里的GetApiData

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;
            }
        }

Json数据

[{ "matricule": "0009", "pname": "xxxx", "borndate": "1961-02-25T23:00:00.000+0000", "hiredate": "1976-02-14T23:00:00.000+0000" }]

在批量复制到sql server后,这2个日期变成了

"1961-02-25T23:00:00.000+0000 "成为0261961 00:00:00 "1976-02-14T23:00:00.000+0000 "成为15021976 00:00:00。

我也尝试与设置 ,但仍然得到错误的

NullValueHandling = NullValueHandling.Ignore(忽略)

c# sql-server date-formatting sqlbulkcopy
2个回答
1
投票

使用 JsonSerializationSettingsDateTimeZoneHandling = 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;
    }
}

0
投票

你可能在你的代码中使用了DateTimeOffset。

DateTimeOffset = DateTime+Offset(from UTC)

差异可能是客户端和服务器之间的偏移造成的(两个不同的区域)。

如果你使用的是DateTime,你就不会有这个问题。

1) 首先尝试调试你的代码,看看将被保存在数据库中的值是否与保存的值相同。

2) 所以你的数据已经代表了Client的本地日期和时间。只要把它转为DateTime,你就会得到客户端的本地日期和时间。

更多 联系

© www.soinside.com 2019 - 2024. All rights reserved.