将数据存储在数据库中时的图像大小

时间:2016-02-25 11:39:12

标签: c# sql-server database image winforms

我面临着关于图像尺寸的奇怪问题。

我制作了一个简单的应用程序,用于在数据库中存储和检索图像。当我从文件中读取图像时,其大小以kB(千字节)为单位,字节数组的长度也是如此。

有两个图片盒。 pb1用于存储,pb2用于加载。

我的store()和load()方法如下:

  

注意:openConnState()和CloseConnState()是关闭和打开连接的方法。 byte [] img_byte和imgfilelength = 0在类中公开定义。

商品

private void StoreImage(string ChosenFile)
{
    try
    {
        //MemoryStream ms = new MemoryStream();
        //pb1.Image.Save(ms, ImageFormat.Jpeg);
        //img_byte = new byte[ms.Length];
        //ms.Position = 0;
        //ms.Read(img_byte, 0, img_byte.Length);

        FileInfo fileImage = new FileInfo(ChosenFile);
        imgfilelength = fileImage.Length;
        FileStream fs = new FileStream(ChosenFile, FileMode.Open, FileAccess.Read, FileShare.Read);
        img_byte = new Byte[Convert.ToInt32(imgfilelength)];
        int count, sum = 0;

        while ((count = fs.Read(img_byte, 0, Convert.ToInt32(imgfilelength))) > 0)
        {
            sum += count;
        }

        //int byteread = fs.Read(img_byte, 0, Convert.ToInt32(imgfilelength));
        fs.Close();
    }
    catch (Exception e)
    {
        throw e;
    }
}

public void storetoDB()
{
    OpenConnState(conn);
    string str = "use db2 \n insert into TableImg(Image) \n values('" + img_byte + "')";
    SqlCommand cmd = new SqlCommand(str, conn);

    try
    {
        cmd.ExecuteNonQuery();
    }
    catch (Exception e)
    {
        throw e;
    }
    finally
    {
        CloseConnState(conn);
    }
}

负载:

public void Loadimg()
{
    try
    {
        pb2.Image = null;
        byte[] getbyte = LoadImagefromDB(3);

        using (MemoryStream ms = new MemoryStream(getbyte))
        {
            pb2.Image = Image.FromStream(ms);
        }
        pb2.Refresh();

    }
    catch (Exception e)
    {
        throw e;
    }
}

public byte[] LoadImagefromDB(long pid)
{
    byte[] img = null;
    OpenConnState(conn);
    string str = "use db2 \n select Image from TableImg where P_Id = " + pid;
    SqlCommand cmd = new SqlCommand(str, conn);

    try
    {
        img = (byte[])cmd.ExecuteScalar();

        return img;
    }
    catch (System.Exception e)
    {
        throw e;
    }
    finally
    {
        CloseConnState(conn);
    }
}

我使用上面给出的storeDB()方法将图像存储到数据库中,但是当我使用上面给出的load()方法检索图像时,出现错误,指出参数无效。我发现问题很可能与字节数组的长度有关,因为当我检索到'图像'将数据库的数据类型值转换为字节数组,字节数组的长度始终为13。

我甚至运行以下查询来获取其在数据库中的大小,它仍然是相同的,即13个字节。

  

从TableImg中选择len(转换(varbinary(max),Image)),其中P_Id = 1

谁能告诉我,为什么?

1 个答案:

答案 0 :(得分:2)

  

我将数据库的'image'数据类型值检索到一个字节数组中,   字节数组的长度始终为13。

您正在尝试这样做:

use db2 \n insert into TableImg(Image) \n values('System.Byte[]')

显然,字符串System.Byte[]的长度总是 13。

在插入之前,您必须将该二进制数据转换为其他类型。

根据this post,如果您的图片的字节数非常小,则可以将其存储为VARBINARY类型。如果它很大,你应该将它存储在驱动器中。

修改

您可以这样使用:

using (SqlCommand cmd = new SqlCommand("use db2 \n insert into TableImg(Image) \n values(@binaryValue)", conn))
{
    cmd.Parameters.Add("@binaryValue", SqlDbType.VarBinary, img_byte.Length).Value = img_byte;
    cmd.ExecuteNonQuery();
}