2013-08-11 34 views
9

Jak dodać wartość pustą w parametrze varbinary datatype?Wartość pusta w parametrze varbinary datatype

Kiedy wykonać następujący kod:

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

uzyskać następujące System.Data.SqlClient.SqlException:

niejawna konwersja z typu danych nvarchar do varbinary (max) nie jest dozwolone. Użyj funkcji CONVERT, aby uruchomić to zapytanie.

+0

mam trochę strategię wykrywania do czynienia z zerowymi wystąpień 'byte []' 'object' cast jak na związane postu: http://stackoverflow.com/a/42905940/97964 – jocull

Odpowiedz

5

Można spróbować czegoś takiego: -

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

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

dzięki. Do czego służy -1? –

+0

Jest to długość i SqlDbType.VarBinary o długości -1 jest odpowiednikiem VARBINARY (MAX), przynajmniej w teorii. ;) –

+0

Skąd wiesz, że typem danych jest MAX? –

1

zrobić to w ten sposób bez problemu

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

ale Parameters.Add jest nieaktualny –

4

spróbuj tego:

mySqlCommand.Parameters.AddWithValue("@Image", new byte[]{}); 
+3

'Parameters.Add' jest nieaktualny, ta odpowiedź może być lepsza, jedyne co trzeba zauważyć to to, że nie wstawi danych' NULL' (w tabeli możesz zobacz słowo "NULL"), ale dane "PUSTE" (w tabeli nic nie zobaczysz) –

+0

To jest najlepsze rozwiązanie, jak stwierdził Ronaldinho, dzięki za odpowiedź Shamseer – Eliseo

+0

Jak powiedział @RonaldinhoLearnCoding, ważne jest, aby pamiętać, że ' bajt [0] 'nie jest tym samym, co' null'. – jocull

6

I dont know powód, dla którego "DBNull.Value" nie działa dla mnie. I domyślam się, że inne rozwiązanie może rozwiązać ten problem.

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

To działało dla mnie i pasowało do metody pomocniczej, która wcześniej wysyłać DBNull.Value, jeśli wartość byte [] była zerowa. – jason

2
sqlCommand.Parameters.AddWithValue("@image", SqlBinary.Null); 
+4

Podczas gdy ta odpowiedź może odpowiedzieć na pytanie, dodając więcej szczegółów, np. Dlaczego i jak to działa, poprawi jej jakość – NathanOliver

-1

ustawiona wartość zerowa w procedura składowana. Nie musi robić nic więcej.

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