使用图像作为数据库表列

时间:2010-10-19 18:37:59

标签: c# sql sql-server collections

我有一个数据库(sql server 2008),我在visual studio 2010中使用c#。

我想与我的数据库建立连接。我已经为此编写了如下代码:

    SqlConnection mySqlConnection = new SqlConnection
    ("Data Source=servername\\SQL2008; Initial Catalog=MyData;UID=MyID;PWD=mypassword;");

    SqlCommand mySqlCommand = mySqlConnection.CreateCommand();
    mySqlCommand.CommandText = "SELECT image_column FROM images_table ";

    mySqlConnection.Open();

    SqlDataReader productsSqlDataReader = mySqlCommand.ExecuteReader();

我不知道如何继续前进。我的意思是在执行上述语句后如何从阅读器中提取列?此外,我需要逐行遍历整个列并将每个图像转换为IContent项。我是否必须为此编写自己的转换器,或者是否有任何.NET类已经执行此操作?

继承人的情景。我有一个20列的表,其中一列是images_column。该列是唯一的列,其中的图像存储为二进制数据。 remainingig列是通常的整数(其大小值)和与该特定图像相关联的字符串(其名称,位置等)。我希望现在很清楚。

感谢。

3 个答案:

答案 0 :(得分:1)

根据您在数据库中保存图像的方式,可以使用Bitmap类提取它们。它的构造函数需要几个不同的参数,例如Stream。例如。

您可以使用其Read功能从阅读器获取数据。如果你有一个有效的行,它会告诉你一个bool。您可以在if语句或while语句中使用它。

将数据从数据库列提供给MemoryStream,并将其提供给Bitmap构造函数。

while (productsSqlDataReader.Read()) {
    MemoryStream stream = new MemoryStream((byte[])productsSqlDataReader["image_column"]);
    new Bitmap(stream);
}

答案 1 :(得分:0)

我不确定您的问题究竟是什么,但要将图片作为Bitmap与您的读者一起从列中删除,您可以使用以下内容。

while (productsSqlDataReader.Read())
{
    byte[] buf = productsSqlDataReader["image_column"] as byte[];

    using (MemoryStream ms = new MemoryStream(buf))
    {
       Bitmap bmp = Bitmap.FromStream(ms);
       //do whatever with the bitmap BEFORE you dispose the stream
    }
}

答案 2 :(得分:0)

        string conn = "Data Source=servername\\SQL2008; Initial Catalog=MyData;UID=MyID;PWD=mypassword;";
        using (SqlConnection dbConn = new SqlConnection(conn))
        {
            dbConn.Open();
            string sql = "SELECT DATALENGTH(image_column), image_column FROM images_table ";
            using (SqlCommand cmd = new SqlCommand(sql, dbConn))
            {
                using (SqlDataReader reader = cmd.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        int size = reader.GetInt32(0);
                        byte[] buff = new byte[size];
                        reader.GetBytes(1, 0, buff, 0, size);
                        MemoryStream ms = new MemoryStream(buff, 0, buff.Length);
                        ms.Write(buff, 0, buff.Length);
                        StoreImage(Image.FromStream(ms, true));
                    }
                }
            }
        }