Member 10984793 Ответов: 5

извлечение данных изображения в поле изображения


в моем приложении c# есть хранилище изображений в базе данных и извлечение изображений из базы данных в поле изображения.
вставка изображения в базу данных выполнена успешно, но считывание изображения невозможно.возникает одна ошибка "параметр недопустим"
// мой код c# находится здесь
// код для вставки изображения в базу данных приведен ниже

FileStream fs = new FileStream(textBox1.Text, FileMode.Open, FileAccess.Read);
byte[] imgbnry = new byte[fs.Length];

fs.Read(imgbnry, 0,imgbnry.Length);
fs.Close();
string str = "insert into tbl_img (id,photo)values('" + textBox3.Text + "','@img')";
SqlConnection con = new SqlConnection(@"DataSource=.\SQLEXPRESS;AttachDbFilename=C:\Users\Keltron_Project\Documents\sampl_pi.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True;");
con.Open();
SqlCommand cmd = new SqlCommand(str, con);

cmd.Parameters.AddWithValue("@img", imgbnry);
int n = cmd.ExecuteNonQuery();
if (n > 0)
{
    MessageBox.Show("Successfully inserted");
}
else
{
    MessageBox.Show("Not inserted");
}



// код для чтения изображения из базы данных приведен ниже

string str = "select photo from tbl_img where id='"+textBox2.Text+"'";
SqlConnection con = new SqlConnection(@"DataSource=.\SQLEXPRESS;AttachDbFilename=C:\Users\Keltron_Project\Documents\sampl_pi.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True;");
 con.Open();
 SqlDataAdapter da = new SqlDataAdapter(str,con);
 DataTable dt = new DataTable();
        
 da.Fill(dt);
 if (dt.Rows.Count > 0)
 {
 byte[] imgdata = new byte[0];
 imgdata = (byte[])dt.Rows[0][0];
  MemoryStream ms = new MemoryStream(imgdata);
 pictureBox1.Image = Image.FromStream(ms);      //error occurs here   "prameter is not valid"
 }
 else
{
 MessageBox.Show("No images in a table");
 }




пожалуйста помочь...
заранее спасибо

george4986

укажите длину буфера
"byte[] imgdata = new byte[0];" не работает

George Jonsson

Не используйте в тексте все заглавные буквы.
это считается криком, и это не очень вежливо.

Member 10984793

сори сэр,,,

George Jonsson

Не извиняйся, измени его.

5 Ответов

Рейтинг:
37

Member 3398321

Файлового потока ФС = новый хранилище FileStream(текстовое поле textbox1.Текста, Содержит Filemode.Открытия, Флагами Fileaccess.Читать);
byte[] imgbnry = новый байт[fs.Длина];

fs.Read(imgbnry, 0, imgbnry.Длина);
ПС.Рядом();
string str = "вставить в значения tbl_img (id,photo) ('" + textBox3.Text + "',@img)";

строка выпуска = @"сервер=\sqlexpress в COMP3;БД=база данных testdb;идентификатор пользователя=СА;пароль=cos123;";

Объект sqlconnection кон = новое sqlconnection(обл); //@"источник данных=.\Именем sqlexpress;ключевое слово attachdbfilename=С:\Пользователи\Keltron_Project\документы sampl_pi\.МДФ;Комплексная безопасность=true;в подключения таймаут=30;пользовательский экземпляр=true в;");
против.Открыть();
SqlCommand cmd = новая команда SqlCommand(str, con);

cmd.параметры.AddWithValue ("@img", imgbnry);
int n = cmd.Метод executenonquery();
если (n > 0)
{
Ящик для сообщений.Показать("успешно вставлено");
}
еще
{
Ящик для сообщений.Показать("не вставлено");
}


Member 10984793

понял...
спасибо

Рейтинг:
30

george4986

заменить код

FileStream fs = new FileStream(textBox1.Text, FileMode.Open, FileAccess.Read);
byte[] imgbnry = new byte[fs.Length];
fs.Read(imgbnry, 0,imgbnry.Length);
 fs.Close();


на вставке раздела с нижеприведенным кодом

Image image = 
////Image.FromFile(textBox1.Text);
Image.FromFile(@"C:\Users\ku102\Pictures\bitmap\usertile36.bmp");
MemoryStream ms = new MemoryStream();
image.Save(ms, ImageFormat.Bmp);
byte[] imgbnry = new byte[ms.Length];
ms.Position = 0;
ms.Read(imgbnry, 0, imgbnry.Length);


удачи ;-)


Member 10984793

я попробовал вышеприведенный код, но не сработал...
опять же происходит та же ошибка

george4986

можете ли вы разместить здесь значение dt.Rows[0][0]

Member 10984793

как разместить сообщение

george4986

скопируйте данные pic из поля таблицы базы данных и разместите здесь в качестве ответа.
keltron ? студент там?

Member 10984793

столбец фото базы данных содержит двоичные данные

Member 10984793

покажите только эту систему.[]

Member 10984793

любое решение, сэр...

george4986

проверьте обновленное решение .предполагая, что тип данных ur sql-varbinary(MAX)

Member 10984793

спасибо ... наконец-то понял...

Member 10984793

Большое спасибо!...

george4986

у р всегда добро пожаловать ;-)

Рейтинг:
2

Nithi999

SqlDataAdapter da = new SqlDataAdapter(str,con);


 byte[] picbyte = da["Your image column name"] as byte[] ?? null;
                        if (picbyte != null)
                        {
                            MemoryStream mstream = new MemoryStream(picbyte);
                            pictureBox1.Image = System.Drawing.Image.FromStream(mstream);
                            {
                                System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(mstream);
                            }

                        }


Maciej Los

4 года слишком поздно ;(

Рейтинг:
0

Garth J Lancaster

что произойдет, если вы замените это

byte[] imgdata = new byte[0];
imgdata = (byte[])dt.Rows[0][0];
MemoryStream ms = new MemoryStream(imgdata);


с этим

MemoryStream ms = new MemoryStream(byte[])dt.Rows[0][0]);


Другие вещи, которые вы могли бы попробовать, это писать

(byte[])dt.Rows[0][0]


к файлу на диске и посмотреть, действительно ли его образ действителен, и только один образ в потоке.

Сохраняете ли Вы размер оригинала в столбце базы данных, когда он хранится ? Если это так, я бы сравнил это с потоком памяти ms # байтов

Эта конструкция :-

Image.FromStream()


также может возникнуть "проблема", если класс Image не может определить тип изображения - например, png или bmp


Member 10984793

как записать в файл

Member 10984793

пожалуйста, помогите....

Рейтинг:
0

Member 10911231

private void button1_Click(object sender, EventArgs e)
{
    Image tempImage;
    using (var conn = new SqlConnection("myconnectionstring"))
    {
        conn.Open();
        using (
            var cmd = new SqlCommand("SprocToGetImageBytes", conn) {CommandType = CommandType.StoredProcedure})
        {
            using (var rdr = cmd.ExecuteReader())
            {
                var buffer = (byte[])rdr[0];
                using (var ms = new MemoryStream(buffer))
                {
                    tempImage = Image.FromStream(ms); //theres your image.
                    pictureBox1.Image = tempImage;
                    pictureBox1.Refresh();
                }
            }
        }
    }
}


Member 10984793

опять же возникает та же проблема

Member 10984793

кто-нибудь мне поможет.......

Member 10911231

Вы должны использовать sqltype с параметром во время вставки и повторного выполнения....

Member 10911231

typeof(SqlBinary)

Member 10984793

понял....