Member 13380272 Ответов: 2

Как вставить картинку в datagridview и преобразовать ее в базу данных VB.NET без использования параметра


Привет! У меня здесь есть код,который может добавлять,искать,удалять, очищать и вставлять изображение информации о пользователях. Проблема в том, что я не знаю, как и какой синтаксис я должен сделать, чтобы картинка добавилась в кнопку Добавить, чтобы сохранить ее в базе данных и показать картинку в виде таблицы данных вместе с информацией о пользователях...Я надеюсь и заранее благодарю людей, которые могут мне помочь ...Спасибо

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

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

'Imports Microsoft.Win32
Imports System.Data.OleDb
Imports System.IO
'Imports System
'Imports System.Data
'Imports System.Drawing
'Imports System.Drawing.Imaging
'Imports System.Windows.Forms
'Imports Microsoft.VisualBasic
Imports System.DBNull

Public Class ProjectTwo
    Dim cnn As New OleDb.OleDbConnection
    Dim imgName As String
    Dim cmd As New OleDb.OleDbCommand
    Private Sub ProjectTwo_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        cnn = New OleDb.OleDbConnection
        cnn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=I:\ProjectTwo\ProjectTwoEmployment.accdbProvider=Microsoft.ACE.OLEDB.12.0;Data Source=I:\ProjectTwo\ProjectTwoEmployment.accdb"
        '
        'get data into list
        Me.RefreshData()
    End Sub

    Private Sub BtnAdd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnAdd.Click
        Dim cmd As New OleDb.OleDbCommand
        If Not cnn.State = ConnectionState.Open Then
            'open connection if it is not yet open
            cnn.Open()
        End If

        cmd.Connection = cnn
        'check whether add new or update
        If Me.TxtEID.Tag & "" = "" Then
            'add new 
            'add data to table
            cmd.CommandText = "INSERT INTO PersonalInfo (EmploymentID, EmploymentName, DateOfBirth, PlaceOfBirth, Address , Phone , Sex) " & _
                            " VALUES(" & Me.TxtEID.Text & ",'" & Me.TxtEName.Text & "','" & Me.TxtEDate.Text & "','" & _
                            Me.TxtEPlace.Text & "','" & Me.TxtEAdd.Text & "','" & Me.TxtEPhone.Text & "','" & _
                            Me.TxtESex.Text & "')"
            cmd.ExecuteNonQuery()
        Else
            'update data in table
            cmd.CommandText = "UPDATE PersonalInfo " & _
                        " SET EmploymentID =" & Me.TxtEID.Text & _
                        ", EmploymentName='" & Me.TxtEName.Text & "'" & _
                        ", DateOfBirth='" & Me.TxtEDate.Text & "'" & _
                        ", PlaceOfBirth='" & Me.TxtEPlace.Text & "'" & _
                        ", Address='" & Me.TxtEAdd.Text & "'" & _
                        ", Phone='" & Me.TxtEPhone.Text & "'" & _
                        ", Sex='" & Me.TxtESex.Text & "'" & _
                        " WHERE EmploymentID=" & Me.TxtEID.Tag
            cmd.ExecuteNonQuery()
        End If

        'refresh data in list
        Me.RefreshData()
        'clear form
        Me.BtnClear.PerformClick()

        'close connection
        cnn.Close()
    End Sub

    Private Sub RefreshData()
        If Not cnn.State = ConnectionState.Open Then
            'open connection
            cnn.Open()
        End If

        Dim da As New OleDb.OleDbDataAdapter("SELECT EmploymentID as [EmploymentID], " & _
                                             "EmploymentName as [EmploymentName], DateOfBirth, PlaceOfBirth, Address, Phone , Sex , Photo" & _
                                             " FROM PersonalInfo ORDER BY EmploymentID", cnn)

        Dim dt As New DataTable
        'fill data to datatable
        da.Fill(dt)

        'offer data in data table into datagridview
        Me.DataGridView1.DataSource = dt

        'close connection
        cnn.Close()
    End Sub

    Private Sub BtnClear_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnClear.Click
        Me.TxtEID.Text = ""
        Me.TxtEName.Text = ""
        Me.TxtEDate.Text = ""
        Me.TxtEPlace.Text = ""
        Me.TxtEAdd.Text = ""
        Me.TxtEPhone.Text = ""
        Me.TxtESex.Text = ""
        Me.PictureBox1.Image = Nothing

        Me.RefreshData()

        'enable button edit
        Me.BtnUpdate.Enabled = True
        'set button add to add label
        Me.BtnAdd.Text = "Add"
        '
        Me.TxtEID.Focus()
    End Sub

    Private Sub BtnUpdate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnUpdate.Click
        'check for the selected item in list
        If Me.DataGridView1.Rows.Count > 0 Then
            If Me.DataGridView1.SelectedRows.Count > 0 Then
                Dim intEID As Integer = Me.DataGridView1.SelectedRows(0).Cells("EmploymentID").Value
                'get data from database followed by employment id
                'open connection
                If Not cnn.State = ConnectionState.Open Then
                    cnn.Open()
                End If
                'get data into datatable
                Dim da As New OleDb.OleDbDataAdapter("SELECT * FROM PersonalInfo " & _
                                                     " WHERE EmploymentID=" & intEID, cnn)
                Dim dt As New DataTable
                da.Fill(dt)

                Me.TxtEID.Text = intEID
                Me.TxtEName.Text = dt.Rows(0).Item("EmploymentName")
                Me.TxtEDate.Text = dt.Rows(0).Item("DateOfBirth")
                Me.TxtEPlace.Text = dt.Rows(0).Item("PlaceOfBirth")
                Me.TxtEAdd.Text = dt.Rows(0).Item("Address")
                Me.TxtEPhone.Text = dt.Rows(0).Item("Phone")
                Me.TxtESex.Text = dt.Rows(0).Item("Sex")

                '
                'hide the id to be edited in TAG of TxtEID in case id is changed
                Me.TxtEID.Tag = intEID
                'change button add to update
                Me.BtnAdd.Text = "UPDATE"
                'disable button edit
                Me.BtnUpdate.Enabled = False
                'close connection
                cnn.Close()
            End If
        End If
    End Sub

    Private Sub BtnDelete_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnDelete.Click
        'check for the selected item in list
        If Me.DataGridView1.Rows.Count > 0 Then
            If Me.DataGridView1.SelectedRows.Count > 0 Then
                Dim intEID As Integer = Me.DataGridView1.SelectedRows(0).Cells("EmploymentID").Value
                'open connection
                If Not cnn.State = ConnectionState.Open Then
                    cnn.Open()
                End If

                'delete data
                Dim cmd As New OleDb.OleDbCommand
                cmd.Connection = cnn
                cmd.CommandText = "DELETE FROM PersonalInfo WHERE EmploymentID=" & intEID
                cmd.ExecuteNonQuery()
                'refresh data
                Me.RefreshData()

                'close connection
                cnn.Close()
            End If
        End If
    End Sub

    Private Sub BtnPicture_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnPicture.Click
     
        Dim opf As New OpenFileDialog
        opf.Filter = "Choose Image(*.jpg;*.png;*.gif)|*.jpg;*.png;*.gif"

        If opf.ShowDialog = DialogResult.OK Then
            PictureBox1.Image = Image.FromFile(opf.FileName)
        End If
    End Sub

    Private Sub BtnSearch_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnSearch.Click

        'for searching the record in the database 
        Try
            'open the connection
            cnn.Open()
            Dim data = New DataTable
            Dim dataT As New OleDbDataAdapter
            'set your commands for holding the data
            With cmd
                .Connection = cnn
                .CommandText = "Select * from PersonalInfo where EmploymentID like '" & TxtEID.Text & "%'"
            End With
            'filling the table in the database.
            dataT.SelectCommand = cmd
            dataT.Fill(data)
            'put your datasource in the datagridview
            DataGridView1.DataSource = data

        Catch ex As Exception
            MsgBox(ex.Message)
        End Try

        'close the connection
        cnn.Close()

    End Sub

