将 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);
}
}
}
}
这是一个简单的程序,它创建一个测试数据库,其中包含 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);
}
}
}
}