c# – 如何将图像存储到varbinary(max)列?

我在将一个 Image插入sql server 2008时遇到了这个以下的sql异常.

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

数据库中,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,ParameterDirection.InputOutput,false,10,"Id",DataRowVersion.Current,(sqlInt32)instance.Id));
       cm.Parameters.Add(new sqlParameter("@Title",sqlDbType.NVarChar,50,ParameterDirection.Input,"Title",(sqlString)instance.Title));
       if (instance.Data.Length > 0)
       {
           cm.Parameters.Add(new sqlParameter("@Data",sqlDbType.VarBinary,instance.Data.Length,"Data",(sqlBinary)instance.Data));
       }
       else
       {
           cm.Parameters.Add(new sqlParameter("@Data",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
)

相关文章

在项目中使用SharpZipLib压缩文件夹的时候,遇到如果目录较深,则压缩包中的文件夹同样比较深的问题。比...
项目需要,几十万张照片需要计算出每个照片的特征值(调用C++编写的DLL)。 业务流程:选择照片...
var array = new byte[4]; var i = Encoding.UTF8.GetBytes(100.ToString(&quot;x2&quot;));//...
其实很简单,因为Combox的Item是一个K/V的object,那么就可以把它的items转换成IEnumerable&lt;Dic...
把.net4.6安装包打包进安装程序。 关键脚本如下: 头部引用字符串对比库 !include &quot;WordFunc....
项目需求(Winform)可以批量打印某个模板,经过百度和摸索,使用iTextSharp+ZXing.NetʿreeSp...