-
Couldn't load subscription status.
- Fork 316
Closed
Description
When returned in a resultset a null ROWVERSION is returned as an empty byte[], instead of DbNull.Value. This problem does not occur when returning using a parameter value, or using a resultset in ODBC (so not a TDS issue).
Here's e a repro:
using System;
using System.Data.Odbc;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using System.Threading;
using System.Threading.Tasks;
using System.Transactions;
namespace ConsoleApp14
{
class Program
{
static void Main(string[] args)
{
using (var con = new SqlConnection("Server=localhost;database=tempdb;Integrated Security=true"))
{
con.Open();
var cmd = con.CreateCommand();
cmd.CommandText = "select cast(null as rowversion) rv";
using (var rdr = cmd.ExecuteReader())
{
rdr.Read();
var allowDbNull = rdr.GetColumnSchema()[0].AllowDBNull;
var isNull = rdr.IsDBNull(0);
var val = rdr[0];
Console.WriteLine($"SqlClient: AllowDbNull {allowDbNull} IsDbNull: {isNull} {val.GetType().Name} {val}");
}
}
using (var con = new SqlConnection("Server=localhost;database=tempdb;Integrated Security=true"))
{
con.Open();
var cmd = con.CreateCommand();
cmd.CommandText = "select @val = cast(null as rowversion) ";
var p = cmd.Parameters.Add(new SqlParameter("@val", System.Data.SqlDbType.Timestamp));
p.Direction = System.Data.ParameterDirection.Output;
cmd.ExecuteNonQuery();
{
SqlBinary val = (SqlBinary) p.SqlValue;
Console.WriteLine($"SqlClient (parameter): IsDbNull: {val.IsNull} {val.GetType().Name} {val}");
}
}
using (var con = new OdbcConnection("Driver={ODBC Driver 17 for SQL Server};Server=localhost;Trusted_Connection=yes"))
{
con.Open();
var cmd = con.CreateCommand();
cmd.CommandText = "select cast(null as rowversion) rv";
using (var rdr = cmd.ExecuteReader())
{
rdr.Read();
var allowDbNull = rdr.GetSchemaTable().Rows[0]["AllowDBNull"];
var isNull = rdr.IsDBNull(0);
var val = rdr[0];
Console.WriteLine($"ODBC: AllowDbNull {allowDbNull} IsDbNull: {isNull} {val.GetType().Name} {val}");
}
}
}
}
}Expected behavior
SqlClient: AllowDbNull True IsDbNull: True DBNull
SqlClient (parameter): IsDbNull: True SqlBinary Null
ODBC: AllowDbNull True IsDbNull: True DBNull
Actual Behavior
SqlClient: AllowDbNull True IsDbNull: False Byte[] System.Byte[]
SqlClient (parameter): IsDbNull: True SqlBinary Null
ODBC: AllowDbNull True IsDbNull: True DBNull
Metadata
Metadata
Assignees
Labels
No labels