Roman Kuznetsov Ответов: 1

Как я могу сохранить несколько изображений (blob) из таблицы SQL в файл изображения с помощью VB net?


Я использую vb net 2017.

По этому следующему коду я получаю изображение запроса из таблицы sql (имя файла MMOBJS.LNL_BLOB)

     OpenConnection()

     cmd = New SqlCommand("Select badge.ID , emp.SSNO , emp.LASTNAME, emp.FIRSTNAME, emp.MIDNAME, BADGSTAT.NAME, DEPT.NAME , BADGE.ACTIVATE, BADGE.DEACTIVATE, MMOBJS.LNL_BLOB  FROM EMP INNER JOIN BADGE ON EMP.ID = BADGE.EMPID INNER JOIN UDFEMP ON UDFEMP.ID = EMP.ID INNER JOIN DEPT on UDFEMP.DEPT = DEPT.ID INNER JOIN BADGSTAT ON BADGE.STATUS = BADGSTAT.ID INNER JOIN MMOBJS ON MMOBJS.EMPID = BADGE.EMPID where BADGE.ID Like '" & DataGridView1.CurrentRow.Cells(0).Value.ToString & "%'", connections)
reader = cmd.ExecuteReader()


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

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

If reader.Read = False Then
     MessageBox.Show("Фото для пропуска № " & DataGridView1.CurrentRow.Cells(0).Value.ToString & " нет в базе.", "Message", MessageBoxButtons.OK, MessageBoxIcon.Information)
    Else

     'store image value from the database in byte
     Dim imageData As Byte() = reader(9)
     If Not imageData Is Nothing Then
         Using ms As New MemoryStream(imageData, 0, imageData.Length)
             ms.Write(imageData, 0, imageData.Length)
             pic_box.Image = Image.FromStream(ms, True)

             Dim Path As String = "C:\tmp2\"
             Dim Dir As String = System.IO.Path.GetDirectoryName(Path)

             Try
                 Try
                     If Not System.IO.Directory.Exists(Dir) Then
                         System.IO.Directory.CreateDirectory(Dir)
                     End If

                     With sfdpic
                         .Title = "Save image As"
                         .Filter = "Jpg, Jpeg Images|*.jpg; *.jpeg"
                         .AddExtension = True
                         .DefaultExt = ".jpg"
                         '.FileName = txt_ssno.Text + " " + txt_lname.Text + " " + txt_fname.Text + " " + txt_midname.Text
                         .FileName = DataGridView1.CurrentRow.Cells(1).Value.ToString + " " + DataGridView1.CurrentRow.Cells(2).Value.ToString + " " + DataGridView1.CurrentRow.Cells(3).Value.ToString + " " + DataGridView1.CurrentRow.Cells(4).Value.ToString
                         .OverwritePrompt = True
                         .InitialDirectory = Dir
                         .RestoreDirectory = True

                         If .ShowDialog = DialogResult.OK Then
                             If .FilterIndex = 1 Then
                                 pic_box.Image.Save(sfdpic.FileName, Imaging.ImageFormat.Jpeg)
                             End If
                         End If
                     End With

                 Catch ex As Exception
                     MessageBox.Show("Error: Saving Image Failed ->>" & ex.Message.ToString())

                 Finally
                     sfdpic.Dispose()
                 End Try

             Catch ex As Exception
                 Me.Cursor = Cursors.Default
                 MessageBox.Show(ex.Message, "Message", MessageBoxButtons.OK, MessageBoxIcon.Information)
             End Try

         End Using
     End If
     reader.Close()
     Cursor = Cursors.Default
 End If
 Cursor = Cursors.Default

 Try



Я не могу сохранить несколько изображений для отфильтрованного списка datagridview. Как я могу это сделать?
Любой пример, пожалуйста.

1 Ответов

Рейтинг:
5

MadMyche

Я сразу заметил две ошибки.
К сожалению, VB не является моим основным языком, и в данный момент у меня нет доступа к IDE. Вам нужно будет самостоятельно разобраться с любыми синтаксическими ошибками.

Проблема № 1: Никогда не объединяйте SQL-команду вместе.
Используйте параметризованные запросы, чтобы исключить вероятность SQL-инъекции
Исправление: измените предложение WHERE

' BAD:
     "...where BADGE.ID Like '" & DataGridView1.CurrentRow.Cells(0).Value.ToString & "%'"

' Good:
     "...where BADGE.ID = @BadgeID"
     cmd.Parameters.AddWithValue("@BadgeID", DataGridView1.CurrentRow.Cells(0).Value);


Проблема №2: получено только 1 значение
Исправление: петля через считыватель

If reader.HasRows = False Then
	MessageBox.Show("Error Message")
Else
   While reader.Read()
      ' do your code here for each row in the reader object
   End While
End If


Roman Kuznetsov

Здравствуйте, спасибо за ваш совет, он очень полезен для меня. Я проверил свой код для задачи № 1 , он сработал.

Но не могу переписать свой код для сохранения нескольких фотографий из БД. Можете ли вы помочь мне с каким-нибудь примером? Моя задача-сохранить все фотографии из отфильтрованной таблицы dgv в отдельный jpg-файл , не используя SafeFileDialog.