簡體   English   中英

如何將圖像存儲到varbinary(max)列?

[英]How to store images to a varbinary(max) column?

我在將一個Image插入sql server 2008時遇到了這個以下的SQL異常。

不允許從數據類型nvarchar到varbinary(max)的隱式轉換。 使用CONVERT函數運行此查詢

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

編輯

代碼解除了評論

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

使用它將文件讀入字節數組:

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

然后使用此保存圖像數據(我使用的圖像類“實例”包含我在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();
   )

這是一個示例存儲過程:

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
)

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

如果您只想存儲PATH ,請將列類型從varbinary(max)更改為varchar(max)如果您確實要存儲IMAGE BYTES,那么您需要代碼從文件中讀取圖像作為字節數組,然后您像這樣插入數據:

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

您似乎正在嘗試將圖像數據設置為設置為NVARCHAR(基本文本)數據類型的列。 將圖像數據設置為VARBINARY(MAX)的正確列 - 或者如果該列尚不存在,則將該列添加到表中。 或者,您可以通過ALTER TABLE命令將當前使用的列更改為VARBINARY(MAX)數據類型,如果確實是正確的列,則只是使用錯誤的數據類型創建它。

看看這兩篇文章:

它們不僅顯示了如何操作,還顯示了如何使用流語義有效地完成它。 將整個圖像加載到內存byte []中的天真解決方案將在ASP進程中消耗太多內存。 顯示的代碼使用MVC,但您可以輕松地將其調整為APS表單。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM