2011-09-06 47 views
5

estoy recibiendo esta excepción SQL follwing mientras que la inserción de una imagen en SQL Server 2008.¿Cómo almacenar imágenes en una columna varbinary (max)?

conversión implícita del tipo de datos nvarchar a varbinary (max) no está permitido. Utilice la función CONVERTIR para ejecutar esta consulta

En la base de datos El tipo de datos de la columna de imagen es Varbinary (MAX).

Por favor, ayúdenme en esto.

Editar

Código levantado de comentario

paramaters.Add(getParam("@imageFilePath", DbType.AnsiString, imageFilePath)); 
+0

Por favor, muestre el código que está utilizando para importar la imagen. –

+0

¿Está insertando la representación de base64 o algo así? Parece que el objeto 'SqlParameter' que está utilizando está configurado incorrectamente. – Tejs

Respuesta

2

Parece que usted está tratando de establecer los datos de imagen a una columna que se establece en el NVARCHAR (un texto básico) tipo de datos. Establezca los datos de la imagen en la columna correcta que sea VARBINARIA (MÁXIMA) o agregue esa columna a su tabla si aún no existe. O puede cambiar la columna actual que está utilizando al tipo de datos VARBINARIO (MÁXIMO) a través de un comando ALTER TABLE, si esa es de hecho la columna correcta y acaba de crearse con el tipo de datos incorrecto.

+0

Hola Mufasa, a continuación se agrega el método, creo que este es el problema de IAM obtener lo que es DBType necesito cambiar.por favor, ayúdame. paramaters.Add (getParam ("@ imageFilePath", DbType.AnsiString, imageFilePath)); – Indra

+0

No, debe hacer algo más que cambiar el tipo. No puede enviar a SQL Server la ruta del archivo que necesita para enviarle los datos binarios. –

+0

Soy nuevo en esto, ¿cómo puedo hacer? – Indra

13

utilizar esto para leer el archivo en una matriz de bytes:

// Old fashioned way 
    public static byte[] ReadFile(string filePath) 
    { 
     byte[] buffer; 
     FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read); 
     try 
     { 
      int length = (int)fileStream.Length; // get file length 
      buffer = new byte[length];   // create buffer 
      int count;       // actual number of bytes read 
      int sum = 0;       // total number of bytes read 

      // read until Read method returns 0 (end of the stream has been reached) 
      while ((count = fileStream.Read(buffer, sum, length - sum)) > 0) 
       sum += count; // sum is a buffer offset for next reading 
     } 
     finally 
     { 
      fileStream.Close(); 
     } 
     return buffer; 
    } 

o

// Thanks Magnus! 
    byte[] data = System.IO.File.ReadAllBytes(filePath); 

a continuación, guardar los datos de imagen utilizando esto (estoy usando una "instancia" clase de imagen que contiene mi información de imagen y matriz de bytes en instance.Data):

using(SqlCommand cm = new SqlCommand("SaveImage", connection, transaction)){ 
     cm.CommandType = CommandType.StoredProcedure; 
     cm.Parameters.Add(new SqlParameter("@Id", SqlDbType.Int,0, ParameterDirection.InputOutput, false, 10, 0, "Id", DataRowVersion.Current, (SqlInt32)instance.Id)); 
     cm.Parameters.Add(new SqlParameter("@Title", SqlDbType.NVarChar,50, ParameterDirection.Input, false, 0, 0, "Title", DataRowVersion.Current, (SqlString)instance.Title)); 
     if (instance.Data.Length > 0) 
     { 
      cm.Parameters.Add(new SqlParameter("@Data", SqlDbType.VarBinary,instance.Data.Length, ParameterDirection.Input, false, 0, 0, "Data", DataRowVersion.Current, (SqlBinary)instance.Data)); 
     } 
     else 
     { 
      cm.Parameters.Add(new SqlParameter("@Data", SqlDbType.VarBinary,0, ParameterDirection.Input, false, 0, 0, "Data", DataRowVersion.Current, DBNull.Value));      
     } 

     cm.ExecuteNonQuery(); 
    ) 

Y aquí hay un ejemplo de procedimiento almacenado:

CREATE PROCEDURE SaveImage 
(
@Id int OUTPUT 
,@Title nvarchar(50) 
,@Data varbinary(MAX) 
) 
AS 
SET NOCOUNT ON 
SET XACT_ABORT ON 

IF @Id IS NULL OR @Id <= 0 
BEGIN 
SELECT @Id = ISNULL(MAX([Id]),0) + 1 FROM [dbo].[Images] 
END 

INSERT INTO [dbo].[Images] (
[Id] 
,[Title] 
,[Data] 
) VALUES (
@Id 
,@Title 
,@Data 
) 
+9

System.IO.File.ReadAllBytes (filePath) – Magnus

+0

@Magnus Buena llamada. –

+0

Debe reemplazar "instance.Data.Length" en la línea Parameters.Add con "-1" para representar VARBINARY (MAX). –

4

que está recibiendo el error porque usted está tratando de insertar texto en una columna varbinary (max); por lo tanto, no está almacenando la imagen, sino la RUTA de la imagen.

Si sólo desea almacenar el PATH, cambiar su tipo de columna varbinary (max) a varchar (max) Si desea almacenar los bytes IMAGEN entonces necesita código para leer la imagen desde el archivo como una matriz de bytes y luego insertar los datos de este modo:

byte [] buffer = File.ReadAllBytes("Path/to/your/image/"); 
... 

SqlCommand command = .... 
command.CommandType=CommandType.StoredProcedure; 
command.Parameters.AddWithValue("@image",buffer); 
command.ExecuteNonQuery(); 

o

SqlCommand command = .... 
command.Text="INSERT INTO YOUR_TABLE_NAME (image) values (@image)"; 
command.Parameters.AddWithValue("@image",buffer); 
command.ExecuteNonQuery(); 
1

Tener un vistazo a estos dos artículos:

Ellos muestran no sólo cómo hacerlo, sino cómo hacerlo de manera eficiente utilizando semántica de la ruta.La solución ingenua de cargar toda la imagen en un byte en memoria [] consumirá demasiada memoria en su proceso ASP. El código que se muestra utiliza MVC, pero puede adaptarlo fácilmente a los formularios de APS.

Cuestiones relacionadas