End Class

2 Ответов

Рейтинг:
0

Patrice T

Никогда не создавайте SQL-запрос путем объединения строк. Рано или поздно вы сделаете это с помощью пользовательских вводов, и это откроет дверь уязвимости под названием "SQL injection", она опасна для вашей базы данных и подвержена ошибкам.
Одна кавычка в имени - и ваша программа рухнет. Если пользователь вводит имя типа "Брайан О'Коннер", это может привести к сбою вашего приложения, это уязвимость SQL-инъекции, и сбой-это наименьшая из проблем, вредоносный пользовательский ввод, и он продвигается к командам SQL со всеми учетными данными.
SQL-инъекция-Википедия[^]
SQL-инъекция[^]
Атаки SQL-инъекций на примере[^]
PHP: SQL Injection-руководство пользователя[^]
Шпаргалка по предотвращению инъекций SQL-OWASP[^]

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

Нет, параметры-это единственное решение.
Цитата:
Тогда могу ли я просто сделать специальный параметр для фотографии, а остальное-не в параметрах?

Ваш выбор ! Вы знаете опасность, вы знаете решение.


Member 13380272

Привет! Я действительно знаю последствия, но есть ли возможный способ, чтобы в него можно было вставить картинку? без использования параметров?

Member 13380272

Тогда могу ли я просто сделать специальный параметр для фотографии, а остальное-не в параметрах?

