Member 10972113 Ответов: 1

Отправить картинку в приложении VB в базу данных SQL


Привет, я использую visual studio 2017 для создания приложения Visual basic. Я пытался загрузить изображение в базу данных sql, все настроено правильно, но не могу ни за что на свете заставить его работать. Основа общего кода заключается в том, что пользователь загружает фотографию участника, и код обновляет столбец изображения выбранного участника.

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

Я перепробовал все на этом сайте (прежде чем вы перейдете по ссылке на более старые/спросите, почему я отправляю это), но безрезультатно. Ютуб, Гугл, Майкрософт страницы сообщества и т. д. Но несмотря ни на что я всегда получаю тот же результат в базе данных строк/столбцов :
0x40696D67

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

               Dim connection As New SqlClient.SqlConnection(My.Settings.Memberinfo)
               Dim command As New SqlClient.SqlCommand("update " & My.Settings.currentaccessread & " set img='@img' where [First Name]= '" & TextBox2.Text & "' AND [LAST NAME]= '" & TextBox4.Text & "'", connection)

               Dim ms As New MemoryStream
               PictureBox1.BackgroundImage.Save(ms, pictureBox1.BackgroundImage.RawFormat)

               command.Parameters.Add("@img", SqlDbType.Image).Value = ms.ToArray()

               connection.Open()
               If command.ExecuteNonQuery() = 1 Then
                   MsgBox(TextBox2.Text & " has an updated image for this event.")
               Else
                   MsgBox("Unable to upload image to server for " & TextBox2.Text)
               End If

               connection.Close()


           Catch exa As Exception
               MsgBox(exa.ToString)
           End Try


любая помощь будет с благодарностью оценена Бре, так как я больше ничего не знаю. Спасибо

1 Ответов

Рейтинг:
0

OriginalGriff

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

Когда вы объединяете строки, вы вызываете проблемы, потому что SQL получает такие команды, как:

SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
Цитата, добавленная пользователем, завершает строку в том, что касается SQL, и вы получаете проблемы. Но могло быть и хуже. Если я приду и наберу вместо этого: "x';DROP TABLE MyTable;--", то SQL получит совсем другую команду:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Которые SQL видит как три отдельные команды:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Совершенно правильный выбор
DROP TABLE MyTable;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

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


Member 10972113

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

Member 10972113

Точно так же, как в дополнение к вашему ответу, был бы я прав, если бы сказал, что теперь это параметризованный запрос(бар my.settings.accessread)? или это что-то совершенно другое.

Тусклое соединение как новый SqlClient.SqlConnection(My.Settings.Memberinfo, тип которого совпадает)

Дим команда как новый sqlclient как.Команда sqlcommand (обновление" " & моя.Параметры.currentaccessread &ампер; " набор ИМГ='@ИМГ' где [имя]= '@Fisrstname' и [фамилия]= '@ "фамилия"'", связь)

команда.Параметры.Добавить("@Имя_пользователя", Значения Sqldbtype.ТИП VARCHAR(МАКС)).Значение = Поле Textbox2.Метод toString()
команда.Parameters.Add("@Lastname", SqlDbType.VARCHAR(MAX)).Значение = TextBox4.Метод toString()

OriginalGriff

Черт возьми! Я уже напечатал это однажды ... "наши серверы немного перегружены работой" ... грррр ...

Нет, кавычки разделяют строки, так что это:
установите img='@img' где ...
пытается установить столбец img в литеральную строку '@img' вместо содержимого параметра. Уберите кавычки!
Вы получите ту же проблему с @Firstname и @Lastname - опять же, это будут литеральные строки.

Кроме того, TextBox2.ToString даст вам такую строку:
Система.Формы.Текстовое поле, текстовое содержание текстовое поле
вместо имени или фамилии. Используйте.Вместо этого текстовое свойство.

И я бы использовал параметры.AddWithValue вместо параметров.Добавь - это намного чище и читабельнее!