Announcement

Collapse
No announcement yet.

Ungültige Blob-Länge

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

  • Ungültige Blob-Länge

    Hallo zusammen!

    Ich habe hier ein kleines Problemchen: Ich habe einige Routinen geschrieben, mit denen ich die Inhalte einer PDX-Tabelle in eine bestehende Tabelle unter SQL Server 7/MSDE pushe (insbesondere formatierte Memos, Bitmaps, JPEGs).
    Die Master-Tabelle hat einen aus zwei Feldern bestehenden Primärschlüssel, welcher auf die Detail-Tabelle zeigt. Unter PDX funktioniert das ganz toll, wenn allerdings ein BLOB (Bitmap), dessen Size > 0 ist, gepostet wird, bekomme ich eine "ungültige Blob-Länge"! (Ich habe gelesen, dass es Probleme bei BLOBs > 1MB geben kann, die verwendeten BLOBs sind jedoch maximal 42KB groß!) Der Witz an der Sache ist, dass ich zu Testzwecken eine kleine Beispieltabelle manuell im Enterprise-Manager angelegt habe und anschließend sämtliche BLOBs ohne Probleme geschrieben wurden! Der Programmcode scheint somit korrekt zu sein?! Ich vermute, daß das Problem in der Tabellendefinition liegt (die Tabellen werden über Platinum ERwin erzeugt). Wie kann ich diesen Fehler beheben? Für einen kleinen Hinweise wäre ich sehr dankbar!

  • #2
    Hallo,

    wenn die exakt gleiche Programm-Implementierung bei einer neu angelegten Tabelle funktioniert, ist vor allem interessant, wie sich diese Tabelle von der problembehafteten unterscheidet. Es gibt in der Kombination Delphi + SQL Server 7/MSDE einige Einschränkungen, die davon abhängen, wie auf die Datenbank zugegriffen wird. Im Fall von <b>ADO</b> sollten die wenigsten Probleme auftreten, allerdings gelten für den Zugriff mit der <b>BDE</b> (SQL-Links) massive Einschränkungen: Die BDE-Treiber unterstützen nur die Merkmale der Version 6.5 des MS SQL-Server, die neue Datentypen dürfen nicht verwendet werden.

    Ich würde zuerst versuchen, die Unterschiede zwischen den beiden Tabellenstrukturen zu ermitteln und jeweils eine reproduzierbare Testumgebung zu schaffen (Variante 1 ohne Fehler; Variante 2 in jedem Fall mit Fehler). Wenn das geschafft ist, bin ich gespannt, wie diese Tabellenstruktur jeweils aussieht

    Comment


    • #3
      Hallo Andreas!<br>
      <p>Mittlerweile habe ich sehr viele verschiedene Möglichkeiten durchgespielt, sowohl über die BDE-, als auch über die ADO-Komponenten.</p>
      <p>Es ist allerdings fraglich, ob die Fehlermeldung "ungültige Blob-Länge" überhaupt den "tatsächlichen" Fehler referenziert: Lege ich eine simple Tabelle (allerdings ohne Beziehungen zu anderen Tabellen) ohne Primärschlüssel an und versuche die (Bitmap-)BLOBs zu konvertieren, tritt diese Fehlermeldung auf, setze ich den Schlüssel, funktioniert es! Wenn ich diese Routinen allerdings auf die tatsächlich zu konvertierenden Tabellen anwende, tritt dieselbe Fehlermeldung wieder auf!</p>
      <p>Zum besseren Verständniss hier die Tabellenstrukturen:<br>
      <font face="courier">
      --- PARADOX: ---<br>
      Tabelle 1:<br>
      1. PID (String) x<br>
      2. Herkunft (String) x<br>
      3. ...<br>
      4. ...<br>
      <br>
      Tabelle 2:<br>
      1. PID (String) FK<br>
      2. Herkunft (String) FK<br>
      3. ...<br>
      4. SmallPic (Blob)<br>
      x Zusammengesetzter Primärschlüssel<br>
      <br>
      --- SQL-Server 7: ---<br>
      Tabelle 1:<br>
      1. PID (varchar 20, not null) x<br>
      2. Herkunft (varchar 20, not null) x<br>
      3. ...<br>
      4. ...<br>
      <br>
      Tabelle 2:<br>
      1. PicID (int, not null) x<br>
      2. PID (varchar 20, null) FK<br>
      3. Herkunft (varchar 20, null) FK<br>
      4. ...<br>
      5. SmallPic (image)<br>
      x (Zusammengesetzter) Primärschlüssel<br></font>
      <br>
      PicID (selbstinkrementierend!) muß gesetzt werden, da ansonsten, wie bereits oben beschrieben, wieder "ungültige Blob-Länge" auftritt.<br>
      Ich hoffe, die Situation ist deutlich geworden? Irgendein Vorschlag? Meine gehen mir langsam aus!
      </p&gt

      Comment


      • #4
        Hallo,

        ich habe noch eine Zwischenfrage: Wie wird der Datensatz mit den BLOB-Daten für die Spalte SmallPic in die Tabelle eingefügt (TTable oder TQuery)? Wenn mit TTable oder mit einer editierbaren TQuery, tritt das Problem auch dann auf, wenn mit TQuery nur eine INSERT-Anweisung abgeschickt wird (d.h. der eingefügte Datensatz wird anschliessend nicht sofort wieder gelesen)

        Comment


        • #5
          Hallo Andreas,<br>
          <p>vielen Dank für die Mühe, das Problem lag allerdings ganz woanders. Für diejenigen, die es interessiert: Zum einen muss in der Tabelle, in der das BLOB-Feld auftaucht, ein Primärschlüssel definiert sein, zum anderen müssen die Datenbank- und Tabellennamen bereits zur Designzeit festgelegt werden, dürfen also nicht erst zur Laufzeit gesetzt werden!</p>
          <p>Ich habe allerdings noch eine kleine Frage, auch wenn diese ein wenig off-topic ist: Wenn ich im Enterprise-Manager für eine SQL-Server-Tabelle ein AutoInc-Feld definiere (z. B. Datentyp: Int, Identität: True, ID-Startwert: 1, ID-Schrittweite: 1), wird dies unter Delphi nicht korrekt inkrementiert: Wenn die Zeile gespostet wird, bekomme ich "ID-Feld muss einen Wert enthalten", wenn ich einen setzte, erhalte ich "ID-Feld darf nicht explizit gesetzt werden". Ich habe die Feldeigenschaften entsprechend abgeändert und verschiedene Tabellenstrukturen definiert, hat scheinbar aber nicht viel gebracht! Wo könnte der Fehler liegen?</p&gt

          Comment


          • #6
            Hallo,

            das folgende Beispielprojekt verwendet eine IDENTITY(1,1)-Spalte für den Primärschüssel und kann über ADO völlig problemlos auf eine Tabelle mit einem selbstinkrementierenden Primärschlüssel zugreifen. Alle Konfigurationen, die mit dem Objektinspektor etc. vorgenommen wurden, sollten sich aus dem folgenden Beispiel nachvollziehen lassen:
            <pre>
            object Form1Main: TForm1Main
            Left = 192
            Top = 107
            Width = 355
            Height = 259
            Caption = 'ADO und AutoInc-Primärschlüssel in der MSDE'
            Color = clBtnFace
            Font.Charset = DEFAULT_CHARSET
            Font.Color = clWindowText
            Font.Height = -11
            Font.Name = 'MS Sans Serif'
            Font.Style = []
            OldCreateOrder = False
            PixelsPerInch = 96
            TextHeight = 13
            object SpeedButtonOpen: TSpeedButton
            Left = 0
            Top = 1
            Width = 23
            Height = 22
            Caption = 'C'
            OnClick = SpeedButtonOpenClick
            end
            object StatusBar1: TStatusBar
            Left = 0
            Top = 213
            Width = 347
            Height = 19
            Panels = <
            item
            Width = 150
            end
            item
            Width = 50
            end>
            SimplePanel = False
            end
            object DBNavigator1: TDBNavigator
            Left = 24
            Top = 0
            Width = 240
            Height = 25
            DataSource = DataSource1
            TabOrder = 1
            end
            object DBGrid1: TDBGrid
            Left = 0
            Top = 32
            Width = 345
            Height = 175
            DataSource = DataSource1
            TabOrder = 2
            TitleFont.Charset = DEFAULT_CHARSET
            TitleFont.Color = clWindowText
            TitleFont.Height = -11
            TitleFont.Name = 'MS Sans Serif'
            TitleFont.Style = []
            end
            object ButtonResync: TButton
            Left = 268
            Top = 0
            Width = 75
            Height = 25
            Caption = 'Resync'
            TabOrder = 3
            OnClick = ButtonResyncClick
            end
            object ADOConnection1: TADOConnection
            ConnectionString =
            'Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initi' +
            'al Catalog=OSSISOFT;Data Source=(local);Locale Identifier=1031;C' +
            'onnect Timeout=15;Use Procedure for Prepare=1;Auto Translate=Tru' +
            'e;Packet Size=4096;Workstation ID=G6-300'
            CursorLocation = clUseServer
            IsolationLevel = ilReadCommitted
            Mode = cmReadWrite
            Provider = 'SQLOLEDB.1'
            Left = 16
            Top = 72
            end
            object ADOTable1: TADOTable
            Connection = ADOConnection1
            CursorType = ctDynamic
            TableName = 'AutoIncTest'
            Left = 56
            Top = 72
            object ADOTable1ID: TAutoIncField
            AutoGenerateValue = arAutoInc
            DisplayWidth = 12
            FieldName = 'ID'
            ProviderFlags = [pfInWhere, pfInKey]
            ReadOnly = True
            end
            object ADOTable1Info: TStringField
            DisplayWidth = 22
            FieldName = 'Info'
            ProviderFlags = [pfInUpdate]
            end
            object ADOTable1Datum: TDateTimeField
            DisplayWidth = 15
            FieldName = 'Datum'
            ProviderFlags = [pfInUpdate]
            end
            end
            object DataSource1: TDataSource
            DataSet = ADOTable1
            Left = 96
            Top = 72
            end
            end
            </pre&gt

            Comment


            • #7
              Das Problem mit dem Identity Feld tritt in C-Builder 3 auf auf. Hier die Lösung: Nach Definition der Table mußt du über den "Felder Editor" ( so heißt er in C-Builder ) die ReadOnly-Eigenschaft des Identity Feldes auf true setzen. Danach müßten deine Probleme behoben sein.

              Andrea

              Comment

              Working...
              X