【发布时间】:2019-04-01 10:07:45
【问题描述】:
我从 Azure Log Analytics 获取查询结果。结果在Table 对象中。都是字符串格式。在数据库中,表有PeriodStart列,即smalldatetime类型。
下面的代码工作正常 - 它插入了所有数据。但它转换 PeriodStart 错误。例如,我在PeriodStart 列"2019-03-26T00:00:00Z" 的行中有字符串值 - 在数据库中它将看起来"2019-03-26 02:00:00"。好像它使用我的时区 - 转换为当地时间。如何避免这种情况?
public async Task BulkInsertMetrics(Table metrics)
{
var metricsDt = new DataTable();
metricsDt.Columns.AddRange(metrics.Columns
.Select(c => new DataColumn(c.Name)).ToArray());
foreach (var row in metrics.Rows)
{
metricsDt.Rows.Add(row.ToArray());
}
using (var connection = new SqlConnection(_databaseSettings.ConnectionString))
{
await connection.OpenAsync();
using (var transaction = connection.BeginTransaction())
using (var bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.Default, transaction))
{
bulkCopy.DestinationTableName = "Metrics";
foreach (var column in metrics.Columns)
{
bulkCopy.ColumnMappings.Add(column.Name, column.Name);
}
await bulkCopy.WriteToServerAsync(metricsDt);
transaction.Commit();
}
}
}
【问题讨论】:
-
在源数据表中使用强类型的日期时间列来避免解析和字符串格式问题。
-
好的,手动转换有帮助。我在解析字符串后使用了
ToUniversalTime()。谢谢。 -
我用答案扩展了您的解决方案。
标签: c# sql-server ado.net sqlbulkcopy