Löytyykö tietoa miten kannattaisi alkaa lähestyä edellä mainittua ongelmaa. Pitäisi siis tallentaa accesiin kuva pictureboksista ja sitten palauttaa se takaisin samaiseen pictureboksiin. Olen saanut kuvan talteen kantaan parametrisoimalla INSERT-lauseen ja kuva näkyy kannassa pitkänä binaaritietona(solun tyyppi- OLE-object).Sen palauttaminen takaisin tuottaa ongelmia. Eli olisiko jollain jonkinlaista esimerkkiä aiheesta?
Toisaalta taas olisikohan järkevämpää tallentaa pelkästään kuvan URL kantaan ja pelata sen kanssa? ( tästäkin saa laittaa esimerkkiä). Kanta tulee olemaan pieni, kuvia siellä maksimissaan n 20 kappaletta.
edit: Accessista käytössä 2007-versio
Itse itselleni vastaten.
Päädyin sitten kuitenkin käyttämään URL:ia. Eli url tekstietoisena kantaan ja kuva haetaan kovalevyltä sen osoittamasta paikasta. Vaikuttais että toimii ihan ok:sti mutta pikkaisen hitaahkosti.
Jos jotain järkevämpää/parempaa tapaa tiedossa niin kommentoikaa.
Heippa Sam76!
mitään järkevämpää/parempaa tapaa tuskin on, kuin mihin jo päädyit...
Tässä kuitenkin minusta hyvin mielenkiintoisen tutkimuksen tulos:
VB6 ActiveX DLL Projekti (MyDaoDbCreate)
Referenssit:
Microsoft Data Source Interfaces
(C:\WINDOWS\System32]msdatsrc.tlb)
Microsoft DAO 3.6 Objectlibrary
(C:\Program Files\Common Files\Microsoft Shared\DAOdao360.dll)
Käännä MyDaoDbCreate.dll tiedostoksi C:\WINDOWS\System32 hakemistoon
Rekisteröinti: Käynnistä -> Suorita -> kirjoita laatikkoon:
regsvr32 C:WINDOWS\System32\MyDaoDbCreate.dll -> OK
'Luokka: dbcreate (dbcreate.cls)
Option Explicit
Private Const DLL_PROCESS_DETACH = 0
Private Const DLL_PROCESS_ATTACH = 1
Private Const DLL_THREAD_ATTACH = 2
Private Const DLL_THREAD_DETACH = 3
Public Function DllMain(hInst As Long, _
fdwReason As Long, lpvReserved As Long) As Boolean
Select Case fdwReason
Case DLL_PROCESS_DETACH
Case DLL_PROCESS_ATTACH
DllMain = True
Case DLL_THREAD_ATTACH
Case DLL_THREAD_DETACH
End Select
End Function
Public Sub dbCreate(ByRef FullPath As String)
If Dir(FullPath) = "" Then
Dim dbDao As DAO.Database
Set dbDao = CreateDatabase(FullPath, dbLangGeneral)
End If
End SubVB.NET Sovellus (AccessPicture)
Lisää COM referenssi MyDaoDbCreate.dll
Jos haluaa jättää VB6 jutskat väliin voi käyttää ADO.NET kamaa tuomalla projektiin C:\Program Files\Common Files\System\ado hakemistosta msadox.dll ja msado15.dll -kirjastot osviittaa
Imports System
Imports System.IO
Imports System.Data
Imports System.Data.OleDb
Imports MyDaoDbCreate 'ADOX jos käyttää ADO.NET-kamaa
'...
Sub MainFormLoad(sender As Object, e As EventArgs)
Dim dbPath As String = Environment.GetFolderPath( _
Environment.SpecialFolder.Personal) + "\PicBase"
Try
MkDir(dbPath)
Catch ex As Exception
End Try
If Dir(dbPath + "\picbase.mdb") = "" Then
'*** tähän tilalle ADOX jutskat mikäli
Dim dbc As New MyDaoDbCreate.dbcreateClass()
Try
dbc.dbCreate(dbPath + "\picbase.mdb")
Catch ex As Exception
End Try
' ***
If Dir(dbPath + "\picbase.mdb")<> "" Then
Dim connstr As String = _
"Provider=Microsoft.Jet.OLEDB.4.0; " + _
"Ole DB Services=-4; Data Source=" + _
dbPath + "\picbase.mdb"
Dim conn As New OleDbConnection(connstr)
Dim cmd As OleDbCommand = conn.CreateCommand()
cmd.CommandText = "CREATE TABLE pictures (fname " _
+ "TEXT(50) PRIMARY KEY NOT NULL, picdata OleObject NOT NULL)"
conn.Open
cmd.ExecuteNonQuery()
conn.Close()
End If
End If
End Sub
Sub Button1Click(sender As Object, e As EventArgs)
OpenFileDialog1.InitialDirectory = _
Environment.GetFolderPath( _
Environment.SpecialFolder.MyPictures)
OpenFileDialog1.Filter = _
"Bitmap (*.bmp)|*.bmp|" + _
"Compuserve (*.gif)|*.gif|" + _
"Portable (*.png)|*.png|" + _
"JPEG (*.jpg)|*.jpg"
'jne...
OpenFileDialog1.RestoreDirectory = True
OpenFileDialog1.FileName = ""
If openFileDialog1.ShowDialog() = _
System.Windows.Forms.DialogResult.OK Then
Dim fname As String = OpenFileDialog1.FileName
Dim fsplit() As String = Split(fname,"\")
Dim fstream As New FileStream( _
fname, FileMode.Open, FileAccess.Read)
Dim breader As New BinaryReader(fstream)
Dim bytes() AS Byte = Nothing
Dim i As Integer = 0
For i = 0 to fstream.Length - 1
Redim preserve bytes(i)
bytes(i) = breader.ReadByte
Next i
breader.Close:breader = nothing
fstream.Close:fstream = nothing
Dim dbPath As String = _
Environment.GetFolderPath( _
Environment.SpecialFolder.Personal) + _
"\PicBase"
Dim connstr As String = _
"Provider=Microsoft.Jet.OLEDB.4.0; " + _
"Ole DB Services=-4; Data Source=" + _
dbPath + "\picbase.mdb"
Dim conn As OleDbConnection = _
New OleDbConnection(connstr)
Dim query As String = _
"SELECT * FROM pictures WHERE fname = '" + _
fsplit(fsplit.GetUpperBound(0)) + "'"
Dim ds As DataSet = New DataSet
conn.Open
Dim da As OleDbDataAdapter = _
New OleDbDataAdapter(query,conn)
Dim cb As OleDbCommandBuilder = _
New OleDbCommandBuilder(da)
da.Fill(ds,"pictures")
If ds.Tables("pictures").Rows.Count > 0 Then
Dim msgresult As Integer = _
Messagebox.Show("Tietokannassa on jo saman niminen kuva" _
+ Environment.NewLine + "Korvataanko kuva?", _
"Tietokantailmoitus", _
MessageBoxButtons.OKCancel,MessageBoxIcon.Information)
If msgresult <> 1 Then
GoTo ExitProc
Else
ds.Tables("pictures").Rows(0).Delete
da.Update(ds,"pictures")
End If
End If
query = "SELECT * From pictures"
cb.RefreshSchema
ds.Tables.Clear
da.TableMappings.Clear
da.SelectCommand = New OleDbCommand(query,conn)
cb.DataAdapter = da
da.Fill(ds,"pictures")
Dim row As DataRow = _
ds.Tables("pictures").NewRow()
row("fname") = fsplit(fsplit.GetUpperBound(0))
row("picdata") = bytes: bytes = Nothing
ds.Tables("pictures").Rows.Add(row)
da.Update(ds,"pictures")
ExitProc:
ds = Nothing: cb = Nothing
da = Nothing: conn.Close
End If
End Sub
Sub Button2Click(sender As Object, e As EventArgs)
Dim basePath As String = Environment.GetFolderPath( _
Environment.SpecialFolder.Desktop)
Dim dbPath As String = _
Environment.GetFolderPath( _
Environment.SpecialFolder.Personal) _
& "\PicBase"
Dim connstr As String = _
"Provider=Microsoft.Jet.OLEDB.4.0; " + _
"Ole DB Services=-4; Data Source=" + _
dbPath + "\picbase.mdb"
Dim conn As OleDbConnection = _
New OleDbConnection(connstr)
Dim query As String = _
"SELECT * FROM pictures"
Dim ds As DataSet = New DataSet
conn.Open
Dim da As OleDbDataAdapter = _
New OleDbDataAdapter(query,conn)
da.Fill(ds,"pictures")
If ds.Tables("pictures").Rows.Count > 0 Then
Dim row As DataRow
For Each row In ds.Tables("pictures").Rows
Dim fname As String = (row)("fname").ToString
Select Case fname.Substring(fname.Length -3, 3)
Case "bmp"
SaveFileDialog1.Filter = _
"Bitmap (*.bmp)|*.bmp"
Case "gif"
SaveFileDialog1.Filter = _
"Compuserve (*.gif)|*.gif"
Case "png"
SaveFileDialog1.Filter = _
"Portaple (*.png)|*.png"
Case "jpg"
SaveFileDialog1.Filter = _
"JPEG (*.jpg)|*.jpg"
'jne...
End Select
SaveFileDialog1.RestoreDirectory = True
SaveFileDialog1.FileName = basePath + "\" + (row)("fname")
If SaveFileDialog1.ShowDialog() = _
System.Windows.Forms.DialogResult.OK Then
If File.Exists(SaveFileDialog1.FileName) Then
FileSystem.Kill(SaveFileDialog1.FileName)
End If
Dim fstream As New FileStream( _
SaveFileDialog1.FileName, FileMode.CreateNew)
Dim bwriter As New BinaryWriter(fstream)
Dim bytes() As Byte
bytes = (row)("picdata")
Dim i As Integer = 0
While i <= bytes.GetUpperBound(0)
bwriter.Write(bytes(i))
i += 1
End While
bwriter.Close: bwriter = Nothing
fstream.Close: fstream = Nothing
bytes = Nothing
End If
Next
End If
End SubKiitos Nea! Minäpä tutustun aiheeseen.
Aihe on jo aika vanha, joten et voi enää vastata siihen.