2012-07-10 275 views
9

我得到这个例外,当我尝试插入DBNull.Value成可空 VARBINARY(最大值)字段:从数据类型为nvarchar到VARBINARY(最大值)的隐式转换是不允许

Implicit conversion from data type nvarchar to varbinary(max) is not allowed. Use the CONVERT function to run this query. 

那是我的代码:

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

我知道这里存在重复的问题,但我不会像其他人一样使用任何字符串。

我该怎么做?

UPDATE:

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(); 
     } 
    } 
+2

看起来不是正确的代码行。 UniqueIdentifier完全没有提及。也许提供存储过程的定义呢? – Sean 2012-07-10 11:01:35

+0

对不起,我复制了错误的异常。现在更正了。 – Pascal 2012-07-10 11:11:57

+0

“AddWithValue”的第二个参数是值。不是数据类型。 – 2012-07-10 11:17:56

回答

6

为什么不改变你的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,因此错误。

+0

我得到同样的错误。请参阅我的发布代码。 – Pascal 2012-07-10 11:45:50

+0

啊你快一点就找到了-1招嘿嘿。我想明确地将其设置为null,或者我知道表的默认行为。 – Pascal 2012-07-10 12:49:04

15

我有同样的问题,而插入DBNull.ValueVarbinary(Max)列。谷歌搜索后,我找到了一个解决方案,它可以帮助你以及:

您需要设置大小-1这意味着Max长度varbinary列加入您的SQL参数时:你的情况

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

所以:

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