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

Ind*_*dra 6 c# sql sql-server sql-server-2008

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

不允许从数据类型nvarchar到varbinary(max)的隐式转换.使用CONVERT函数运行此查询

在数据库中,Image列的数据类型是Varbinary(MAX).

编辑

代码解除了评论

paramaters.Add(getParam("@imageFilePath", DbType.AnsiString, imageFilePath));
Run Code Online (Sandbox Code Playgroud)

Bah*_*gor 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;
    }
Run Code Online (Sandbox Code Playgroud)

要么

    // Thanks Magnus!
    byte[] data = System.IO.File.ReadAllBytes(filePath);
Run Code Online (Sandbox Code Playgroud)

然后使用此保存图像数据(我使用的图像类"实例"包含我在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();
   )
Run Code Online (Sandbox Code Playgroud)

这是一个示例存储过程:

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
)
Run Code Online (Sandbox Code Playgroud)

  • System.IO.File.ReadAllBytes(文件路径) (9认同)

Ica*_*rus 5

您收到错误是因为您试图将文本插入到 varbinary(max) 列中;因此,您不是在存储图像,而是存储图像的路径。

如果你只希望存储路径,从VARBINARY(最大值)字段类型更改为varchar(最大值)。如果你想保存的图片字节,那么你需要的代码来读取文件中的图像作为字节数组,然后你像这样插入数据:

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

SqlCommand command = ....
command.CommandType=CommandType.StoredProcedure;
command.Parameters.AddWithValue("@image",buffer);
command.ExecuteNonQuery();
Run Code Online (Sandbox Code Playgroud)

或者

SqlCommand command = ....
command.Text="INSERT INTO YOUR_TABLE_NAME (image) values (@image)";
command.Parameters.AddWithValue("@image",buffer);
command.ExecuteNonQuery();
Run Code Online (Sandbox Code Playgroud)


Jon*_*ams 2

您似乎正在尝试将图像数据设置为设置为 NVARCHAR(基本文本)数据类型的列。将图像数据设置为正确的 VARBINARY(MAX) 列,或者将该列添加到表中(如果尚不存在)。或者,您可以通过 ALTER TABLE 命令将当前使用的列更改为 VARBINARY(MAX) 数据类型(如果该列确实是正确的列并且只是使用错误的数据类型创建的)。