C# 将图像作为数据库表列使用

C# 将图像作为数据库表列使用,c#,sql,sql-server,collections,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 mySqlComma

我有一个数据库(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\u列。该列是唯一将图像作为二进制数据存储在中的列。剩余列是与特定图像关联的常用整数(其大小值)和字符串(其名称、位置等)。我希望现在已经清楚了


谢谢。

从你的问题来看,我不确定你到底想完成什么,但是要用你的阅读器将图像作为
位图
,你可以使用以下方法

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
    }
}

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

您可以使用读卡器的函数从读卡器获取数据。它会给你一个bool,让你知道你是否有一个有效的行。您可以在if语句或while语句中使用它

例如,将数据库列中的数据馈送到MemoryStream,并将其提供给位图构造函数

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

谢谢我计划使用该图像并将其转换为我的web应用程序的IContent。IContent是一个Telerik.Cms.Engine(内容管理系统)类,用作各种web功能(如博客、新闻等)的通用接口。通过将其转换为IContent项,我以后可以使用它做更多的事情。也许有一种方法可以从字节数组创建IContent类?顺便说一句,正如Patrick在回答中所说的,您需要调用Read()。我漏掉了那部分。史蒂夫,你是不是假设整栏只有一张图片?不确定整栏只有一张图片是什么意思。我假设每行每列1个图像,但正如我所说,您必须像Patrick所说的那样调用Read()。我编辑以显示。以下是场景。我有一个表,大约有20列,其中一列是images\u列。该列是唯一将图像作为二进制数据存储在中的列。剩余列是与特定图像关联的常用整数(其大小值)和字符串(其名称、位置等)。我希望现在已经清楚了。谢谢我也会把它贴在主要问题上如果列中有1个以上的图像,这是否有效?这看起来像是将整个列作为字节缓冲区,是吗?在这种情况下,如何将每个图像视为字节数组?@VP:数据库中的同一行中有多个图像,还是每行一个图像?如果您在一列中有多个图像,您需要一种方法来确定它们的大小,不幸的是,图像处理超出了我的知识范围。如果在同一个单元格中有多个图像,我可以问一下原因吗?如果每个单元格有一个图像(即,每列和每行一个),则while循环中的每个循环中都有一个图像。我有一个表,大约有20列,其中一列是images\u列。该列是唯一将图像作为二进制数据存储在中的列。剩余列是与特定图像关联的常用整数(其大小值)和字符串(其名称、位置等)。我希望现在已经清楚了。谢谢我也会把它贴在主要问题上。@VP:但是你说“与那个特定的图像相关”。您是每行有一个图像,还是在特定单元格中有多个图像?如果您每行有一个图像,上述解决方案将起作用。我每行只有一个图像,表中只有一列有图像。您能给我们一个提示,说明什么是
IContent
,这将帮助我们极大地帮助您。这听起来像是一个接口,是有一个工厂类来创建它们,还是有一个实际的ImageContent类可以使用?谢谢J。看起来很优雅。
        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));
                    }
                }
            }
        }