Jag sparar bildfiler i BLOB fält i en Access databas. Har använt en stand-alone VB app för att lägga till bilder i databasen med hjälp av StreamObject, vilket funkar bra. Du är ute och cycklar. Access använder DAO mot access databaser och ADO mot SQL server.SQL sträng och recordset i Access DB
Försöker nu få till en funktion för att kunna göra det direkt inifrån Access databasen, men får inte till det.
Jag skapar ett Recordset:
Set rs = New ADODB.Recordset
rs.CursorLocation = adUseClient
Sedan försöker jag få till en SQL sträng för att hitta just den post som är aktuell i formuläret som är öppet. Numret på den aktuella posten hittar jag med: Screen.ActiveForm.CurrentRecord
Hur hittar jag namnet på den tabell som är öppen?
Hur skriver jag SQL strängen för att enbart hitta aktuell post?
Har försökt ungefär så här:
rs.Open "Select * FROM" & "Tabellen" & "WHERE" & "??????" & "=" & Screen.ActiveForm.CurrentRecord, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
När jag fått till min Recordset, så hade jag tänkt lägga in bilden i BLOB fältet med:
rs.Fields("BLOBImage").Value = mstream.Read
Är jag inne på rätt spår, eller finns det något smartare sätt att göra det på?Sv: SQL sträng och recordset i Access DB
Glöm inte lägga till referens till DAO.
<code>
Private Const ErrCanceled As Long = vbObjectError + 1
Private Const GWL_HINSTANCE As Long = (-6)
Private Type OPENFILENAME
lStructSize As Long
hwndOwner As Long
hInstance As Long
lpstrFilter As String
lpstrCustomFilter As String
nMaxCustFilter As Long
nFilterIndex As Long
lpstrFile As String
nMaxFile As Long
lpstrFileTitle As String
nMaxFileTitle As Long
lpstrInitialDir As String
lpstrTitle As String
flags As Long
nFileOffset As Integer
nFileExtension As Integer
lpstrDefExt As String
lCustData As Long
lpfnHook As Long
lpTemplateName As String
End Type
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Private Declare Function apiGetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long
Public Function GetFileName(FileName As String) As String
Dim Pos As Long
Pos = InStrRev(FileName, "\")
If Pos Then
GetFileName = Mid(FileName, Pos + 1)
Else
GetFileName = FileName
End If
End Function
Public Function GetOpenFileName(Optional Title As String = "Open file", Optional Filter As String = "All Files (*.*)|*.*|", Optional Owner As Form) As String
Dim pOpenfilename As OPENFILENAME
With pOpenfilename
.lStructSize = Len(pOpenfilename)
'Set the parent window
If Owner Is Nothing Then
.hwndOwner = hWndAccessApp
Else
.hwndOwner = Owner.hwnd
End If
' .hInstance = GetWindowLong(.hwndOwner, GWL_HINSTANCE)
'Select a filter
.lpstrFilter = Replace(Filter, "|", vbNullChar) + vbNullChar + vbNullChar
'create a buffer and set the maximum length for the file
.lpstrFile = Space$(254)
.nMaxFile = 255
'Create a buffer and set the maximum length for the file title
.lpstrFileTitle = Space$(254)
.nMaxFileTitle = 255
'Set the initial directory
.lpstrInitialDir = CurDir$
'Set the title
.lpstrTitle = Title
'No flags
'.flags = OFN_EXPLORER
End With
'Show the 'Open File'-dialog
If apiGetOpenFileName(pOpenfilename) Then
GetOpenFileName = Trim$(pOpenfilename.lpstrFile)
Else
Err.Raise ErrCanceled, "GetOpenFileName()", "User canceld dialog"
End If
End Function
Private Sub cmdImport_Click()
Dim rs As DAO.Recordset
Dim Field As DAO.Field
Dim Buffer() As Byte
'Const BufferSize As Long = 1024
Dim FileNo As Long
Dim FileName As String
On Error GoTo cmdSparaFil_Click_Err
Set rs = Me.Recordset
If rs.EOF Or rs.BOF Then
Else
FileName = GetOpenFileName(, , Me)
Set Field = rs("FileData")
FileNo = FreeFile()
Open FileName For Binary Access Read Shared As FileNo
ReDim Buffer(1 To LOF(FileNo))
Get FileNo, , Buffer
rs.Edit
Field.AppendChunk Buffer
rs("FileName") = GetFileName(FileName)
rs.Update
Erase Buffer
Close FileNo
End If
cmdSparaFil_Click_Exit:
Exit Sub
cmdSparaFil_Click_Err:
Select Case Err.Number
Case ErrCanceled
Resume cmdSparaFil_Click_Exit
Case Else
MsgBox Err.Description, vbCritical, Err.Source
Resume cmdSparaFil_Click_Exit
End Select
End Sub
</code>