我使用的是 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
, datetime
和 datetimeoffset
数据类型,但每次都出现转换错误。
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(忽略)
使用 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;
}
}
你可能在你的代码中使用了DateTimeOffset。
DateTimeOffset = DateTime+Offset(from UTC)
差异可能是客户端和服务器之间的偏移造成的(两个不同的区域)。
如果你使用的是DateTime,你就不会有这个问题。
1) 首先尝试调试你的代码,看看将被保存在数据库中的值是否与保存的值相同。
2) 所以你的数据已经代表了Client的本地日期和时间。只要把它转为DateTime,你就会得到客户端的本地日期和时间。
更多 联系