2012-07-10 68 views
9

tôi nhận được ngoại lệ này khi tôi cố gắng để chèn một DBNull.Value thành một nullable varbinary (max) lĩnh vực:chuyển đổi ngầm từ kiểu dữ liệu nvarchar sang varbinary (max) không được phép

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

Thats của tôi mã:

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

Tôi biết có tồn tại các câu hỏi trùng lặp trên SO, nhưng tôi KHÔNG sử dụng bất kỳ Chuỗi nào giống như các chuỗi khác.

Tôi làm gì sai?

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

Không giống như dòng mã phù hợp. UniqueIdentifier không được đề cập ở tất cả. Có thể cung cấp định nghĩa quy trình được lưu trữ không? – Sean

+0

Xin lỗi tôi đã sao chép ngoại lệ sai. Bây giờ nó được sửa chữa. – Pascal

+0

Tham số thứ hai của 'AddWithValue' là giá trị. Không phải kiểu dữ liệu. –

Trả lời

6

Tại sao không thay đổi SQL của bạn để:

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

hoặc chỉ

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

... và bỏ qua hai tham số?

Nếu nó luôn là NULL, điều đó sẽ có tác dụng tương tự.

Nếu không, hãy thử nó trong hai dòng:

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

Nếu không, trong câu lệnh SQL chèn ban đầu của bạn, bạn không xác định kiểu tham số nhưng đi qua trong varbinary, vì thế mà lỗi.

+0

Lỗi tương tự tôi nhận được. Vui lòng xem mã đã đăng của tôi. – Pascal

+0

ah bạn đã nhanh hơn chỉ tìm thấy -1 mẹo hehe. Tôi muốn thiết lập một cách rõ ràng để null theo cách này những người khác hoặc tôi biết về hành vi mặc định của bảng. – Pascal

15

Tôi đã gặp sự cố tương tự khi chèn DBNull.Value cho cột Varbinary(Max). Sau khi Googling Tôi tìm thấy một giải pháp có thể giúp bạn cũng như:

Bạn cần phải thiết lập kích thước -1 có nghĩa Max dài cho cột varbinary khi thêm tham số sql của bạn:

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

Vì vậy, trong trường hợp của bạn :

insertCMD.Parameters.Add("@ErrorScreenshot", SqlDbType.VarBinary,-1).Value = DBNull.Value; 
Các vấn đề liên quan