работа с изображениями в качестве столбца таблицы базы данных - PullRequest
4 голосов
/ 19 октября 2010

У меня есть база данных (sql server 2008), и я работаю с c # в visual studio 2010.

Я хочу установить соединение с моей базой данных.Я написал код для этого следующим образом:

    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.Этот столбец является единственным столбцом, в котором изображения хранятся в виде двоичных данных.Остальные столбцы - это обычные целые числа (значение размера) и строки (его имя, местоположение и т. Д.), Связанные с этим конкретным изображением.Я надеюсь, что теперь все ясно.

Спасибо.

Ответы [ 3 ]

1 голос
/ 19 октября 2010

В зависимости от того, как вы сохраняете изображение в базе данных, вы можете извлечь его, используя класс Bitmap .Он принимает несколько различных аргументов для своих конструкторов, в том числе, например, Stream.

Вы получаете данные из считывателя, используя его функцию Read .Это дает вам бул, чтобы вы знали, есть ли у вас действительный ряд или нет.Вы можете использовать это в операторе if или while.

Передайте данные из столбца базы данных в MemoryStream, например, и передайте их конструктору Bitmap.

while (productsSqlDataReader.Read()) {
    MemoryStream stream = new MemoryStream((byte[])productsSqlDataReader["image_column"]);
    new Bitmap(stream);
}
0 голосов
/ 21 октября 2010
        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));
                    }
                }
            }
        }
0 голосов
/ 19 октября 2010

Я не уверен по вашему вопросу, что именно вы пытаетесь сделать, но чтобы получить изображение из колонки как 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
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...