2011-09-06 12 views
5

sto ottenendo questo follwing eccezione SQL durante l'inserimento di un'immagine in sql server 2008.Come memorizzare le immagini in una colonna varbinary (max)?

conversione implicita da tipo di dati nvarchar al varbinary (max) non è permesso. Utilizzare la funzione CONVERT per eseguire questa query

Nel database Tipo di dati della colonna immagine è Varbinary (MAX).

Per favore aiutatemi su questo.

Modifica

Codice sollevato dal commento

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

Mostrare il codice che si sta utilizzando per importare l'immagine. –

+0

Stai inserendo la rappresentazione base64 o qualcosa del genere? Sembra che l'oggetto 'SqlParameter' che stai utilizzando sia configurato in modo errato. – Tejs

risposta

2

Sembra che si sta tentando di impostare i dati di immagine a una colonna che è impostato al NVARCHAR (una base di testo) tipo di dati. O imposta i dati dell'immagine sulla colonna corretta che è VARBINARY (MAX) - o aggiungi quella colonna alla tua tabella se non esiste ancora. Oppure puoi cambiare la colonna corrente che stai utilizzando con il tipo di dati VARBINARY (MAX) tramite un comando ALTER TABLE, se questa è effettivamente la colonna corretta ed è stata appena creata con il tipo di dati errato per iniziare.

+0

Ciao Mufasa, di seguito è aggiunto il metodo penso che sia un problema iam ottenere ciò che è dbType ho bisogno di cambiare. Per favore aiutatemi. paramaters.Add (getParam ("@ imageFilePath", DbType.AnsiString, imageFilePath)); – Indra

+0

No - Devi fare di più che cambiare il tipo. Non è possibile inviare a SQL Server solo il percorso del file necessario per inviarlo ai dati binari. –

+0

Sono nuovo di questo come posso fare? – Indra

13

Utilizzare questo per leggere il file in un array di byte:

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

quindi salvare i dati di immagine utilizzando questo (Se si utilizza una "istanza" classe di immagine che contiene il mio informazioni di immagine e matrice di byte in 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(); 
    ) 

e qui è una procedura immagazzinata esempio:

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 Buona chiamata. –

+0

È necessario sostituire "instance.Data.Length" nella riga Parameters.Add con "-1" per rappresentare VARBINARY (MAX). –

4

Si riceve l'errore perché si sta tentando di inserire del testo in una colonna varbinary (max); quindi, non stai memorizzando l'immagine ma piuttosto il PERCORSO all'immagine.

Se desideri solo memorizzare il PATH, modificare il tipo di colonna da varbinary (max) a varchar (max) Se si desidera memorizzare i byte IMAGE allora avete bisogno codice per leggere l'immagine dal il file come un array di byte e poi inserire i dati in questo 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(); 
Problemi correlati