Почему 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. И, конечно, есть разница между нулевым значением и пустым массивом, что означает, что я не могу просто сравнить и посмотреть, равна ли его длина нулю, чтобы определить, что это ноль. Должен ли я действительно добавить особый случай для столбцов с отметками времени, чтобы проверить нулевую длину?