This is a simple program that creates a test database with a single table containing two columns of type VARCHAR(50) and VARBINARY(8000). I want to save an empty array (byte[0]) in the varbinary column, but after program executes, the BINVAL column contains an array of 8000 null bytes instead of an empty array.
How can an empty byte array be saved in a varbinary column?
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
namespace ConsoleApplication1
{
internal class Program
{
static string connString = "Server=localhost\\SQLEXPRESS;Integrated security=True;database=master";
public static void Main(string[] args)
{
var sqlCommandParams = new List<SqlParameter>();
ExecuteParametrizedDbCommand("Use master; CREATE DATABASE TestDB", sqlCommandParams);
ExecuteParametrizedDbCommand("USE TestDB; CREATE TABLE SampleData (STRVAL VARCHAR(50), BINVAL VARBINARY(8000))", sqlCommandParams);
sqlCommandParams.Add(new SqlParameter
{
ParameterName = "@STRVAL",
SqlDbType = SqlDbType.VarChar,
Value = string.Empty
});
sqlCommandParams.Add(new SqlParameter
{
ParameterName = "@BINVAL",
SqlDbType = SqlDbType.Binary,
Value = new byte[0]
});
ExecuteParametrizedDbCommand(
"USE TestDb INSERT INTO SampleData (STRVAL, BINVAL) VALUES (@STRVAL, @BINVAL)",
sqlCommandParams);
}
public static void ExecuteParametrizedDbCommand(string command, IEnumerable<SqlParameter> commandParams)
{
try
{
using( var conn = new SqlConnection(connString) )
{
using( var cmd = conn.CreateCommand() )
{
cmd.CommandText = command;
cmd.Parameters.AddRange(commandParams.ToArray());
conn.Open();
cmd.ExecuteNonQuery();
}
}
}
catch( Exception ex )
{
Console.WriteLine(ex.Message);
}
}
}
}
DBNull.Value