Member 13380272

Привет! Я следую вашему совету, но там были предупреждающие записки. Я могу ее решить..Он сказал:

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


Вот код:


Private Sub BtnAdd_Click(ByVal sender As System.Объект, бывал е как система.EventArgs) Обрабатывает BtnAdd.Щелчок
Dim cmd как новый OleDb. OleDbCommand
Дим Фото, Как Новые DataGridViewImageColumn
Dim MS как Новый Поток памяти
Dim ArrayImage () Как Байт
Тусклый я как Коротышка

Если (PictureBox1. Image IsNot Nothing), То
Имя picturebox1.Изображения.Сохранить(МС, имя picturebox1.Изображения.RawFormat)
ArrayImage = GetBuffer ср.
Г-жа закрыть()

Конец, Если

С помощью cmd
.Подключение = СNN
.Свойства commandtext = "вставить в PersonalInfo ([EmploymentID], [EmploymentName], [DateOfBirth], [PlaceOfBirth], [адрес] , [телефон] , [секс] , [фото])" &амп; _
"Значения (@EID,@EName,@EDate,@EPlace,@EAdd,@EPhone,@ESex,@EPhoto)"

. Parameters. Add (",@EID", OleDbType.Целое число).Значение = TxtEID.Текст
. Parameters.Add(",@EName", OleDbType.VarChar).Значение = TxtEName.Текст
.Параметры.Добавить(",@Функция Edate", OleDbType.Дата).Значение = TxtEDate.Текст
. Parameters.Add(",@EPlace", OleDbType.VarChar).Значение = TxtEPlace.Текст
. Parameters.Add(",@EAdd", OleDbType.VarChar).Значение = TxtEAdd.Текст
. Parameters.Add(",@EPhone", OleDbType.VarChar).Значение = TxtEPhone.Текст
. Parameters.Add(",@ESex", OleDbType.VarChar).Значение = TxtESex.Текст
. Parameters.Add(",@EPhoto", OleDbType.Binary).Value = IIf(PictureBox1. Image IsNot Nothing, ArrayImage, DBNull.Ценность)


i =. ExecuteNonQuery
.Располагать()

Конец С

Если i >= 1, то
MsgBox ("добавить успешно")
Имя picturebox1.Имидж = Ничто
Звоните Ясно()
Вызовите RefreshData()
Конец, Если


Конец Подводной Лодки

