Announcement

Collapse
No announcement yet.

Laufzeitfehler 7 zu wenig Speicher

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Laufzeitfehler 7 zu wenig Speicher

    Ich bekomme folgendes Problem beim Einlesen von Binärdateien (Bilder aus SQL Datenbank)

    Das einlesen funktioniert eigentlich einwandfrei, nur wenn es zu viele Bilder sind kommt bvesagter Fehler.

    Der Code sieht folgendermaßen aus:

    Sub BildErstellung(strJPGFile, strBilderID)

    Dim rcs As DAO.Recordset, jpg() As Byte, i As Long
    Set rcs = CurrentDb.OpenRecordset("SELECT * FROM dbo_Bilder WHERE [BilderID]=" & strBilderID, dbOpenDynaset, dbSeeChanges)
    If rcs.NoMatch Then
    MsgBox "Ein Bild mit dieser Nummer ist nicht in der Datenbank vorhanden."
    Else

    On Error GoTo FormfeldTitel_Err

    Open strJPGFile For Binary As #1
    ReDim jpg(rcs("Bild").FieldSize)

    ************************************************** ***************
    Hier bleibt Access stehen mit Laufzeitfehler 7 Zu wenig Speicher
    jpg() = rcs("Bild").GetChunk(0, rcs("Bild").FieldSize)
    ************************************************** ***************


    Put #1, , jpg

    FormfeldTitel_Exit:

    Close #1
    End If

    rcs.Close

    Ende:
    Erase jpg
    Set rcs = Nothing
    Exit Sub

    Fehler:
    Reset
    MsgBox Err.Description
    Resume Ende
    FormfeldTitel_Err:
    If Err.Number = 7 Then
    MsgBox Err.Number & vbNewLine & Err.Description
    End If
    Resume FormfeldTitel_Exit
    End Sub


    Ereignis im Bericht
    __________________________________________________ ___________

    Private Sub Detailbereich_Format(Cancel As Integer, FormatCount As Integer)

    Dim DatenbankPfad As String
    Dim TempBild As String

    DatenbankPfad = "D:\tmpAccessBilder"

    If Not (Me.BilderID) = 0 Then
    TempBild = DatenbankPfad & "/tmp" & Trim(Str(Me.BilderID)) & ".jpg"
    BildErstellung TempBild, Me.BilderID

    On Error GoTo Bilddeaktivieren
    Me.BinaerJPG.Picture = TempBild
    Me.BinaerJPG.Visible = True

    Else

    Bilddeaktivieren:
    Me.BinaerJPG.Picture = ""
    Me.BinaerJPG.Visible = False
    Exit Sub

    End If
    End Sub

    Gibt es eine Möglichkeit das Einlesen anders zu gestalten damit der Speicher nicht an seine Grenzen kommt.
    Wenn die Meldung Laufzeitfehler 7 kommt sind im Taskmanager knapp 2 GByte verbraten.

    Danke für Eure Hilfe
    Gruß
    Pebbles

  • #2
    Schau mal ob du statt dbOpenDynaset sowas wie dbOpenForwardOnly findest. Ansonsten hast du einen Curser der im Client gecacht wird.

    Comment


    • #3
      Originally posted by Bernhard Geyer View Post
      Schau mal ob du statt dbOpenDynaset sowas wie dbOpenForwardOnly findest. Ansonsten hast du einen Curser der im Client gecacht wird.
      Hi Bernhard, erst mal Danke für Deine schnelle Antwort.

      Was meinst Du mit "dbOpenForwardOnly" finden. Kann ich das nicht einfach ersetzen?

      Wenn ich das richtig verstehe wird mit meinem Code der RAM voll geschrieben und mit Deiner Idee eben nicht. Ist das korrekt?

      Gruß
      Pebbles

      Comment


      • #4
        Suche ob du folgendes findest:

        dbOpenDynaset -> dbOpenForwardOnly

        Damit werden die Datensätze verworfen wenn du auf den nächsten Datensatz positionierst.

        Comment


        • #5
          Hi Bernhard,

          ich habe es ausprobiert, geleiches Problem Speicher wird voll geschrieben und besagter Fehler taucht wieder auf.
          Ich bin hier echt ratlos, kann Access bei Erschöpftem Speicher nicht auf die Platte schreiben?

          Comment


          • #6
            Hallo pebbles,
            nur wenn es zu viele Bilder sind kommt bvesagter Fehler
            Da Du pro Detailsatz nur ein Bild einliest, sollte das nicht das Problem sein; aber irgendeinen Grund sollte es ja haben.

            SELECT * sollte man vermeiden, besonders wenn nur ein Feld benötigt wird; wer weiss was noch alles im Datensatz enthalten ist.
            dbSeeChanges "verschlimmert" den lokalen Cursor noch einmal; willst Du wirklich wissen, ob zwischenzeitlich Daten geändert werden (abfragen tust Du es jedenfalls nicht)?
            Verwende dbReadOnly, es soll ja auch nichts gesperrt werden.
            Du liest u.a. das BLOB unnötiger weise in ein Array ein, um es anschließend in ein File zu schreiben.
            Verwende lieber ADO Stream, das erledigt das auf einen Schlag und ist wesentlich performanter.
            Könnte so aussehen; ist ungetestet:

            [highlight=vb]Private Sub BildErstellung(strJPGFile, strBilderID)
            Dim rcs As DAO.Recordset, i As Long
            Dim sql As String
            Dim oStream As ADODB.Stream

            On Error GoTo FormfeldTitel_Err

            sql = "SELECT Bild " & _
            "FROM dbo_Bilder " & _
            "WHERE [BilderID]=" & strBilderID
            Set rcs = CurrentDb.OpenRecordset(sql, dbOpenForwardOnly, dbReadOnly)
            If rcs.EOF Then
            MsgBox "Ein Bild mit dieser Nummer ist nicht in der Datenbank vorhanden."
            Else
            Set oStream = New ADODB.Stream
            With oStream
            .Open
            .Type = adTypeBinary
            .Write rs.Fields("Bild").value
            .SaveToFile strJPGFile, adSaveCreateOverWrite
            End With
            End If
            rcs.Close

            Ende:
            Set rcs = Nothing

            Exit Sub

            Fehler:
            Reset
            MsgBox Err.Description
            Resume Ende
            FormfeldTitel_Err:
            If Err.Number = 7 Then
            MsgBox Err.Number & vbNewLine & Err.Description
            End If
            Resume FormfeldTitel_Exit
            End Sub[/highlight]
            Olaf Helper

            <Blog> <Xing>
            * cogito ergo sum * errare humanum est * quote erat demonstrandum *
            Wenn ich denke, ist das ein Fehler und das beweise ich täglich

            Comment


            • #7
              Hi Olaf,

              erst mal vielen Dank. Deine Annahmen sind absolut korrekt ich will das Bild nur auslesen und in den Bericht einlesen. Sollte sich das Bild zwischenzeitlich geändert haben ist das relativ unwichtig.
              Ich werde es testen und eine Rückmeldung geben.
              Gruß
              Pebbles

              Comment


              • #8
                Schade hat leider auch nicht funktioniert, Speicher läuft auch mit dieser Methode voll.

                Kann man denn den Speicher nicht nach jedem geschriebenen Bild wieder frei geben? Oder zumindest nach jedem 100 Bild
                Ich denke das wäre die Lösung. Aber wie stelle ich das an?

                Comment


                • #9
                  Dann liegt es nicht direkt an dieser Routine, das scheint mir mehr das Symtom zu sein als die Ursache.
                  Resourcen, die nicht mehr verwendet werden, werden von VBA automatisch freigegeben, da kann & muss man selbst nichts freigeben.

                  Es wird an etwas anderem liegen, sieht Dir dieses hier mal an und prüfe, ob etwas davon in Frage kommt:
                  MSDN: Gründe für Laufzeitfehler 7
                  MS Support: Laufzeitfehler 7
                  Olaf Helper

                  <Blog> <Xing>
                  * cogito ergo sum * errare humanum est * quote erat demonstrandum *
                  Wenn ich denke, ist das ein Fehler und das beweise ich täglich

                  Comment


                  • #10
                    Mit der Methode die Du mir gepostet hast bekomme ich einen anderen Fehler.

                    Laufzeitfehler 3633
                    Can't load DLL: MSJTER40.DLL

                    Aber wie auch immer, ich denke Acces läuft so lange bis die 2 GByte Grenze erreicht ist und dann kommen die verschiedensten Fehler.
                    Generell funktioniert es ja auch, nur bei großen Datenmengen (ca. 2500 Bilder) kackt Access ab.
                    Ich müßte also eine Routine finden die sich nicht den ganzen Speicher nimmt und wenn ja, diesen auf die Platte auslagert.

                    Vielleicht hast Du ja noch eine Idee - erst mal vielen Dank für Deine Mühe -Gruß Pebbles

                    Comment


                    • #11
                      So wieder ein Stück weiter, das Problem liegt nicht an dem Blob auslesen sondern im Bericht.
                      Der Speicher läuft mit den Bildern so voll das der Bericht am Ende die Bilder nicht mehr anzeigen kann.
                      Hat hier jemand eine Idee?

                      Comment

                      Working...
                      X