Goran Bibic Ответов: 3

Выберите изображение из базы SQL C#


Этот код работает нормально.

Имя столбца для изображения в sql-это данные.

В этом коде мне нужно, чтобы положить внутрь базы данных формируют изображение в элемент управления PictureBox

Некоторая помощь

Что я уже пробовал:

private void prijavaAction()  //04.04. final doradjena perfect
       {

           {
               SqlConnection con = new SqlConnection(cs);

               if (textBox1.Text.All(char.IsDigit))

               {
                   string queryString = "SELECT [ime_prezime] FROM dbo.radnici WHERE bar_kod = '" + textBox1.Text + "'";// pronaci radnika u bazi
                   using (SqlConnection connection = new SqlConnection(cs))
                   {
                       SqlCommand command = new SqlCommand(queryString, connection);
                       connection.Open();
                       SqlDataReader reader = command.ExecuteReader();



                       string commanda = "select case when (SELECT (DATEDIFF(SECOND, Max(vrijemeprijave), GETDATE()) / 60) from dbo.prijava_radnika where status='prijavljen' and radnik= (" + queryString + ")) < 5 THEN 1 ELSE 0 END";
                       SqlConnection connection3 = new SqlConnection(cs);
                       SqlCommand command2 = new SqlCommand(commanda, connection3);
                       connection3.Open();

                       int broj = Convert.ToInt32(command2.ExecuteScalar());



                       string commanda2 = "select case when (SELECT (DATEDIFF(SECOND, Max(vrijemeodjave), GETDATE()) / 60) from dbo.prijava_radnika where status='odjavljen' and radnik= (" + queryString + ")) < 5 THEN 1 ELSE 0 END";
                       SqlConnection connection4 = new SqlConnection(cs);
                       SqlCommand command4 = new SqlCommand(commanda2, connection4);
                       connection4.Open();

                       int broj2 = Convert.ToInt32(command4.ExecuteScalar());

                       if (broj == 1 || broj2 == 1)

                       {
                           notificationPanel.BackColor = System.Drawing.ColorTranslator.FromHtml("#FD7400");
                           messageLabel.Text = "Prijava i odjava su blokirani 5 minuta \nza ovog radnika";
                           textBox1.Text = "";
                       }
                       else
                       {




                           try
                           {
                               if (reader.Read())

                               {

                                   string prijava = "SELECT count(*) from dbo.prijava_radnika where vrijemeprijave is not null and vrijemeodjave is null and radnik = '" + readerresultTextbox.Text + "' and redni_broj is NULL";
                                   SqlCommand provjeraprijaveradnika = new SqlCommand(prijava, con);
                                   con.Open();
                                   int result = Convert.ToInt32(provjeraprijaveradnika.ExecuteScalar());

                                   con.Close();
                                   if ((result == 0))

                                   {
                                       String saveStaff = "INSERT INTO dbo.prijava_radnika (vrijemeprijave, status, radnik,idfakture) VALUES(@vrijemeprijave,'prijavljen', '" + readerresultTextbox.Text + "',@idfakture)";
                                       using (SqlConnection openCon2 = new SqlConnection(cs))
                                       {
                                           using (SqlCommand querySaveStaff = new SqlCommand(saveStaff))
                                           {
                                               querySaveStaff.Connection = openCon2;
                                               querySaveStaff.Parameters.Add("@vrijemeprijave", SqlDbType.DateTime).Value = DateTime.Now;
                                               querySaveStaff.Parameters.Add("@idfakture", SqlDbType.Int).Value = id_fakture;
                                               openCon2.Open();
                                               querySaveStaff.ExecuteNonQuery();
                                               openCon2.Close();

                                               notificationPanel.BackColor = System.Drawing.ColorTranslator.FromHtml("#2EFF36");
                                           //  messageLabel.Text = (reader["ime_prezime"].ToString()) + " je prijavljen u \n " + DateTime.Now.ToString("dd.MM.yyyy HH:mm:ss");
                                               messageLabel.Text = ("Dobro došli na posao...\n" + reader["ime_prezime"].ToString()) + " \nPrijavljeni ste od\n " + DateTime.Now.ToString("dd.MM.yyyy HH:mm:ss");
                                               readerresultTextbox.Text = (reader["ime_prezime"].ToString());
                                           }
                                       }
                                   }
                                   else
                                   {

                                       String updateStaff = " declare @maxNo integer = 0 select @maxNo = isnull(max(redni_broj), 0) from[dbo].[prijava_radnika] UPDATE[dbo].[prijava_radnika] SET"
                                           + " [vrijemeodjave] = @vrijemeodjave,[redni_broj] = (@maxNo+1),[status] = 'odjavljen' WHERE radnik = '" + readerresultTextbox.Text + "'and [status] = 'prijavljen'";



                                       using (SqlConnection connection1 = new SqlConnection(cs))
                                       {
                                           SqlCommand command1 = new SqlCommand(queryString, connection1);
                                           connection1.Open();
                                           SqlDataReader reader1 = command1.ExecuteReader();
                                           connection.Close();
                                           try
                                           {
                                               if (reader1.Read())
                                               {


                                                   using (SqlConnection openCon3 = new SqlConnection(cs))
                                                   {
                                                       using (SqlCommand queryupdateStaff = new SqlCommand(updateStaff))
                                                       {
                                                           queryupdateStaff.Connection = openCon3;
                                                           queryupdateStaff.Parameters.Add("@vrijemeodjave", SqlDbType.DateTime).Value = DateTime.Now;
                                                           openCon3.Open();
                                                           queryupdateStaff.ExecuteNonQuery();
                                                           openCon3.Close();

                                                       }
                                                   }

                                                   notificationPanel.BackColor = System.Drawing.ColorTranslator.FromHtml("#FFE11A");
                                                   messageLabel.Text = (reader1["ime_prezime"].ToString()) + " je odjavljen u \n " + DateTime.Now.ToString("dd.MM.yyyy HH:mm:ss");
                                               }
                                           }
                                           catch { }


                                       }



                                       reader.Close();
                                   }

                               }
                               else
                               {
                                   notificationPanel.BackColor = System.Drawing.ColorTranslator.FromHtml("#FD7400");
                                   messageLabel.Text = "Radnik ne postoji u bazi! \nProverite vašu karticu ili probajte ponovo!";
                                   textBox1.Text = "";


                               }
                           }
                           finally
                           {

                           }
                       }



                   }
               }

               else
               {
                   notificationPanel.BackColor = System.Drawing.ColorTranslator.FromHtml("#FD7400");
                   messageLabel.Text = "Bar kod nije važeci ili nije bar kod";
                   textBox1.Text = "";
               }





           }
       }

