Member 11856456 Ответов: 1

Как получить несколько изображений и отобразить их внутри панели управления из базы данных SQL?


Итак, во время моего кодирования я пытался отобразить свои изображения, которые находятся внутри базы данных sql, на панели управления. Как я пытаюсь настроить его, так это для изображений, которые имеют imageID = 1, будут помещены в Панель управления. Я хотел бы получить его там, где он совпадает с другими таблицами, поэтому, если я нажму на человека и его ID = любое число, любые изображения, связанные с этим числом, появятся в панели управления.

Вот мой код:
  sqlcon.Open()
            Dim cmd As SqlClient.SqlCommand
            Dim sql As String = "SELECT Images FROM [Table] WHERE ImageID= '" + DataGridView1.Rows(I).Cells(2).Value.ToString + "'"
            cmd = New SqlClient.SqlCommand(sql, sqlcon)

            Dim img() As Byte = DataGridView1.Rows(0).Cells(1).Value

                Dim ms1 As New System.IO.MemoryStream(img)
                Dim pic As New PictureBox()
                pic.Image = Image.FromStream(ms1)
                pic.SizeMode = PictureBoxSizeMode.StretchImage

                pic.SetBounds(wid, 20, 200, 100)
                ' pic.Location = New Point(10, pic.Height)
                AddHandler pic.Click, AddressOf convertPic
                Me.Panel1.Controls.Add(pic)
                wid += 205

                cmd.ExecuteNonQuery()
                sqlcon.Close()
Next


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

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

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

1 Ответов

Рейтинг:
0

OriginalGriff

Вы вообще не читаете никаких данных из своей БД!
Или, скорее, вы делаете-плохо-но затем игнорируете или отбрасываете его.

Во-первых, не используйте ExecuteNonQuery с командой SELECT - SELECT по определению является запросом! Вам нужен ExecuteScalar или, что более вероятно, ExecuteReader, или вместо этого использовать DataAdapter.
Во-вторых, никогда не объединяйте строки для построения SQL-команды. Это оставляет вас широко открытыми для случайной или преднамеренной атаки SQL-инъекции, которая может уничтожить всю вашу базу данных. Вместо этого используйте параметризованные запросы.
В-третьих, вы игнорируете любые данные, которые могли бы прочитать, и всегда создаете свое изображение из одной и той же строки и ячейки вашего DataGridView.

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


Цитата:
Я исправил код, где я могу получить изображения и поместить их в SQL в одну таблицу, как вы мне тоже сказали. Я даже сделал ImageID и обычную колонку ID. Я просто пытаюсь понять эту последнюю часть, и это позволит завершить эту часть моей программы. В любом случае, до сих пор я никогда не использовал executerscalar или executereader. Когда вы имеете в виду концентричность, вы имеете в виду "'"?


Конкатенация - это процесс "сложения строк вместе", и в терминах SQL это чрезвычайно опасно.
Когда вы делаете что-то подобное:
Dim sql As String = "SELECT Images FROM [Table] WHERE ImageID= '" + DataGridView1.Rows(I).Cells(2).Value.ToString + "'"
Вы объединяете три строки: начало с SELECT, содержимое ячейки и конечную цитату. Это работает, но только если содержание именно то, что вы думаете, и это опасно. Если ячейка модифицирована, чтобы содержать
1';DROP TABLE Images;--
например, затем SQL получает команду:
SELECT Images FROM [Table] WHERE ImageID= '1';DROP TABLE Images;--'
Что является полностью допустимым SQL: это три команды. Первый выбирает ваши данные, второй удаляет вашу таблицу, а третий комментирует что-либо после этого.
Это называется SQL инъекция и это не шутка: xkcd: подвиги мамы[^]- люди действительно пытаются это сделать. Перепись населения Великобритании 2011 года была первой, которую вы могли пройти онлайн, и в течение получаса после ее начала люди жаловались, что SQL-инъекция не работает!
Он может быть использован для изменения, удаления или чтения вашей базы данных; или для обхода проверки пароля, или для чего-либо еще, что пользователь хочет сделать, что вы, вероятно, предпочли бы, чтобы он этого не делал...
Никогда, никогда не объединяйте команды SQL - всегда используйте параметризованные запросы.


Member 11856456

Я исправил код, где я могу получить изображения и поместить их в SQL в одну таблицу, как вы мне тоже сказали. Я даже сделал ImageID и обычную колонку ID. Я просто пытаюсь понять эту последнюю часть, и это позволит завершить эту часть моей программы. В любом случае, до сих пор я никогда не использовал executerscalar или executereader. Когда вы имеете в виду концентричность, вы имеете в виду "'"?

OriginalGriff

Ответ обновлен.

Member 11856456

Я ценю ваш совет, я буду работать над тем, как параметризовать свои заявления.

OriginalGriff

:большой палец вверх: