不允许从数据类型 nvarchar 到 varbinary(max) 的隐式转换

Posted

技术标签:

【中文标题】不允许从数据类型 nvarchar 到 varbinary(max) 的隐式转换【英文标题】:Implicit conversion from data type nvarchar to varbinary(max) is not allowed 【发布时间】:2012-07-10 10:58:55 【问题描述】:

当我尝试将 DBNull.Value 插入 nullable varbinary(max) 字段时,出现此异常:

。使用 CONVERT 函数运行此查询。

这是我的代码:

insertCMD.Parameters.AddWithValue("@ErrorScreenshot", SqlDbType.VarBinary).Value = DBNull.Value;

我知道关于 SO 存在重复的问题,但我没有像其他人那样使用任何字符串。

我做错了什么?

更新:

using (var insertCMD = new SqlCommand("INSERT INTO TestplanTeststep (TeststepId,TestplanId,CreatedAt,ErrorText,ErrorScreenshot,TestState) VALUES (@TeststepId, @TestplanId,@CreatedAt,@ErrorText,@ErrorScreenshot,@TestState)", con))

 var p1 = insertCMD.Parameters.Add("@TeststepId", SqlDbType.Int);
 var p2 = insertCMD.Parameters.Add("@CreatedAt", SqlDbType.DateTime);
 insertCMD.Parameters.AddWithValue("@TestplanId", testplan.Id);
 insertCMD.Parameters.AddWithValue("@ErrorText", (object) DBNull.Value);
 insertCMD.Parameters.AddWithValue("@ErrorScreenshot", (object) DBNull.Value);
 insertCMD.Parameters.AddWithValue("@TestState", (int)Teststep.TeststepTestState.Untested);
        
       foreach (Teststep step in teststeps)
        
           p1.Value = step.Id;
           p2.Value = step.CreatedAt;
           insertCMD.ExecuteNonQuery();
        
     

【问题讨论】:

看起来不像正确的代码行。根本没有提到唯一标识符。也许也提供存储过程定义? 对不起,我复制了错误的异常。现在已更正。 AddWithValue的第二个参数是值。不是数据类型。 此错误似乎已在 .NET5+ 中返回。 -1 大小技巧不再有效。有人知道其他解决方案吗? 【参考方案1】:

在为 Varbinary(Max) 列插入 DBNull.Value 时,我遇到了同样的问题。谷歌搜索后,我发现了一个可能对您也有帮助的解决方案:

您需要在添加 sql 参数时为 varbinary 列设置大小 -1,这意味着 Max 长度:

this.cmd.Parameters.Add("@Photo", SqlDbType.VarBinary, -1).Value = DBNull.Value;

所以在你的情况下:

insertCMD.Parameters.Add("@ErrorScreenshot", SqlDbType.VarBinary,-1).Value = DBNull.Value;

【讨论】:

这基本上对我有用。谢谢!我必须进行一些更改,所以它看起来像这样:_params.Add("Value", reportCache.Value, DbType.Binary, ParameterDirection.Input, - 1); 谢谢!做到了。我不知道为什么它会给出这个错误。 此错误似乎已在 .NET5+ 中返回。 -1 大小技巧不再有效。有人知道其他解决方案吗?【参考方案2】:

为什么不将您的 SQL 更改为:

INSERT INTO TestplanTeststep
(TeststepId,TestplanId,CreatedAt,ErrorText,ErrorScreenshot,TestState) 
VALUES 
(@TeststepId, @TestplanId,@CreatedAt,NULL,NULL,@TestState)

或者只是

INSERT INTO TestplanTeststep
(TeststepId,TestplanId,CreatedAt,TestState) 
VALUES 
(@TeststepId, @TestplanId,@CreatedAt,@TestState)

...省略这两个参数?

如果它始终为 NULL,那将具有相同的效果。

否则,分两行试试:

var binary1 = insertCMD.Parameters.Add("@ErrorScreenshot", SqlDbType.VarBinary, -1);
binary1.Value = DBNull.Value;

否则,在您的原始 SQL 插入语句中,您没有定义参数类型而是传入 varbinary,因此会出现错误。

【讨论】:

啊,你更快了,刚刚发现了-1把戏嘿嘿。我想以这种方式显式设置为 null,或者我知道表的默认行为。

以上是关于不允许从数据类型 nvarchar 到 varbinary(max) 的隐式转换的主要内容,如果未能解决你的问题,请参考以下文章

Spring JDBC for SQL Server - 使用 SQLXML 数据类型产生 SQLServerException:不允许从数据类型 xml 到 nvarchar(max) 的隐式转换

无法在 varbinary(max) 中插入空值并出现错误:不允许从数据类型 nvarchar 到 varbinary(max) 的隐式转换

MSSQL数据类型nvarchar如何强行转为float类型.

SQL里,如何将数据类型nvarchar转换成float?

nvarchar 值转换为数据类型为 int 发生语法错误

mysql等效数据类型