Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB.NET: Kuva Accesiin ja takas. VB2008

Sam76 [17.05.2008 10:05:17]

#

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

Sam76 [17.05.2008 17:14:06]

#

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.

neau33 [19.05.2008 08:01:16]

#

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 Sub

VB.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 Sub

Sam76 [19.05.2008 20:35:31]

#

Kiitos Nea! Minäpä tutustun aiheeseen.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta