参数 varbinary 数据类型中的空值

Posted

技术标签:

【中文标题】参数 varbinary 数据类型中的空值【英文标题】:Null value in a parameter varbinary datatype 【发布时间】:2013-08-11 10:28:24 【问题描述】:

如何在参数 varbinary 数据类型中添加空值?

当我执行以下代码时:

using (SqlConnection myDatabaseConnection1 = new SqlConnection(myConnectionString.ConnectionString))

    using (SqlCommand mysqlCommand = new SqlCommand("INSERT INTO Employee(EmpName, Image) Values(@EmpName, @Image)", myDatabaseConnection1))
    
        mySqlCommand.Parameters.AddWithValue("@EmpName", textBoxEmpName.Text);
        mySqlCommand.Parameters.AddWithValue("@Image", DBNull.Value);
        myDatabaseConnection1.Open();
        mySqlCommand.ExecuteNonQuery();
    

我收到以下System.Data.SqlClient.SqlException

不允许从数据类型 nvarchar 到 varbinary(max) 的隐式转换。使用 CONVERT 函数运行此查询。

【问题讨论】:

我有一个小检测策略来处理byte[] 在相关帖子中转换为object 的空实例:***.com/a/42905940/97964 【参考方案1】:

我不知道为什么“DBNull.Value”对我不起作用。 我想出另一种解决方案可以解决这个问题。

cmd.Parameters["@Image"].Value = System.Data.SqlTypes.SqlBinary.Null;

【讨论】:

这对我有用,并且适合以前发送 DBNull.Value 如果 byte[] 值为空的辅助方法。 4 年后——这应该是公认的答案! SqlTypes.SqlBinary.Null 赢得胜利。谢谢你,善良的人。接受我的投票。【参考方案2】:
sqlCommand.Parameters.AddWithValue("@image", SqlBinary.Null);

【讨论】:

虽然此答案可能会回答问题,但会添加更多细节,例如为什么以及如何工作将提高其质量【参考方案3】:

你可以试试这样的:-

cmd.Parameters.Add( "@Image", SqlDbType.VarBinary, -1 );

cmd.Parameters["@Image"].Value = DBNull.Value;

【讨论】:

谢谢。 -1 是什么意思? 它是长度,长度为-1的SqlDbType.VarBinary相当于VARBINARY(MAX),至少理论上是这样。 ;) 你怎么知道数据类型长度是 MAX? 我不知道...我只是假设! ;) @RonaldinhoLearnCoding 使用Parameters.AddWithValue【参考方案4】:

试试这个:

mySqlCommand.Parameters.AddWithValue("@Image", new byte[]);

【讨论】:

Parameters.Add 已弃用,这个答案可能更好,唯一需要注意的是,它不会插入 NULL 数据(在表格中您会看到单词 NULL),而是插入EMPTY数据(在表格中你什么都看不到) 这是小罗所说的最好的解决方案,感谢Shamseer的回答 正如@RonaldinhoLearnCoding 所说,重要的是要注意byte[0]null 不同。【参考方案5】:

我这样做没有问题

SqlParameter image= new SqlParameter("@Image", SqlDbType.VarBinary, System.DBNull.Value);
mySqlCommand.Parameters.Add(image);

【讨论】:

但不推荐使用Parameters.Add【参考方案6】:

在您的存储过程中设置空值。不需要做任何其他事情。

ex. @photo varbinary(max) = null,

ALTER PROCEDURE [dbo].[InsertOurTeam]
    @name nvarchar(50),
    @Sname nvarchar(50),
    @designation nvarchar(50),
    @photo varbinary(max) = null,
    @Pname nvarchar(50)=null,
    @psize bigint=null,
    @id int output
    AS
    BEGIN

        SET NOCOUNT ON;
        insert into OurTeam values (@name,@Sname,@designation,@photo,@Pname,@psize);

        select @id= SCOPE_IDENTITY();
END

【讨论】:

解决了我的问题 ;)

以上是关于参数 varbinary 数据类型中的空值的主要内容,如果未能解决你的问题,请参考以下文章

JS中的空值

区分JS的空值

如何从列类型列表中删除 pandas DataFrame 中的空值

从sql table处理PSCustomObject中的空值。无法转换对象

cast方法导致java spark中的空值

在sql server数据库中将一个nvarchar类型的空值转换成decimal(18,3)类型