2012-09-18 12 views
6

Używam ponownie tej metody używania DataTable jako parametru do procedury składowanej i działało świetnie. To jest uproszczony działający kod:DataTable z polem bajtowym [] jako parametrem procedury składowanej

using (dbEntities dbe = new dbEntities()) 
{ 
    var dt = new dataTable(); 
    dt.Columns.Add("ID"); 
    dt.Columns.Add("Message"); 
    dt.Columns.Add("CreatedOn", typeof(DateTime)); 

    foreach (var row in randomDataSource) 
    { 
     dt.Rows.Add(
      row.id, 
      row.message, 
      DateTime.Now 
      ); 
    } 

    var tableType = new SqlParameter("tableType", SqlDbType.Structured); 
    tableType.Value = dt; 
    tableType.TypeName = "[dbo].[RandomTableType]"; 

    dbe.ExecuteStoreCommand(
     "EXEC [dbo].[SaveTable] @tableType", 
     new object[] { tableType } 
     ); 
} 

Problem pojawia się, gdy pole, które chcę dodać, ma typ binarny. tj .:

dt.Columns.Add("BinaryMessage", typeof(byte[])); 

odpowiedniej kolumny w bazie danych varbinary(MAX) drodze. Kiedy próbuję to uruchomić, pojawia się następujący błąd:

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

Jak mogę zmienić to, co mam, aby to działało?

+0

jak wiadomo bajt [] nie jest typem danych, użyj bajtu zamiast –

+0

Ale tablica jest typem danych ... – kei

Odpowiedz

9

Reprezentacja binarnego ciągu znaków w .NET to SqlBinary structure.

Chcesz dodać kolumnę tak:

dt.Columns.Add("BinaryMessage", typeof(SqlBinary)); 

Klasa SqlBinary ma explicit conversion to a byte array oraz implicit conversion from a byte array, więc wartość z tablicy bajtów do kolumny jest prosta sprawa przydziału, przy pobieraniu Tablica bajtów z kolumny wymaga jawnej obsady.

+2

+1 Dobrze znaleziony! Byłoby bardziej zrozumiałe, gdyby kod, który wysyła 'DataTable' off do SQL Server, rzucił wyjątek dla kolumny' typeof (byte []) '. Komunikat o błędzie SQL Server nie jest jasny. – Andomar

+0

@casperOne - Dziękujemy za opublikowanie tej odpowiedzi - naprawdę mi pomogło! Niestety [spotkałem podobny problem w przypadku krawędzi] (http://stackoverflow.com/questions/35782496/empty-datatable-causes-errors-when-table-valued-parameter-has-varbinary- typeses) . Chciałbym usłyszeć, jeśli masz jakieś myśli :-) –

Powiązane problemy