Patrice T

Воспользуйся Улучшить вопрос чтобы обновить ваш вопрос.
Чтобы каждый мог обратить внимание на эту информацию.

Member 13380272

Как?

Patrice T

кнопка внизу вопроса.

Рейтинг:
0

Dave Kreskowiak

ИСПОЛЬЗУЙТЕ ПАРАМЕТРЫ! Нет никакого оправдания, чтобы не делать этого.

Этот мусор конкатенации строк, который вы используете, подвержен атакам SQL-инъекций, будь то намеренно или нет.

Я могу сломать ваши SQL-операторы, которые вы строите, просто поместив символ ' в любое из этих полей.


Member 13380272

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

Dave Kreskowiak

Серьезно, забудьте об этом шуме и используйте парметры! Не впадайте в эту привычку.

Image img = picturebox1.Image();
byte[] arr;
ImageConverter converter = new ImageConverter();
arr=(byte[])converter.ConvertTo(img, typeof(byte[]));

command.CommandText = "INSERT INTO ImagesTable (Image) VALUES('" + arr + "')";
command.CommandType = CommandType.Text;
command.ExecuteNonQuery();

Member 13380272

Спасибо за понимание, но я хотел бы спросить, где я должен поместить ваш код? это в кнопке обзора или в кнопке добавления? должен ли я поместить его также в кнопку обновления?

Dave Kreskowiak

Как вы думаете, что делает SQL-вставка?

Member 13380272

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

Member 13380272

Привет! Я почти закончил свой код в кнопке добавления, но есть ошибка. Здесь :
Предупреждение 1 переменная 'ArrayImage' используется до того, как ей было присвоено значение. Исключение нулевой ссылки может возникнуть во время выполнения.

Вот код:

Private Sub BtnAdd_Click(ByVal sender As System.Объект, бывал е как система.EventArgs) Обрабатывает BtnAdd.Щелчок
Dim cmd как новый OleDb. OleDbCommand
Дим Фото, Как Новые DataGridViewImageColumn
Dim MS как Новый Поток памяти
Dim ArrayImage () Как Байт
Тусклый я как Коротышка

Если (PictureBox1. Image IsNot Nothing), То
Имя picturebox1.Изображения.Сохранить(МС, имя picturebox1.Изображения.RawFormat)
ArrayImage = GetBuffer ср.
Г-жа закрыть()

"открыть соединение, если оно еще не открыто
телеканал CNN.Открыть()
Конец, Если

С помощью cmd
.Подключение = СNN
.Свойства commandtext = "вставить в PersonalInfo ([EmploymentID], [EmploymentName], [DateOfBirth], [PlaceOfBirth], [адрес] , [телефон] , [секс] , [фото])" &амп; _
"Значения (@EID,@EName,@EDate,@EPlace,@EAdd,@EPhone,@ESex,@EPhoto)"

. Parameters. Add (",@EID", OleDbType.Целое число).Значение = TxtEID.Текст
. Parameters.Add(",@EName", OleDbType.VarChar).Значение = TxtEName.Текст
. Parameters.Add(",@EDate", OleDbType.VarChar).Значение = TxtEDate.Текст
. Parameters.Add(",@EPlace", OleDbType.VarChar).Значение = TxtEPlace.Текст
. Parameters.Add(",@EAdd", OleDbType.VarChar).Значение = TxtEAdd.Текст
. Parameters.Add(",@EPhone", OleDbType.VarChar).Значение = TxtEPhone.Текст
. Parameters.Add(",@ESex", OleDbType.VarChar).Значение = TxtESex.Текст
. Parameters.Add(",@EPhoto", OleDbType.Binary).Value = IIf(PictureBox1. Image IsNot Nothing, ArrayImage, DBNull.Ценность)


i =. ExecuteNonQuery
.Располагать()

Конец С

Если i >= 1, то
MsgBox ("добавить успех")
Имя picturebox1.Имидж = Ничто
Звоните Ясно()
Вызовите RefreshData()
Конец, Если


