2012-07-10 32 views
9

जब मैं एक नल varbinary (अधिकतम) क्षेत्र में एक DBNull.Value सम्मिलित करने की कोशिश मैं इस अपवाद: यहीअंतर्निहित रूपांतरण की अनुमति नहीं है

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; 

मुझे पता है कि SO पर डुप्लिकेट प्रश्न मौजूद हैं, लेकिन मैं दूसरों की तरह किसी भी स्ट्रिंग का उपयोग नहीं करता हूं।

मुझे क्या गलत लगता है?

अद्यतन:

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) 

... और दो पैरामीटर छोड़ देते हैं:

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

+0

क्षमा करें मैंने गलत अपवाद कॉपी किया है। अब यह सही है। – Pascal

+0

'AddWithValue' का दूसरा पैरामीटर मान है। डेटाटाइप नहीं। –

उत्तर

6

क्यों करने के लिए अपने एसक्यूएल बदल नहीं?

यदि यह हमेशा न्यूल होता है, तो इसका वही प्रभाव होगा।

अन्यथा, दो पंक्तियों में यह प्रयास करें:

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

अन्यथा, अपने मूल SQL डालने बयान में, आप पैरामीटर प्रकार को परिभाषित नहीं कर रहे हैं लेकिन varbinary में त्रुटि गुजर, इसलिए।

+0

मुझे वही त्रुटि मिलती है। कृपया मेरा पोस्ट कोड देखें। – Pascal

+0

आह आप तेजी से थे -1 ट्रिक हेहे। मैं स्पष्ट रूप से दूसरों को इस तरह से शून्य करना चाहता हूं या मुझे तालिका के डिफ़ॉल्ट व्यवहार के बारे में पता है। – Pascal

15

मुझे कॉलम के लिए प्रविष्टि DBNull.Value के दौरान एक ही समस्या थी।

आप आकार -1 जब अपने एसक्यूएल पैरामीटर जोड़ने जो varbinary स्तंभ के लिए Max लंबाई का मतलब निर्धारित करने की आवश्यकता: आपके मामले में तो

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

Googling के बाद मैं एक समाधान है कि आप के रूप में अच्छी मदद मिल सकती है पाया :

insertCMD.Parameters.Add("@ErrorScreenshot", SqlDbType.VarBinary,-1).Value = DBNull.Value; 
संबंधित मुद्दे