Отметка времени IsDBNull - PullRequest
0 голосов
/ 16 июня 2020

Почему IsDBNull возвращает false для столбцов отметок времени в C# независимо от его значения?

Рассмотрим следующую таблицу.

CREATE TABLE [Entity] (
    [Id] UNIQUEIDENTIFIER NOT NULL,
    [RowVersion] TIMESTAMP NOT NULL
)

INSERT INTO [Entity] ([Id]) VALUES (N'E2A87489-CEB7-4460-BC30-00264538E644')

При выполнении следующего C# кода RowVersion Столбец помечен как ненулевое значение, как видно из выполнения reader.IsDBNull (0). Обратите внимание, что запрос намеренно объединяется с чем-то несуществующим, что означает, что [JoinedEntity]. [RowVersion] должен иметь значение NULL.

var connectionString = "Server=(LocalDb)\\MSSQLLocalDB;Database=EnterpriseResourcePlanning;Integrated Security=True;";
using (var sqlConnection = new SqlConnection(connectionString))
{
    sqlConnection.Open();
    using(var sqlCommand = new SqlCommand("SELECT [JoinedEntity].[RowVersion] FROM [Entity] LEFT JOIN [Entity] AS [JoinedEntity] ON [JoinedEntity].[Id] = N'00000000-0000-0000-0000-000000000000'", sqlConnection))
    {
        using(var reader = sqlCommand.ExecuteReader())
        {
            while (reader.Read())
            {
                var isNull = reader.IsDBNull(0);

                Console.WriteLine(isNull);
            }
        }
    }
}

При выполнении следующего SQL можно ясно увидеть, что первый столбец имеет "значение" 0x, это 0x, конечно, то, с чего начинаются все массивы байтов. Как видно из второго столбца, применение ISNULL ясно показывает, что T- SQL рассматривает этот столбец как имеющий значение NULL. Тем не менее, IsDBNull возвращает false, почему? Как я могу проверить значение NULL, если IsDBNull нельзя доверять?

Обратите внимание, что другие типы столбцов массива байтов, такие как varbinary (max), не страдают от этого и возвращают ожидаемое значение NULL.

SELECT [JoinedEntity].[RowVersion], ISNULL([JoinedEntity].[RowVersion], 0x12345) FROM [Entity] LEFT JOIN [Entity] AS [JoinedEntity] ON [JoinedEntity].[Id] = N'00000000-0000-0000-0000-000000000000'

Обратите внимание, что использование reader.GetValue (0) возвращает пустой массив байтов, а не null. И, конечно, есть разница между нулевым значением и пустым массивом, что означает, что я не могу просто сравнить и посмотреть, равна ли его длина нулю, чтобы определить, что это ноль. Должен ли я действительно добавить особый случай для столбцов с отметками времени, чтобы проверить нулевую длину?

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