Announcement

Collapse
No announcement yet.

ADODataSet Verknüpfung + Persistentes DLookup Feld => Fehler bei Append und Insert

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

  • ADODataSet Verknüpfung + Persistentes DLookup Feld => Fehler bei Append und Insert

    Hi,
    <br>
    <br>D5E upd.Pack1 AdoExpress upd.Pack2, MSDE 1 SP2
    <br>
    <br>ich habe da ein ganz eigenartiges Phänomen:
    <br>DataSets:
    <br>bei allen gilt:
    <br>clUseClient und ctKeySet
    <br>AdoDataSet1
    <br>CommandText=Select a_ID from tbl_a
    <br>
    <br>AdoDataSet2
    <br>DataSource=DataSource1 (ist verknüpft mit AdoDataSet1)
    <br>CommandText=Select * from tbl_b where a_ID = :a_ID
    <br>beinhaltet unter anderem noch ein persistentes DLookupfeld X
    <br>X:
    <br>Feldeigenschaften:
    <br>Name:X
    <br>Typ: String
    <br>Größe: leer
    <br>FeldTyp: DlookUp
    <br>Nachschlage-Definition:
    <br>Schlüsselfelder: C_ID
    <br>Datenmenge: AdoDataSet3
    <br>Schlüssel: C_ID
    <br>Ergebnisfeld: C_Bezeichnung
    <br>
    <br>AdoDataSet3
    <br>CommandText=Select * from tbl_C
    <br>
    <br>AdoDatSet1 und AdoDatset2 werden in zwei getrenten Grids (Grid1 und Grid2)angezeigt.
    <br>Ändere ich nun die Position in Grid1 so werden in Grid2 neuen Daten angezeigt, da ja AdoDatset2 mit AdoDataSet1 über DataSource verknüpft sind.
    <br>
    <br>Versuche ich nun in Grid2 (AdoDataSet2) einen neuen Datensatz anzulegen, dann erscheint die folgende Meldung:
    <br>"Im Projekt Test.exe ist eine Exception der Klasse EOleException aufgetreten. Meldung: 'Unbekannter Fehler'. Prozeß wurde angehalten. Mit Einzel Anweisung oder Start fortsetzen."
    <br>
    <br>Bei Einzelanweisung/Start wird dann die neue leere Zeile in dem Grid wie gewohnt angezeigt.
    Dieser Fehler tritt jedoch nicht auf, wenn das Persistente DlookUp Feld X gelöscht wird. Dann funktioniert alles ganz normal.
    <br>
    <br>Dieser Fehler tritt auch nicht auf wenn AdoDataset2 nicht mit AdoDataSet1 verknüpft ist. Dann funktioniert es weiterhin, obwohl X existiert.
    <br>
    <br>Ich hoffe es kann mir jemand helfen.
    <br>
    <br>Danke!
    <br>
    <br>mfg
    <br>PS

  • #2
    <br>Hat man denn Worte?!?
    <br>Dieser Fehler tritt nur dann auf wenn das Programm im DebugModus gestartet wird. Wird lediglich die Compilierte EXE gestartet funktioniert alles.
    <br>
    <br>Ich muß jedoch das Programm aufgrund eines anderen Fehlers debuggen.
    <br>
    <br>Wer kann mir hier weiter helfen?
    <br>
    <br>Danke schon mal im Voraus.
    <br>
    <br>mfg
    <br>P

    Comment


    • #3
      Hat man denn Worte?!?
      <br>Dieser Fehler tritt nur dann auf wenn das Programm im DebugModus gestartet wird. Wird lediglich die Compilierte EXE gestartet funktioniert alles.
      <br>
      <br>Ich muß jedoch das Programm aufgrund eines anderen Fehlers debuggen.
      <br>
      <br>Wer kann mir hier weiter helfen?
      <br>
      <br>Danke schon mal im Voraus.
      <br>
      <br>Ach ja:
      <br>MDac 2.6
      <br>Gleiches Konstrukt in einer Access 97 DB funktioniert <br>einwandfrei, auch im Debug Mode.
      <br>
      <br>mfg
      <br>P

      Comment


      • #4
        <br>Nachtrag:
        <br>Auch mit SP3 für SQL Server 7 bleibt der selbe Fehler.
        <br>Wo liegt der Fehler?
        <br>Liegt es an dem Delphi Debugger?
        <br>Wie könnte man so etwas umgehen?
        <br>
        <br>mfg
        <br>P

        Comment


        • #5
          Hallo,

          steht der Profiler (aus dem MS SQL Server 7/2000) zur Verfügung? Wenn ja, würde ich dort mitprotokollieren lassen, welche SQL-Anweisung(en) ADO zur Datenbank schickt. Wenn der Profiler nicht zur Verfügung steht, welchen Inhalt hat die <b>Errors</b>-Kollektion zu diesem Zeitpunkt? Was passiert, wenn ADODataSet2 <b>Unique Table</b> definiert?

          ADO unterscheidet zwischen verschiedenen Leveln einer Fehlermeldung. Nicht alle davon werden im Programm von Delphi in eine Exception umgemünzt, aber der Debugger ist an dieser Stelle penibler. ADO muss auch mit einer ASP (Active Server Page) und mit Visual Basic umgehen können (die keine nativen Exceptions kennen). Daher unterscheidet sich die Fehlerbehandlung von ADO grundlegend von der in Delphi. In meinem neuen ADO-Buch musste ich daher der Fehlerbehandlung ein eigens, 37 Seiten umfangreiches Kapitel widmen

          Comment


          • #6
            Hallo,
            <br>
            <br>danke für die Antwort!
            <br>
            <br>1)
            <br>Unique Table wurde nun bei allen DataSets in der Form eingesetzt:
            <pre>
            procedure TForm1.ADODataSet1AfterOpen(DataSet: TDataSet);
            begin
            ADODataSet1.Recordset.Properties['Unique Table'].Value := 'tbl_A'; //bei den anderen datasets natürlich die entsprechende Tabelle
            end;
            </pre>
            Da in keinem der DataSets mit join gearbeitet wurde hatte ich das anfangs weggelassen.
            <br>Der Fehler bleibt jedoch.
            <br>
            <br>2)
            <br>Die Errors - Kollektion wird nun wie folgt abgefragt:
            <pre>
            procedure TForm1.ADODataSet2NewRecord(DataSet: TDataSet);
            begin
            showmessage(IntToStr(ADOConnection1.Errors.Count)) ; //liefert 1
            showmessage(ADOConnection1.Errors[0].Description ); //liefert 'Unbekannter Fehler'
            end;
            </pre>
            <br>Der Fehler tritt noch vor dem Ereignis NewRecord auf. Klickt man nach der Fehlermeldung auf "start" dann wird die Ereignisprozedure abgearbeitet und danach kann man den neuen Datensatz in dem Grid eingeben.
            <br>Was mir bei dieser Testerei aufgefallen ist:
            <br>Befinde ich mich nun in dem Grid in der neuen Zeile und gebe einen Wert in das Feld b_ID (AdoDataSet2 (tbl_b) (AutoWert Feld)) ein und verlasse dieses, so erhalte ich die selbe Fehlermeldung. <br>Anscheinend ist das auch die selbe Stelle im Programm, wenn ich den Inhalt des Delphi CPU Fensters richtig interpretiere.
            <br>
            <br>3)
            <br>Der Profiler liefert folgendes Ergebnis:
            <br>Anmerkung:
            <br>Es ist nicht zu übersehen, das die Tabellen in dem Profiler Protokoll andere Namen haben als in dieser Diskussion. Ich habe zur vereinfachung hier im Forum andere Namen verwendet.
            <br>Auflösung:
            <br>tbl_Kor = tbl_a (AdoDataSet1)
            <br>tbl_Detail = tbl_b (AdoDataSet2)
            <br>tbl_Master = tbl_c (AdoDataSet3)
            <br>Ich hoffe das ist jetzt nicht irreführend.
            <pre>
            select 504, c2.name, c1.name from master.dbo.syscharsets c1, master.dbo.syscharsets c2, master.dbo.syscurconfigs f where c1.id = f.value and f.config = 1123 and c1.csid = c2.id
            go
            SET NO_BROWSETABLE ON
            go
            select * from tbl_Master
            go
            select * from tbl_Kor
            go
            sp_executesql N'select * from tbl_Detail
            where kor_id = @P1', N'@P1 int', 1
            </pre>
            Der Fehler Tritt nach der Zeile "sp_executesql N'select * from tbl_Detail
            where kor_id = @P1', N'@P1 int', 1" auf. D.h. diese Zeile, welche die Daten für AdoDataset2 holt wird noch anstandslos ausgeführt. Wird nun ein neuer Datensatz erzeugt, so kommt die bekannte Fehlermeldung, jedoch wird diese nicht im Profiler registriert. (Anmerkung: ich habe die Standard Einstellung des Profilers verwendet. Auch wenn ich ihn extrem Sensitiv eingestellt habe kam keine Protokolierung dieses Fehlers zu stande.(oder ich habe da was falsch gemacht))
            <br>
            <br>Ich werde das jetz noch auf einem anderen Rechner mit anderem OS testen.
            <br>
            Was kann man sonst noch machen?
            <br>
            <br>mfg
            <br>p

            Comment


            • #7
              Hi,
              <br>
              <br>bin endlich fündig geworden. Unter Google-NewsGroup-Suche fand ich folgendes:
              <pre>
              TAdoTable.Insert
              and I got the error: "EOleException: An Unknow error has ocurred"
              When it was made the same thing with ttable instead of tAdoTable it worked
              fine.
              ...
              Does the dataset have a lookup field in it? If so try setting the lookupCache
              property to true.
              </pre>
              Ist aber schon eigenartig dieser Fehler. Eine Erklärung dafür habe ich nicht. Das Datum der News war 1999/12/22. Wenn dies ein Bug in AdoExpress ist, dann hat dieser anscheinend die zwei Updates überlebt.
              <br>
              <br>@A.Kosch: Vielen Dank nochmals für die Hilfe.
              <br>
              <br>mfg
              <br>P

              Comment

              Working...
              X