DateTime2 в SQL Server объединяется с точностью до наносекунд от C # - PullRequest
0 голосов
/ 20 июня 2019

У меня проблема с DateTime вставкой в ​​SQL Server DateTime2(6) тип данных. У меня есть переменная в C #, определенная как Datetime:

public DateTime CreatedOn { get; set; }

Ниже указана дата, которую я передаю SQL Server:

image

image

Когда вы замечаете, что отметки createdon заканчиваются на 786066. Но я объединил вышеприведенный datetime с SQL Server, и после обновления я получаю различные наносекунды:

image

Последние четыре цифры меняются. Однако, когда я делаю групповое копирование в таблицу, даты вставляются просто отлично. Но когда я объединяю строку за строкой, нано секунды объединяются неправильно.

MERGE [dbo].[ItemAttribute] as tgt
USING 
    (VALUES(@FK_ItemAttributeGroupCode, @ItemAttributeCode, @Name, @Description, 
            @EffectiveDate, @TerminationDate, @DataType, @DefaultString, 
            @DefaultNumeric, @DefaultDate, @FK_ItemGroupTypeCode, 
            @IsPublishable, @AttributeType, @IsAutoDelete, @IsFacilitySpecific, 
            @CreatedBy, @CreatedOn, @LastUpdatedBy, @LastUpdatedOn)) AS src ([FK_ItemAttributeGroupCode], [ItemAttributeCode], [Name], [Description], [EffectiveDate], [TerminationDate], [DataType], [DefaultString], [DefaultNumeric], [DefaultDate], [FK_ItemGroupTypeCode], [IsPublishable], [AttributeType], [IsAutoDelete], [IsFacilitySpecific], [CreatedBy], [CreatedOn], [LastUpdatedBy], [LastUpdatedOn])
     ON tgt.[FK_ItemAttributeGroupCode] = @FK_ItemAttributeGroupCode AND tgt.[ItemAttributeCode] = @ItemAttributeCode

WHEN MATCHED AND (EXISTS (SELECT TGT.[Name], TGT.[Description], TGT.[EffectiveDate], TGT.[TerminationDate], TGT.[DataType], TGT.[DefaultString], TGT.[DefaultNumeric], TGT.[DefaultDate], TGT.[FK_ItemGroupTypeCode], TGT.[IsPublishable], TGT.[AttributeType], TGT.[IsAutoDelete], TGT.[IsFacilitySpecific], TGT.[CreatedBy], TGT.[CreatedOn], TGT.[LastUpdatedBy], TGT.[LastUpdatedOn] EXCEPT SELECT @Name, @Description, @EffectiveDate, @TerminationDate, @DataType, @DefaultString, @DefaultNumeric, @DefaultDate, @FK_ItemGroupTypeCode, @IsPublishable, @AttributeType, @IsAutoDelete, @IsFacilitySpecific, @CreatedBy, @CreatedOn, @LastUpdatedBy, @LastUpdatedOn))  
    THEN
       UPDATE 
           SET [FK_ItemAttributeGroupCode] = @FK_ItemAttributeGroupCode, [ItemAttributeCode] = @ItemAttributeCode, [Name] = @Name, [Description] = @Description, [EffectiveDate] = @EffectiveDate, [TerminationDate] = @TerminationDate, [DataType] = @DataType, [DefaultString] = @DefaultString, [DefaultNumeric] = @DefaultNumeric, [DefaultDate] = @DefaultDate, [FK_ItemGroupTypeCode] = @FK_ItemGroupTypeCode, [IsPublishable] = @IsPublishable, [AttributeType] = @AttributeType, [IsAutoDelete] = @IsAutoDelete, [IsFacilitySpecific] = @IsFacilitySpecific, [CreatedBy] = @CreatedBy, [CreatedOn] = @CreatedOn, [LastUpdatedBy] = @LastUpdatedBy, [LastUpdatedOn] = @LastUpdatedOn

WHEN NOT MATCHED 
   THEN
      INSERT([FK_ItemAttributeGroupCode], [ItemAttributeCode], [Name], [Description], [EffectiveDate], [TerminationDate], [DataType], [DefaultString], [DefaultNumeric], [DefaultDate], [FK_ItemGroupTypeCode], [IsPublishable], [AttributeType], [IsAutoDelete], [IsFacilitySpecific], [CreatedBy], [CreatedOn], [LastUpdatedBy], [LastUpdatedOn]) 
      VALUES(@FK_ItemAttributeGroupCode, @ItemAttributeCode, @Name, @Description, @EffectiveDate, @TerminationDate, @DataType, @DefaultString, @DefaultNumeric, @DefaultDate, @FK_ItemGroupTypeCode, @IsPublishable, @AttributeType, @IsAutoDelete, @IsFacilitySpecific, @CreatedBy, @CreatedOn, @LastUpdatedBy, @LastUpdatedOn);

Мы используем SQL Server 2016.

foreach (var entity in entities)
                {
                    try
                    {
                        await conn.ExecuteAsync(sql, commandType: CommandType.Text, param: entity, commandTimeout: SQLCommandTimeOut);
                    }
}

Sql имеет вышеуказанный запрос на слияние, я передаю сущность в качестве параметра, а CreatedOn для сущности - DateTime. Однако вместо зацикливания и вставки в таблицу, если мы используем BulkCopy из C #, она вставляется правильно, так как фактический DateTime C # имеет значение до нано секунд, но вставка за строкой последние 4 цифры нано секунд отличаются, если вы заметили на скриншотах выше.

Любая помощь в этом?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...