Конец Подводной Лодки

Dave Kreskowiak

Вы получаете это предупреждение, потому что единственный раз, когда вы назначили значение ArrayImage, находится внутри блока "if". Затем вы использовали ArrayImage в блоке кода вне этого блока "if". Остальная часть кода базы данных под "End If" должна была быть помещена внутри блока "if".

Member 13380272

Привет! Я помещаю код базы данных в блок if, но безуспешно...Тот же вывод, но больше нет предупреждающей Заметки, Вместо этого есть диалоговое окно ошибки DataGridView по умолчанию.. Я не могу вставить сюда печатный экран, который я захватил, но он говорит, что я должен заменить этот диалог по умолчанию и, пожалуйста, обработать событие dataerror.

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

Dave Kreskowiak

Событие DataError DGV должно быть обработано таким образом, чтобы вы получили ошибку для ячейки, которую он пытается визуализировать.

Member 13380272

Проблема в камере? Извините, но я действительно не знаю, где изменить/отредактировать свой код, потому что там нет даже кода ошибки.Вот код пожалуйста:

Private Sub BtnAdd_Click(ByVal sender As System.Объект, бывал е как система.EventArgs) Обрабатывает BtnAdd.Щелчок
Dim cmd как новый OleDb. OleDbCommand
Dim EPhoto Как Новый Столбец DataGridViewImageColumn
Dim MS как Новый Поток памяти
Dim ArrayImage() As Byte = Nothing
Тусклый я как Коротышка

Если (PictureBox1. Image IsNot Nothing), То
Имя picturebox1.Изображения.Сохранить(МС, имя picturebox1.Изображения.RawFormat)
ArrayImage = GetBuffer ср.
Г-жа закрыть()

С помощью cmd
.Подключение = СNN
.Свойства commandtext = "вставить в PersonalInfo ([EmploymentID], [EmploymentName], [DateOfBirth], [PlaceOfBirth], [адрес], [телефон] , [секс] ,[фото]) значения (@ИД,@эмаль кулон,@функция edate,@EPlace,@EAdd,@EPhone,@ESex,@EPhoto)"

. Parameters. Add ("@EID", OleDbType.Целое число).Значение = TxtEID.Текст
. Parameters.Add("@EName", OleDbType.VarChar).Значение = TxtEName.Текст
. Parameters.Add("@EDate", OleDbType.VarChar).Значение = TxtEDate.Текст
. Parameters.Add("@EPlace", OleDbType.VarChar).Значение = TxtEPlace.Текст
. Parameters.Add("@EAdd", OleDbType.VarChar).Значение = TxtEAdd.Текст
. Parameters.Add("@EPhone", OleDbType.VarChar).Значение = TxtEPhone.Текст
. Parameters.Add("@ESex", OleDbType.VarChar).Значение = TxtESex.Текст
. Parameters.Add("@EPhoto", OleDbType.Binary).Value = If(PictureBox1. Image IsNot Nothing, ArrayImage, CObj(DBNull.Ценность))

i =. ExecuteNonQuery
.Располагать()

Конец С


Если i >= 1, то
MsgBox ("добавить успешно")
Имя picturebox1.Имидж = Ничто
Звоните Ясно()
Вызовите RefreshData()
Конец, Если


Конец, Если


Конец Подводной Лодки

Dave Kreskowiak

Тебе еще многому надо научиться...

Нажмите на DGV в своей форме один раз. В окнах свойств есть маленький значок, похожий на молнию. Нажмите на это. Теперь вы увидите список всех событий, которые раскрывает DGV. Найдите строку с надписью "DataError" и дважды щелкните по ней. Он добавит пустой метод обработчика событий DataError. Именно там вы собираетесь поместить свой код для регистрации любых ошибок, таких как

    Debug.WriteLine(e.Exception.ToString());

Member 13380272

Я пытался, но когда я нажимаю на молнию, там нет строки "DataError". Я ищу его, но его нет.