Announcement

Collapse
No announcement yet.

Dyn.SQL mit Union ->ADO->SQL-Server=Access Violation

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

  • Dyn.SQL mit Union ->ADO->SQL-Server=Access Violation

    Moin!<BR>
    Ich stelle gerade ein ODA (Opus BDE Ersatz DAO) Projekt nach ADO um.<BR>
    Datenbank unter DAO: Access; unter ADO: Primär SQL-Server (7).<BR>
    Jetzt hänge ich an der Stelle:<BR>
    Wenn ich einen SQL dynamisch aufbaue, fliegt der mir bei der Stelle 'ADOQuery.SQL.add('union');' mit einer Zugriffsverletzung bei SQLOLEDB.DLL 'raus.<BR>
    Wenn ich paramcheck auf False setze, dann klappt alles, außer die Parameter....<BR>
    Was kann man da machen?<BR>
    MFG,cu,LLAP Ralph Erdt

  • #2
    Hallo,

    anscheined wird die SQL-Anweisung sofort geprüft, obwohl diese noch nicht vollstädig ist. Entferne dazu zuerst die ADOConnection aus der ADOQuery, setze die SQL-Anweisung und weise erst dann die ADOConnection erneut.

    mfg michae

    Comment


    • #3
      Ach so und wie sieht es aus, wenn anstelle der allseits beliebten ADOQuery ein ADODataSet und der Zuweisung der CommandText aus....

      michae

      Comment


      • #4
        Moin!<BR>
        Danke, das hat geholfen, aaaaber... :-/<BR>
        Ich geh jetzt hin, setzt die connection:=NIL; füll das Ding, dann Connection:=ADOConnection_irgendwas;<BR>
        Jetzt hat der allerdings noch keine Parameter erkannt, also geh ich hin und mache SQL.add(' ');<BR>
        Jetzt kommt noch zwei mal eine Zugriffsverletzung hoch, aber für den User unsichtbar. Da ich keine weiteren Einschänkung bemerkt habe, werde ich das mal ignorieren ... <BR>
        Das mit ADO-Dataset lasse ich mal, mein Chef trampelt mich schon ganz schön, so das ich nicht so die Zeit habe zum forschen.... <BR>
        MFG,cu,LLAP Ralph Erd

        Comment


        • #5
          Jo, das ist richtig.

          Das ist der Luxus, wenn bei aktiver Verbindung der SQL-Befehl gesetzt wird.

          Wird anstelle der ADOQuery das ADODataSet verwendet und der CommandText auf einmal gesetzt, so werden die Parameter eingelesen.
          Aber das kostet Zeit und so habe ich mir angewöhnt, den CommandText komplett mit den richtigen Werten zu setzen. Den Rest kann man dann bequem per Filter erledigen ( und auch zur Laufzeit umsortieren ).
          ( z.B. bei Oracle Datenbanken dringend anzuraten ... )

          Michae

          Comment


          • #6
            und wieder zu schnell abgeschickt ...

            Unbedingt vor dem setzen des SQL-Befehls das DataSet schließen.
            Und was passiert, wenn man anstelle der ADOQuery ein ADODataSet verwendet.

            ADOQuery.SQL.Clear;
            ADOQuery.SQL.ADD('...');
            ADOQuery.Open;

            anstelle von

            sCommand := sCommand + '...';
            ADODataSet.Commandtext := sCommand;
            ADODataSet.Open

            Comment


            • #7
              Moin!<BR>
              Nicht unbedingt Luxus, bei uns ist es notwendig. Je nachdem, was der User haben will, wird der SQL anders zusammengebaut.<BR>
              Und die Parameter sind notwendig, weil die Query mit mehreren verschiedenen Werten - je nach Bedarf - aufgerufen wird.<BR>
              Ich habe mich jetzt mal getraut das mit ADODataSet zu machen ... <BR>
              Connection ist zur Designzeit gesetzt. Zur Laufzeit fülle ich eine Stringliste (SQL:TStringList - damit ich nicht so viel arbeit habe ... und weise diese dem CommandText zu (CommandText:=SQL.Text).<BR>
              Bei dem Zuweisen kommt immer noch eine Zugriffsverletzung <BR>
              MFG,cu,LLAP Ralph Erd

              Comment


              • #8
                Guten Morgen,

                das ist merkwürdig, was für eine Fehlermeldung kommt denn.

                In unserer Anwendung wird auch der CommandText zur Laufzeit gesetzt und keine Probleme. Wahrscheinlich hat der ADO Provider Probleme die Parameter aufzulösen. Wie sieht denn das SQL-Kommando aus ....

                Michae

                Comment


                • #9
                  Moin!<BR>
                  "Im Projekt ... ist eine Exception der Klasse EAccessViolation aufgetreten. Meldung: 'Access violation at adress 753A22C0 in module 'sqloledb.dll'. Write of adress 006A0062'. Prozess wurde angehalten...."<BR>
                  Ich habe mal versucht, einen Beispiel-SQL zu machen, aber dann klappt alles. Erst wenn ich unser mörder-SQL abschicke, knallts:
                  <PRE>select
                  obj.objekt_id,
                  obj.objekt_titel,
                  obj.mand_kode,
                  obj.mabo_ab_datum as mabo_ab,
                  mo.marktobj_jn,
                  lobj.ansicht_kz,
                  round(sum(oja.vol_heftumfang),0) as vol_heftumfang,
                  sum(+oja.a_vol+oja.e_vol) as volumen,
                  SubString(max(oja.jahr+oja.ausgabe_nr_letzt),5,80) as ausgabe_letzt,
                  round(sum(oja.anz_ausgabe),0) as anz_ausgabe
                  from
                  (
                  (
                  st_markt_obj as mo
                  left join
                  lk_mand_obj as lobj
                  on mo.objekt_id = lobj.objekt_id
                  )
                  left join
                  dt_objekt as obj on
                  mo.objekt_id = obj.objekt_id
                  )
                  left join
                  dt_obj_jahr as oja
                  on mo.objekt_id = oja.objekt_id
                  where
                  mo.Markt_ID = :markt_ID and
                  :aenderbar_kz <>'Ö'
                  group by
                  obj.objekt_id,
                  obj.objekt_titel,
                  obj.mand_kode,
                  obj.mabo_ab_datum,
                  mo.marktobj_jn,
                  lobj.ansicht_kz
                  union
                  select
                  obj.objekt_id,
                  obj.objekt_titel,
                  obj.mand_kode,
                  obj.mabo_ab_datum as mabo_ab,
                  mo.marktobj_jn,
                  lobj.ansicht_kz,
                  round(sum(oja.vol_heftumfang),0) as vol_heftumfang,
                  sum(+oja.a_vol+oja.e_vol) as volumen,
                  SubString(max(oja.jahr+oja.ausgabe_nr_letzt),5,80) as ausgabe_letzt,
                  round(sum(oja.anz_ausgabe),0) as anz_ausgabe
                  from
                  (
                  (
                  st_markt_obj as mo
                  left join
                  lk_mand_obj as lobj
                  on mo.objekt_id = lobj.objekt_id
                  )
                  left join
                  dt_objekt as obj on
                  mo.objekt_id = obj.objekt_id
                  )
                  left join
                  dt_obj_jahr as oja
                  on mo.objekt_id = oja.objekt_id
                  where
                  mo.Markt_ID = :markt_ID and
                  :aenderbar_kz ='Ö'
                  group by
                  obj.objekt_id,
                  obj.objekt_titel,
                  obj.mand_kode,
                  obj.mabo_ab_datum,
                  mo.marktobj_jn,
                  lobj.ansicht_kz
                  order by
                  obj.objekt_titel</PRE>
                  Hmmm. Ich weiss nicht, was dafür sorgt, das die meldung kommt. Ich werde weiterforschen und bescheidsagen.<BR>
                  Hmmm Sehe gerade: Der meldet 'Stringliterale können nicht mehr als 255 Elemente besitzen'. Kann es daran liegen?<BR>
                  Danke und<BR>
                  MFG,cu,LLAP Ralph Erd

                  Comment


                  • #10
                    Moin,

                    ja das war was mit einer Begrenzung in der Anzahl der Zeichen, irgendwo im Forum gabs das Problem schon.

                    Auch ich habe das Problem z.B. Procedure zur Laufzeit erstellen zu wollen und wenn diese zu gross sind, wird der Rest ignoriert und dann ist das Kommando etwas sinnlos ....

                    Michae

                    Comment


                    • #11
                      Moin!<BR>
                      Hmmm. Die Suche bringt leider nichts.....<BR>
                      Und wie umgeht man das Problem?<BR>
                      MFG,cu,LLAP Ralph Erd

                      Comment


                      • #12
                        Hallo,

                        das SQL Kommando wiederholt sich anscheindend und wie wäre es diesen Teil einfach in eine Procedure auszulagern, die beiden Parameter zu übergeben und das resultset mit union dann zu kombinieren

                        Comment


                        • #13
                          Moin!<BR>
                          Das ist ja fast so gut wie chat ... )<BR>
                          Aber ich habe Dich jetzt nicht verstanden. Ich bin neu bei ADO + M$ SQL, und meine bisherigen Erfahrungen bezihen sich nur auf BDE + Oracle / DAO + Access.<BR>
                          Könntest du das bitte genauer schreiben?<BR>
                          Danke,<BR>
                          MFG,cu,LLAP Ralph Erdt<BR>
                          P.S. Bahnhof?? :

                          Comment


                          • #14
                            Hallo, habe gerade mal propbiert wo es bei mir knallt, aber ich bin gerade bei 12K und es geht immer noch ?!

                            Was passiert wenn man ohne ADOConnection den CommandText füllt,
                            die Parameter über

                            ADODataset.Parameters.CreateParameter(..)

                            selbst erstellt, die Connection aktiviert und das dataset öffnet...

                            Comment


                            • #15
                              Moin!<BR>
                              Ich probier das morgen mal aus.<BR>
                              MFG,cu,LLAP Ralph Erd

                              Comment

                              Working...
                              X