Datetime SQL Server/OLEDB日期时间到节点时间即时-最安全的方法

Datetime SQL Server/OLEDB日期时间到节点时间即时-最安全的方法,datetime,timezone,oledb,nodatime,Datetime,Timezone,Oledb,Nodatime,当原始数据来自SQL查询(在本例中为LINQ)或OLEDB(两者都是相同的问题)时,转换日期时间有问题 我使用的是NodaTime,但问题是,在到达Noda瞬间之前,我似乎需要通过System.DateTime,此时会引入错误 源数据中数据的时区总是已知的,在大多数情况下是UTC。然而,出于某种原因,代码将其解释为本地系统时间(我猜),就像我调用ToUniversalTime()时,它将时间戳移动了一个小时 在没有任何系统时间干预风险的情况下,将数据库datetime对象转换为节点时间瞬间的最佳

当原始数据来自SQL查询(在本例中为LINQ)或OLEDB(两者都是相同的问题)时,转换日期时间有问题

我使用的是NodaTime,但问题是,在到达Noda瞬间之前,我似乎需要通过System.DateTime,此时会引入错误

源数据中数据的时区总是已知的,在大多数情况下是UTC。然而,出于某种原因,代码将其解释为本地系统时间(我猜),就像我调用
ToUniversalTime()
时,它将时间戳移动了一个小时

在没有任何系统时间干预风险的情况下,将数据库datetime对象转换为节点时间瞬间的最佳方式是什么

由于我知道源数据的时区,我需要将其转换为正确的瞬间,而不需要系统在幕后应用假定的时区

OleDb代码示例:

var cmd = String.Format("SELECT [{0}] AS EquipRef, [{1}] AS MeasureTimeStamp, [{2}] AS MeasureValue FROM [{3}]", equipRefColumn, timeStampColumn, columnName, tableName);
var dataTable = new DataTable(tableName);

using (var adapter = new OleDbDataAdapter(cmd, conn)) {
    adapter.Fill(dataTable);
}

var dataContainer = new DataContainer();
dataContainer.Data.Add(tableName, new List<Row>());

foreach (DataRow row in dataTable.Rows) {
    var timeStamp = Instant.FromDateTimeUtc(((DateTime)row["MeasureTimeStamp"]).ToUniversalTime());
    dataContainer.Data[tableName].Add(new Row() {ColumnName = columnName,EquipRef = row["EquipRef"].ToString(), TimeStamp = timeStamp, Value = row["MeasureValue"]});
}
var cmd=String.Format(“选择[{0}]作为equiref,[{1}]作为MeasureTimeStamp,[{2}]作为来自[{3}]的MeasureValue”,equirefColumn,timeStampColumn,columnName,tableName);
var dataTable=新数据表(表名);
使用(var适配器=新的OleDbDataAdapter(cmd,conn)){
adapter.Fill(数据表);
}
var dataContainer=新的dataContainer();
dataContainer.Data.Add(tableName,newlist());
foreach(dataTable.Rows中的DataRow行){
var timeStamp=Instant.FromDateTimeUtc(((DateTime)行[“MeasureTimeStamp”]).ToUniversalTime();
dataContainer.Data[tableName].Add(新行(){ColumnName=ColumnName,EquipRef=Row[“EquipRef”].ToString(),TimeStamp=TimeStamp,Value=Row[“MeasureValue”]});
}
LINQ到SQL代码示例:

var db = new RawDataStoreDataContext(new SqlConnection(ConnectionString));

var tables = db.Tables_Get(SourceDataLinkId);
var equipRefs = db.EquipRefs_Get(SourceDataLinkId);

foreach (var table in tables) {
    foreach (var equipRef in equipRefs) {
        var rawData = db.RawData_FetchByTableAndEquip(equipRef.EquipRef, table.TableName, SourceDataLinkId);

        var dataContainer = new DataContainer();
        dataContainer.Data = new Dictionary<string, List<Row>>();

        dataContainer.Data.Add(table.TableName,new List<Row>());
        foreach (var row in rawData) {
            var timeStamp = Instant.FromDateTimeUtc(row.TimeStamp.ToUniversalTime());
            dataContainer.Data[table.TableName].Add(new Row() {ColumnName = row.ColumnName,EquipRef = equipRef.EquipRef,TimeStamp = timeStamp,Value = row.Value});
        }
        dataTarget.Stage(dataContainer);
    }
}
var db=new-RawDataStoreDataContext(new-SqlConnection(ConnectionString));
var tables=db.tables\u Get(SourceDataLinkId);
var equirefs=db.equirefs\u Get(SourceDataLinkId);
foreach(表中的var表){
foreach(设备参考中的var设备参考){
var rawData=db.rawData\u FetchByTableAndEquip(equiref.equiref,table.TableName,SourceDataLinkId);
var dataContainer=新的dataContainer();
dataContainer.Data=newdictionary();
dataContainer.Data.Add(table.TableName,newlist());
foreach(rawData中的var行){
var timeStamp=Instant.FromDateTimeUtc(row.timeStamp.ToUniversalTime());
dataContainer.Data[table.TableName].Add(新行(){ColumnName=Row.ColumnName,equalref=equalref.equalref,TimeStamp=TimeStamp,Value=Row.Value});
}
Stage(dataContainer);
}
}

使用
DateTime.SpecifyKind
并传递
DateTimeKind.Utc
而不是
ToUniversalTime

在OLEDB代码中:

var timeStamp = Instant.FromDateTimeUtc(DateTime.SpecifyKind((DateTime)row["MeasureTimeStamp"], DateTimeKind.Utc));
在L2S代码中:

var timeStamp = Instant.FromDateTimeUtc(DateTime.SpecifyKind(row.TimeStamp, DateTimeKind.Utc));

旁白-为什么要使用oledb?为什么不仅仅是本机SQL客户机?谢谢,就是这样。Oledb用于从MS Access文件中获取数据