Как достать картинку из БД?!

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
QguR
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 17.02.2005 (Чт) 2:35

Как достать картинку из БД?!

Сообщение QguR » 12.06.2005 (Вс) 13:47

Имеется таблица Picture с полями PicID, где хранится номер картинки, и Pict , где хранится сама кртинка, это поле типа OLE и если сохранять моим способом, то картинка там хранится в двоичном виде (... Внимание вопрос: как вытащить рисунок (или наверное правильнее файл с рисунком) из базы данных обратно на форму? Можно ли его сохранить в базу как точечный рисунок?

'код сохранения
Data1.DatabaseName = "Test.tmp"
Data1.RecordSource = "Picture"
Data1.Refresh
Data1.Recordset.AddNew
Data1.Recordset("PicID") = Num 'картинка под номером...
'создать файл picture.tmp и скопировтаь в него изображение из имажа
SavePicture frmTest.Image1.Picture, "Picture.tmp" 'сохранить рисунок в файл (путь в примере не указываю, только имя)
Data1.Recordset("Pict") = "Picture.tmp" 'сохранить рисунок в базу из файла
'убить файл
Kill "Picture.tmp"
Data1.Recordset.Update

'код открытия
Data1.DatabaseName = "Test.tmp"
Data1.RecordSource = "Picture"
Data1.Refresh
Do While Data1.Recordset.EOF = False
If Data1.Recordset(0) = Num Then 'если для этого номера есть картинка - загружаем
'...сюда надо загрузку рисунка в image напрямую или через файл
End If
Data1.Recordset.MoveNext
Loop

Alexanbar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1727
Зарегистрирован: 13.04.2004 (Вт) 23:04
Откуда: Волгоградская обл.

Сообщение Alexanbar » 12.06.2005 (Вс) 15:39

Можно ли его сохранить в базу как точечный рисунок?

Почему же нельзя?

Берем Picturebox именем Picture1. Добавляем контрол Data. Привязываем его к соответствующему полю базы данных (см. параметры Datasource=Data1 и DataField=Pict у Picture1).

При загрузке делаем Picture1.picture=LOadPicture("имя файла").

Соответственно, при записи вызываем метод SavePicture.

QguR
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 17.02.2005 (Чт) 2:35

Сообщение QguR » 12.06.2005 (Вс) 16:03

Дествительно, все намного проще ) спасибо! а то меня опять не в ту степь потянуло )
Последний раз редактировалось QguR 13.06.2005 (Пн) 2:23, всего редактировалось 1 раз.

QguR
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 17.02.2005 (Чт) 2:35

Сообщение QguR » 13.06.2005 (Пн) 2:23

...Выглядит проще ) Наверно надо было мне эту тему в разделе для новичков запостить ( Рано я радовался (. Когда пытаюсь вписать DataSourse он выводит ошибку. Может это потому что базу я приписываю уже во время выполнения проги? Что делать?

Private Sub TMPOpen(NumVopros As Integer)
'открытие картинки если есть
Data1.DatabaseName = prog$ & "\Test.tmp"
Data1.RecordSource = "Picture"
Data1.Refresh
frmTest.Image1.DataField = "Pict"
frmTest.Image1.DataSource = MDIForm1.Data1
'ругаетЦа на ".DataSource" - Method or DataMember not found
Do While Data1.Recordset.EOF = False
If Data1.Recordset(0) = NumVopros Then
frmTest.Image1.Picture = LoadPicture(Data1.Recordset(1))
'это подразумевлось под "именем файла"?
End If
Data1.Recordset.MoveNext
Loop

MeMBus
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 450
Зарегистрирован: 23.02.2005 (Ср) 7:03
Откуда: Из леса...

Сообщение MeMBus » 14.06.2005 (Вт) 4:25

Код: Выделить всё
Public Sub LoadImData()
    Dim i As Long, k As Long
    imlMain.ListImages.Clear
    Set pAdoConUsers = New ADODB.Connection
    Set pAdoRecUsGrp = New ADODB.Recordset
    pAdoConUsers.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source='" & TempDBs & "'"
    pAdoConUsers.Open
    DoEvents
    If pAdoRecUsGrp.State = 1 Then
       pAdoRecUsGrp.Close
    End If
    DoEvents
    pAdoRecUsGrp.Open "SELECT * FROM Icons", pAdoConUsers, adOpenKeyset, adLockOptimistic
    With pAdoRecUsGrp
        Do While .EOF = False
            Call CopyFieldToFile(pAdoRecUsGrp, "sPicture", PathPrg & "Temp\icon.bmp")
            imlMain.ListImages.Add , , LoadPicture(PathPrg & "Temp\icon.bmp")
            .MoveNext
            DoEvents
        Loop
    End With
    DoEvents
    pAdoRecUsGrp.Close
    pAdoConUsers.Close
    Set pAdoConUsers = Nothing
    Set pAdoRecUsGrp = Nothing
End Sub

Private Function CopyFieldToFile(rst As ADODB.Recordset, fd As String, strFileName As String) As String
    Dim FileNum As Integer
    Dim Buffer() As Byte
    Dim BytesNeeded As Long
    Dim Buffers As Long
    Dim Remainder As Long
    Dim Offset As Long
    Dim r As Integer
    Dim i As Long
    Dim ChunkSize As Long
    ChunkSize = 65536
    BytesNeeded = rst(fd).ActualSize
    If BytesNeeded > 0 Then
        Buffers = BytesNeeded \ ChunkSize
        Remainder = BytesNeeded Mod ChunkSize
        If Dir(strFileName) <> "" Then
            Kill strFileName
        End If
        FileNum = FreeFile
        Open strFileName For Binary As #FileNum
            For i = 0 To Buffers - 1
                ReDim Buffer(ChunkSize)
                Buffer = rst(fd).GetChunk(ChunkSize)
                Put #FileNum, , Buffer()
                Offset = Offset + ChunkSize
            Next i
            ReDim Buffer(Remainder)
            Buffer = rst(fd).GetChunk(Remainder)
            Put #FileNum, , Buffer()
        Close #FileNum
    End If
    sLSGCopyFieldToFile = strFileName
End Function
Бороться и искать, найти и перепрятать!


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 197

    TopList