Blob и VBA, как вытащить рисунок

IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.

Модератор: kdv

Ответить
dvim
Сообщения: 11
Зарегистрирован: 23 апр 2005, 12:23

Blob и VBA, как вытащить рисунок

Сообщение dvim » 21 янв 2006, 17:15

Работаю с БД Firebird через VBA (в Autocad) ODBC
Все нормально для текста/чисел, но никак не получается прочитать рисунок.
Получаю последовательность байт, сохраняю Put в файл, а она не воспроизводится.
Как рисунок вытащить из BLoB

Spa_2002
Сообщения: 28
Зарегистрирован: 13 май 2005, 15:47

Сообщение Spa_2002 » 23 янв 2006, 08:20

Option Explicit
' модуль формы для работы с изображением(записать , удалить) из файла в базу

Код: Выделить всё

' таблица для хранения изображений
' IB6.5  3 диалект 

'CREATE TABLE IMG1 (
'    ID_EXP   INTEGER NOT NULL,
'    ID_PERS  INTEGER NOT NULL,
'    IMAGE1   BLOB SUB_TYPE 0 SEGMENT SIZE 80
');

Private cur_id_exp As String
Private cur_id_emp As String

Private strFilename As String

Public Sub SetSize()
  Me.Height = 4950
  Me.Width = 7560
  Me.Top = (frmMDIHead.ScaleHeight - Me.Height) / 2
  Me.Left = (frmMDIHead.ScaleWidth - Me.Width) / 2
End Sub

Private Sub CmdDel_Click()
  Dim cmd1 As ADODB.Command
  
  If lblNoPhoto.Visible = False Then
    If MsgBox("Óäàëèòü ôîòîãðàôèþ '" & lblFIO.Caption & "' ?", vbYesNo) = vbYes Then
      Set cmd1 = New ADODB.Command
      With cmd1
        .ActiveConnection = cnn_ib
        .CommandType = adCmdText
        .CommandText = "DELETE FROM img1 where id_exp=" & _
        cur_id_exp & " and id_pers=" & cur_id_emp
        .Execute
      End With
      Call LoadImgFromBase
    End If
  End If
End Sub

Private Sub cmdExit_Click()
  Unload Me
End Sub

Private Sub cmdFromFile_Click()
On Error GoTo ErrExit
  With CommonDialog1
    .DialogTitle = "Çàãðóçêà èçîáðàæåíèÿ"
    .CancelError = False
    .Filter = "jpg|*.jpg|Gif|*.gif|Bmp|*.bmp|All|*.*"
    .ShowOpen
    If .FileName = "" Then
      lblNoPhoto.Visible = True
      Image1.Picture = Nothing
      Exit Sub
    Else
      strFilename = .FileName
      Image1.Picture = LoadPicture(strFilename)
      lblNoPhoto.Visible = False
    End If
  End With
ErrExit:
End Sub

Private Sub cmdWrite_Click()
  Dim s1 As ADODB.Stream
  Dim cmd1 As ADODB.Command
  Dim par1 As ADODB.Parameter
   
  If lblNoPhoto.Visible = True Then Exit Sub
  
cnn_ib.BeginTrans

On Error GoTo ErrIns

  Set s1 = New ADODB.Stream
    With s1
      .Type = adTypeBinary
      .Open
      .LoadFromFile (strFilename)
    End With
  
  Set cmd1 = New ADODB.Command
  
  ' ñíà÷àëà óäàëÿåì âîçìîæíî ñóùåñòâóþùóþ ïðåäûäóùóþ çàïèñü
  With cmd1
      .ActiveConnection = cnn_ib
      .CommandType = adCmdText
      .CommandText = "DELETE FROM img1 where id_exp=" & _
          cur_id_exp & " and id_pers=" & cur_id_emp
      .Execute
    End With
  Set cmd1 = Nothing
  
  ' ïîòîì çàïèñûâàåì íîâîå èçîáðàæåíèå
  ' //////// ñ èñïîëüçîâàíèåì Command  - ok /////////////////
  Set cmd1 = New ADODB.Command
    
    cmd1.CommandText = "insert into img1(id_exp,id_pers,Image1) values(" & _
    cur_id_exp & "," & cur_id_emp & ",?)"
  
    Set par1 = cmd1.CreateParameter()
    par1.Attributes = adParamLong
    par1.Direction = adParamInput
    par1.Size = 1000000
    par1.Type = adLongVarBinary
  
    cmd1.Parameters.Append par1
  
    cmd1.Parameters(0).Value = s1.Read
  
    cmd1.ActiveConnection = cnn_ib
    cmd1.CommandType = adCmdText
  
    cmd1.Execute
On Error GoTo 0

  cnn_ib.CommitTrans
  Set cmd1 = Nothing
  Set s1 = Nothing
  MsgBox ("Èçîáðàæåíèå óñïåøíî ñîõðàíåíî")
  Unload Me
  Exit Sub
  
ErrIns:
  cnn_ib.RollbackTrans
  Set cmd1 = Nothing
  Set s1 = Nothing
  MsgBox ("Îøèáêà çàïèñè èçîáðàæåíèÿ")
  
End Sub

Private Sub Form_Load()
  cur_id_exp = frmListEmp.sel_id_exp
  cur_id_emp = frmListEmp.sel_id_emp

  lblFIO.Caption = frmListEmp.sel_fio
  Me.Caption = "Ôîòîãðàôèÿ - " & lblFIO.Caption
  
  Image1.Stretch = True
  
  Call SetSize
  Call LoadImgFromBase
End Sub

Private Sub LoadImgFromBase()
  ' çàãðóçêà èçîáðàæåíèÿ èç áàçû âî âðåì.ôàéë è ïîòîì â Image1
   Dim s1 As ADODB.Stream
   Dim rs1 As ADODB.Recordset
   
   Image1.Picture = Nothing
   Set rs1 = New ADODB.Recordset
   
On Error GoTo errMF
    With rs1
      .ActiveConnection = cnn_ib
      .CursorLocation = adUseServer
      .CursorType = adOpenStatic
      .Source = "select image1 from img1 where id_exp=" & _
        cur_id_exp & " and id_pers=" & cur_id_emp
      .Open
      .MoveFirst
    End With
    
    Set s1 = New ADODB.Stream
    strFilename = App.Path & "\tmpImg.bmp"
    
    With s1
     .Type = adTypeBinary
     .Open
     .Write (rs1.Fields("Image1").Value)
     .SaveToFile strFilename, adSaveCreateOverWrite
    End With
    
    If s1.Size > 0 Then
      Image1.Picture = LoadPicture(App.Path & "\tmpImg.bmp")
    Else
      Image1.Picture = Nothing
    End If
    lblNoPhoto.Visible = False
    Set rs1 = Nothing
    Set s1 = Nothing
    
On Error GoTo 0
Exit Sub
errMF:
  lblNoPhoto.Visible = True
  Set rs1 = Nothing
  Set s1 = Nothing
End Sub

dvim
Сообщения: 11
Зарегистрирован: 23 апр 2005, 12:23

Сообщение dvim » 23 янв 2006, 09:25

Спасибо !

Ответить