Richard Deeming

Ваш код уязвим для SQL-инъекция[^]. НИКОГДА используйте конкатенацию строк для построения SQL-запроса. ВСЕГДА используйте параметризованный запрос.

Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]
Шпаргалка по параметризации запросов | OWASP[^]

using (SqlConnection connection2 = new SqlConnection(cs))
using (SqlCommand command3 = new SqlCommand("SELECT [data] FROM dbo.radnici WHERE ime_prezime = @ime_prezime", connection2))
{
    command3.Parameters.AddWithValue("@ime_prezime", readerresultTextbox.Text);
    
    // No need to use ExecuteReader for a single value:
    object data = command3.ExecuteScalar();
    if (data != null && !Convert.IsDBNull(data))
    {
        using (var stream = new MemoryStream((byte[])data))
        {
            pictureBox.Image = Image.FromStream(stream);
        }
    }
}

Richard Deeming

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

Я сдаюсь. Вам явно не нужна наша помощь, так зачем же просить об этом?

3 Ответов

Рейтинг:
27

Eric Lynch

Вам придется заглянуть в отладчик, но обычно тип данных для данных изображения таков byte[] Итак, ваша проблема заключается в том, чтобы преобразовать из byte[] к Image Если это так, то что-то вроде следующего должно сделать трюк:

using (var stream = new MemoryStream((byte[])reader4["data"]))
  pictureBox.Image = Image.FromStream(stream);


Удачи, надеюсь, это поможет.


Goran Bibic

Спасибо

Goran Bibic

Маленький дополнительный вопрос...

Если столбец данных un sql null(нет загруженных изображений...)?

Чтобы показать какую-то картинку по умолчанию или?

Некоторые рекомендации

Eric Lynch

Пожалуйста. Просто проверьте, если reader4["data"] == DBNull.Ценность. Если да, то установите pictureBox.Изображение к другому значению. Я рекомендую добавить изображение в файл ресурсов и использовать его.

Goran Bibic

Спасибо...но если у меня есть несколько рабочих, то у меня нет всех фотографий...спасибо за помощь

Eric Lynch

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

Вы действительно должны сделать это привычкой использовать параметры SQL. В конце концов, вы напишете веб-приложение. Если вы не сделаете это привычкой, даже в своем "игровом" коде, вы в конечном итоге сделаете ошибку и позволите ей проскользнуть в ваш "реальный" код.

Это делает его очень, очень легким (слишком легким) даже для неквалифицированного хакера, чтобы сделать неприятные вещи происходят. Это один из лучших методов, которые используют хакеры.

Я знаю, что это может показаться чем-то, о чем не стоит беспокоиться в Вашем "игровом" коде. Однако это действительно довольно опасно.

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

Так или иначе, конец лекции...Я надеюсь, что вы сможете решить все оставшиеся проблемы и заставить ваше приложение работать так, как вы хотите. Удачи и счастливого кодирования :)

Рейтинг:
1

Goran Bibic

ВКЛ наконец добавляю но у меня есть ошибка

Error CS0029 Cannot implicitly convert type 'string' to 'System.Drawing.Image' 


string slika = "SELECT [data] FROM dbo.radnici WHERE ime_prezime = '" + readerresultTextbox.Text + "'";// pronaci radnika u bazi
using (SqlConnection connection2 = new SqlConnection(cs))
{
    SqlCommand command3 = new SqlCommand(slika, connection2);
    connection2.Open();
    SqlDataReader reader4 = command3.ExecuteReader();
    connection2.Close();
    if(reader4.Read())
    {
        pictureBox.Image = (reader4["data"].ToString());
    }
    else
    {
        //
    }
}


Richard Deeming

Если вы хотите обновить свой вопрос, Нажмите зеленую ссылку "улучшить вопрос" и отредактируйте свой вопрос.

НЕ опубликуйте свое обновление как "решение".

Goran Bibic

Спасибо

Рейтинг:
0

Wendelius

Как уже указывалось, вам нужно обрабатывать данные в двоичном формате. Для получения полного примера взгляните на c# - извлечение изображений из базы данных sql server - переполнение стека[^]

Иные вопросы
- Вы должны использовать параметры в своих запросах. Как уже указывалось вы в конечном итоге столкнетесь с проблемами при простой конкатенации строк В оператор SQL
- Пустой блок catch, если возникает ошибка, вы опускаете все исключения, потому что у вас есть пустой блок catch. Вы должны по крайней мере показать сообщение пользователю, чтобы сообщить о неудачном выполнении
- Несколько соединений. Похоже, что вы открываете несколько соединений во время выполнения, почему? Это только добавляет ненужный код и замедляет работу программы