将 byte[0] 作为 varbinary 数据类型参数插入到数据库中

Insert into database byte[0] as a varbinary datatype parameter

这是一个简单的程序,它创建一个测试数据库,其中包含 VARCHAR(50)VARBINARY(8000) 类型的两列 table。我想在 varbinary 列中保存一个空数组 (byte[0]),但是在程序执行后,BINVAL 列包含一个 8000 个空字节的数组而不是一个空数组。

如何将空字节数组保存在 varbinary 列中?

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);
            }
        }
    }
}

您需要使用 VarBinary 而不是 Binary。我还建议您指定参数的长度。

此外,您应该只更改要连接的数据库,而不是 USE 语句。

您不应该对连接字符串进行硬编码,而是将其放入设置文件中。然后你可以使用 SqlConnectionBuilder 将数据库更改为 master 用于 CREATE DATABASE 命令。

并且您应该只为每个命令使用一个新的参数列表。您甚至可以使用 params 数组。

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;

namespace ConsoleApplication1
{
    internal class Program
    {
       
        public static void Main(string[] args)
        {
            var connBuilder = new SqlConnectionStringBuilder(Properties.ConnectionString);
            connBuilder.Database = "master";
            using(var conn = new SqlConnection(connBuilder.ConnectionString))
                ExecuteParametrizedDbCommand(conn, "CREATE DATABASE TestDB");

            ExecuteParametrizedDbCommand("CREATE TABLE SampleData (STRVAL VARCHAR(50), BINVAL VARBINARY(8000))");
            
            ExecuteParametrizedDbCommand(
                "INSERT INTO SampleData (STRVAL, BINVAL) VALUES (@STRVAL, @BINVAL)", 
                new SqlParameter("@STRVAL", SqlDbType.VarChar, 50) {
                    Value = string.Empty
                },
                new SqlParameter("@BINVAL", SqlDbType.VarBinary, -1) {
                    Value = new byte[0]
                });
        }
        
        public static void ExecuteParametrizedDbCommand(string command, params SqlParameter[] commandParams)
        {
            using( var conn = new SqlConnection(Properties.ConnectionString) )
                ExecuteParametrizedDbCommand(conn, command, commandParams);
        }

        public static void ExecuteParametrizedDbCommand(SqlConnection conn, string command, params SqlParameter[] commandParams)
        {
            try
            {
                using( var cmd = new SqlCommand(command, conn) )
                {
                    if(commandParams != null)
                        cmd.Parameters.AddRange(commandParams.ToArray());
                    conn.Open();
                    cmd.ExecuteNonQuery();
                }
            }
            catch( Exception ex )
            {
                Console.WriteLine(ex.Message);
            }
        }
    }
}