2012-09-18 14 views
6

He estado reutilizando este método de uso de una DataTable como parámetro para un procedimiento almacenado y ha funcionado muy bien. Este es el código de trabajo simplificado:DataTable con un campo byte [] como parámetro de un procedimiento almacenado

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

El problema surge cuando el campo que deseo agregar es de tipo binario. es decir .:

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

la columna correspondiente en la base de datos es varbinary(MAX) por cierto. Cuando trato de ejecutar esto, me sale este error:

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

¿Cómo puedo modificar lo que tengo que hacer este trabajo?

+0

como usted puede saber byte [] no es un tipo de datos, use byte en lugar de –

+0

Pero una matriz es un tipo de datos ... – kei

Respuesta

9

La representación de una cadena binaria en .NET es SqlBinary structure.

Si desea añadir su columna de la siguiente manera:

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

La clase SqlBinary tiene un explicit conversion to a byte array y un implicit conversion from a byte array, por lo que el valor de una matriz de bytes en la columna es una simple cuestión de asignación, al obtener una la matriz de bytes de la columna requiere un molde explícito.

+2

+1 ¡Bien encontrado! Sería más claro si el código que envía el 'DataTable' a SQL Server lanzó una excepción para una columna' typeof (byte []) '. El mensaje de error de SQL Server es todo menos claro. – Andomar

+0

@casperOne - Gracias por publicar esta respuesta - ¡realmente me ayudó! Desafortunadamente, [He encontrado un problema similar en un caso límite] (http://stackoverflow.com/questions/35782496/empty-datatable-causes-errors-when-table-valued-parameter-has-varbinary-types) . Me encantaría saber si tienes alguna idea :-) –

Cuestiones relacionadas