2011-09-06 102 views
5

同時插入一個圖像到SQL服務器從數據類型爲nvarchar到VARBINARY(最大)2008如何將圖像存儲到varbinary(max)列?

隱式轉換我正在此follwing SQL異常沒有 允許的。使用CONVERT功能運行此查詢

在數據庫中Image列數據類型是Varbinary(MAX)。

請幫我解決這個問題。

編輯

代碼從評論

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

請顯示您用於導入圖像的代碼。 –

+0

你插入base64表示或什麼?這聽起來像你正在使用的'SqlParameter'對象配置不正確。 – Tejs

回答

2

它看起來像你想的圖像數據設置爲被設置爲NVARCHAR(基本文本)數據類型的列解除。將圖像數據設置爲VARBINARY(MAX)的正確列 - 或者將該列添加到表中(如果它尚不存在)。或者,您可以通過ALTER TABLE命令將當前正在使用的列更改爲VARBINARY(MAX)數據類型,如果這確實是正確的列並且剛創建的數據類型是錯誤的。

+0

嗨Mufasa,下面是添加方法,我認爲這裏是問題,我得到什麼是dbType我需要change.please幫助我。 (getParam(「@ imageFilePath」,DbType.AnsiString,imageFilePath)); – Indra

+0

否 - 您需要做的不僅僅是改變類型。你不能僅僅向SQL Server發送你需要發送二進制數據的文件路徑。 –

+0

我是新手,我該怎麼辦? – Indra

13

使用此文件讀入到一個字節數組:使用這個(我用的圖像類「實例」包含

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

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

然後將圖像數據保存我的圖像信息和字節數組)實例。數據):

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

這裏是一個示例存儲過程:

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良好的調用。 –

+0

您應該將Parameters.Add行中的「instance.Data.Length」替換爲「-1」以表示VARBINARY(MAX)。 –

4

您正在嘗試將文本插入到varbinary(max)列中;因此,您不是存儲圖像,而是存儲圖像的PATH。

如果只想存儲PATH,字段類型從VARBINARY(最大值)爲varchar(最大) 改變,如果你想存儲圖片字節那麼你需要的代碼來讀取圖像該文件作爲一個字節數組,然後你插入的數據,像這樣:

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

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

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