Calocybe: Mehrfaches Auslesen eines Feldes im selben Datensatz

Hallo Leute!

Ich bin gerade dabei, unsere Intranetseiten etwas aufzupolieren. Es geht um eine Datenbankabfrage (von ASP mit VBScript ueber ODBC auf Access97). Eine Tabelle enthaelt ein Textfeld, welches eine Hyperlinkadresse enthaelt (Textfeld, hat nichts mit dem "Hyperlink"-Datentyp von Access zu tun). Logischer Weg, dies in einer Schleife auszugeben waere:

<TD CLASS="smallresult"><A HREF="<%=rs("address")%>" TARGET="_blank"><%=rs("address")%></A><BR></TD>
(rs ist ein Recordset-Object)

Hier sollte etwas wie
<TD CLASS="smallresult"><A HREF="http://meine.domain.de/usw/" TARGET="_blank">http://meine.domain.de/usw/</A><BR></TD>
herauskommen. Tut es aber nicht, stattdessen erhaelt man
<TD CLASS="smallresult"><A HREF="http://meine.domain.de/usw/" TARGET="_blank"></A><BR></TD>

Der zweite Versuch, die Adresse auszugeben, wird also schlicht und einfach ignoriert!
Ich habe mir jetzt mit folgender Konstruktion beholfen:

<% foo = rs("address") %>
<TD CLASS="smallresult"><A HREF="<%=foo%>" TARGET="_blank"><%=foo%></A><BR></TD>

Das funktioniert erstmal, ist aber natuerlich nicht so besonders toll. Hat jemand schonmal aehnliche Erfahrungen gemacht, und vor allem: Weiss jemand, woran das liegt?

Calocybe

  1. Hallo Leute!

    Ich bin gerade dabei, unsere Intranetseiten etwas aufzupolieren. Es geht um eine Datenbankabfrage (von ASP mit VBScript ueber ODBC auf Access97). Eine Tabelle enthaelt ein Textfeld, welches eine Hyperlinkadresse enthaelt (Textfeld, hat nichts mit dem "Hyperlink"-Datentyp von Access zu tun). Logischer Weg, dies in einer Schleife auszugeben waere:

    <TD CLASS="smallresult"><A HREF="<%=rs("address")%>" TARGET="_blank"><%=rs("address")%></A><BR></TD>
    (rs ist ein Recordset-Object)

    Hier sollte etwas wie
    <TD CLASS="smallresult"><A HREF="http://meine.domain.de/usw/" TARGET="_blank">http://meine.domain.de/usw/</A><BR></TD>
    herauskommen. Tut es aber nicht, stattdessen erhaelt man
    <TD CLASS="smallresult"><A HREF="http://meine.domain.de/usw/" TARGET="_blank"></A><BR></TD>

    Der zweite Versuch, die Adresse auszugeben, wird also schlicht und einfach ignoriert!
    Ich habe mir jetzt mit folgender Konstruktion beholfen:

    <% foo = rs("address") %>
    <TD CLASS="smallresult"><A HREF="<%=foo%>" TARGET="_blank"><%=foo%></A><BR></TD>

    Das funktioniert erstmal, ist aber natuerlich nicht so besonders toll. Hat jemand schonmal aehnliche Erfahrungen gemacht, und vor allem: Weiss jemand, woran das liegt?

    Calocybe

    Hi,

    Sicher, dass Du dich nicht vertippt hast? ASP macht zwar manchmal recht komische sachen, wie z.B. dynamisch generierte Buchstaben ohne Grund auf der Webseite anzeigen ;) aber sowas haben wir noch nicht erlebt, und wir machen ALLES mit ASP (-> franken-auto.de fast-connect.de ehp-pers.de memmel-online.de just-4-fun.de uvm.)!
    Naja, das mit <%=foo%> scheint ja prima zu funkionieren, ausserdem sparst du dabei 9 Buchstaben im vergleich zur Ersten Variante ;)

    bye Georg

    1. Hallo Georg!

      Sicher, dass Du dich nicht vertippt hast?

      Ja, ich hab da echt lange rumprobiert. Der Fehler ist in verschiedenen Dateien aufgetreten, die ich nicht mit Copy&Paste gebaut habe.  Und Jens sagt ja auch, er hatte das schonmal.

      ASP macht zwar manchmal recht komische sachen, wie z.B. dynamisch generierte Buchstaben ohne Grund auf der Webseite anzeigen ;) aber sowas haben wir noch nicht erlebt

      Sowas hatte wiederum ich noch nicht. *g* Ich hatte aber schon diverse sinnlose Cache-Probleme, wo der IIS tagelang ein Update der Seiten nicht ausgespuckt hat (nein, es war kein Proxy-Problem).

      Naja, das mit <%=foo%> scheint ja prima zu funkionieren, ausserdem sparst du dabei 9 Buchstaben im vergleich zur Ersten Variante ;)

      *LOL* Na da hat sich die Arbeit ja gelohnt! Zum Glueck habe ich die Variable nicht dummy genannt, sonst waere der Vorteil fast dahin... ;-)

      Bye, Calocybe

  2. Hmm..
    ich machs bei mir so.. das funktioniert problemlos:

    response.write "<font face=""Arial"" size=""2""><a href=" & db("URL") & " target=""_new"">" & db("Link") &"</a></font><br>"

    Allerdings sollte deine Version eigentlich genauso
    funktionieren.
    morgen mal ausprobieren.. :)

    gruss
    Jens

    1. Habs gerade eben noch mal lokal getestet mit

      <A HREF="<%=DB("URL")%>" TARGET="_blank"><%=DB("url")%></A><BR>

      kein Problem..
      einzige ws mir noch einfällt , ist deine Version der
      Data-Access-Objects halbwegs aktuell ?
      Ich hab glaub ich 2.1 drauf (die vom SP-4)

      gruss
      Jens

  3. Hey,

    ich habe sowas bisher auch noch nie gesehen, aber bei MS ist nicht unmöglich.
    Eine Bitte hätte ich daher, Versionen der Komponenten (ASP.DLL, ODBC-Treiber, Webserver (IIS4 unter Windows NT ???), MDAC 2.1 ???)

    MDAC 2.0 und 2.1 haben etwas größere Probleme mit dem Cachen mehrerer Objekte. Es könnte daher sein, daß aufgrund der angegebenen Cache-Maximalwerte ein Teil der Sätze (oder Felder) nach Ausgabe einfach gelöscht wird.

    Evtl. hilft auch der komplette Quelltext der Seiten weiter. Falls diese zu groß ist kannst Du Sie mir auch per Mail schicken.

    Tschau, Stefan

    1. Hallo!

      ich habe sowas bisher auch noch nie gesehen, aber bei MS ist nicht unmöglich.

      Wem sagst Du das... *seufz*

      Eine Bitte hätte ich daher, Versionen der Komponenten (ASP.DLL, ODBC-Treiber, Webserver (IIS4 unter Windows NT ???), MDAC 2.1 ???)

      IIS4 unter NT4SP3. Die anderen Versionsnummern kann ich erst nachschauen, wenn ich morgen wieder im Buero bin. Was zum Teufel ist MDAC? Am ODBC-Treiber kann es durchaus liegen, der wird ja bei jeder Installation von irgendwas microsoftem ueberschrieben, ab und zu auch von einer aelteren Version. Naja, M$ hat's eben drauf.

      Evtl. hilft auch der komplette Quelltext der Seiten weiter. Falls diese zu groß ist kannst Du Sie mir auch per Mail schicken.

      Glaube kaum, dass der weiterhilft. Obwohl... vielleicht macht es einen Unterschied, wie man die Abfrage startet? Ich verwende immer
          set conn = server.CreateObject("ADODB.Connection")
          conn.open odbc_source, odbc_login, odbc_passwd
          set rs = conn.execute(sql)
      aber es gibt glaube ich noch eine andere Variante, wo man das RS-Objekt auch erst createn muss.

      Morgen werde ich mal Deinen Tip obendrueber mit rs.Fields() ausprobieren. Sowas kann auch nur wieder MS passieren! Man ueberlege nur mal, wie verdreht man programmieren muss, damit sowas ueberhaupt passieren kann. Was geht nur in deren Koepfen vor?!

      Calocybe

      1. Hey,

        IIS4 unter NT4SP3. Die anderen Versionsnummern kann ich erst nachschauen, wenn ich morgen wieder im Buero bin. Was zum Teufel ist MDAC? Am ODBC-Treiber kann es durchaus liegen, der wird ja bei jeder Installation von irgendwas microsoftem ueberschrieben, ab und zu auch von einer aelteren Version. Naja, M$ hat's eben drauf.

        set conn = server.CreateObject("ADODB.Connection")
            conn.open odbc_source, odbc_login, odbc_passwd
            set rs = conn.execute(sql)
        aber es gibt glaube ich noch eine andere Variante, wo man das RS-Objekt auch erst createn muss.

        Set conn = Server.CreateObject("ADODB.Connection")
            conn.open odbc_source, odbc_login, odbc_passwd
            Set rs = Server.CreateObject("ADODB.Recordset")
                rs.open SQL, conn, 3, 3
                Do While Not rs.EOF
        %>
                <a href="<%=rs.Fields("Feld")%>"><%=rs.Fields("Feld")%></a><br>
        <%
                    rs.MoveNext
                Loop
                rs.Close
            Set rs = Nothing
            conn.Close
        Set conn = Nothing
        %>

        Das sollte eigentlich funktionieren.
        MDAC bedeutet Microsoft Data Access Components.
        MDAC 2.1 ist die derzeit aktuelle Version. Es gibt aber z.B. Probleme, wenn in einer Schleife ein Datensatz gelöscht wird und dann per rs.MoveNext auf den "nächsten" Datensatz gesprungen werden soll. Er landet dann irgendwo, nur nicht auf dem gewünschten Satz.

        Es gibt zwar noch mehr Bugs, aber das wäre jetzt zuviel des guten, da die meisten Fehler sowieso nicht auffallen werden.

        Tschau, Stefan

        1. Moin mal wieder!

          Set conn = Server.CreateObject("ADODB.Connection")
              conn.open odbc_source, odbc_login, odbc_passwd
              Set rs = Server.CreateObject("ADODB.Recordset")
                  rs.open SQL, conn, 3, 3

          Tatsaechlich! Verwende ich diese Methode, funzt das mit dem mehrfachen Auslesen! Ob ich rs("feld") oder rs.Fields("feld") verwende, macht dabei keinen Unterschied, auch bei der anderen (Execute-) Methode nicht.

          Jetzt frage ich mich nur, was bedeutet das , 3, 3 bzw. , 1, 1 in Jens' Beispiel.

          Uebrigens Jens, Du hast recht, die rs.Open-Methode ist wirklich besser. Ich habe mich naemlich immer gewundert, warum die rs.MoveLast-Methode bei mir nicht funktioniert. Bei rs.Open geht es! Gut, brauch ich nicht mehr MoveNext bis zum Ende zu machen, nur um die Datensaetze zu zaehlen. Das duerfte die Performance entscheidend verbessern. Also Danke Euch, natuerlich auch Georg und Jens V.!

          MDAC bedeutet Microsoft Data Access Components.
          MDAC 2.1 ist die derzeit aktuelle Version. Es gibt aber z.B. Probleme, wenn in einer Schleife ein Datensatz gelöscht wird und dann per rs.MoveNext auf den "nächsten" Datensatz gesprungen werden soll. Er landet dann irgendwo, nur nicht auf dem gewünschten Satz.

          Naja, loeschen will ich ja gar nicht. Ich hab mal ein paar Versionsnummern herausgesucht, aber da wir das Problem jetzt gefunden haben, sind sie ja nicht mehr so wichtig. Wenn ich das richtig ueberblickt habe, ist die MDAC-Version noch 1.5.

          Nuja, also dann
          Calocybe

          P.S. Und jetzt in den ganzen Seiten von rs.execute auf rs.open umstellen... *mmpf*

          1. Tja, sorry Viktor, da hat der boese Forum-Script-Geist wohl wiedermal zugeschlagen. Musst leider Deine Frage nochmal stellen. Hoffe Du hattest nicht zuviel geschrieben.

            Calocybe

            1. Scheiße, das war ein Mamut-text *grummel*

              Also hier nochmals der Text, soweit ich ihn noch zusammen bekomme :o(

              Also ich hab hier im Archiv dieses JavaScript gefunden.

              <SCRIPT LANGUAGE="JavaScript">
              <!--
              if(top.frames.length < 1)
                {
                top.location.href="index.html";
                }
              //-->
              </SCRIPT>

              Dieses Script überprüft, ob die Seite in einem Frame steht und wenn nicht, dann wird die Datei index.html aufgerufen.

              Ha, super dachte ich und hab das Teil gleich auf alle Seiten geklatscht *g*. So weit so gut dachte ich. Bei den ersten Seiten hat's prima gefunzt, aber dann hab ich es aus einem Unterverzeichnis aufgerufen und da ging es bei einigen nicht.

              Ich hab die Zeile   top.location.href="index.html";  in   top.location.href="../index.html"; abgeändert. Bin ja ned blöd.

              Tja, komisch dachte ich und hab mal 2 Seiten miteinander verglichen.

              Die Seite die NICHT ging, hatte folgende Zeilen:

              <HTML>
              <HEAD>
              <title>Otto Graf Journal</title>
              <meta name="robots" content="noindex,nofollow">
              <SCRIPT LANGUAGE="JavaScript">
              <!--
              if(top.frames.length < 1)
                {
                top.location.href="../index.html";
                }
              //-->
              </SCRIPT>
              </HEAD>
              ...
              ...
              ...
              ..

              Die Seite die ging hatte diese Zeilen:

              <HTML>
              <HEAD>
              <title>Otto Graf Journal</title>
              <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
              <meta name="robots" content="noindex,nofollow">
              <SCRIPT LANGUAGE="JavaScript">
              <!--
              if(top.frames.length < 1)
                {
                top.location.href="../index.html";
                }
              //-->
              </SCRIPT>
              </HEAD>

              der einzige Unterschied war

              <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

              mit dieser Zeile geht alles.

              Mich würde interessieren, was diese Zeile mit dem Script zu tun hat??

              Gruß

              Viktor

          2. Jetzt frage ich mich nur, was bedeutet das , 3, 3 bzw. , 1, 1 in Jens' Beispiel.

            Uebrigens Jens, Du hast recht, die rs.Open-Methode ist wirklich besser. Ich habe mich naemlich immer gewundert, warum die rs.MoveLast-Methode bei mir nicht funktioniert. Bei rs.Open geht es!

            Ähh.. was das 1,1 bedeutet weiss ich auch nicht
            genau, hab das auch nur aus nem Beispiel in meinen
            ASP-Anfangstagen mal so wo gesehen und benutze es
            immer noch weil wenn ich es weglasse funzt .recordcount nicht.
            Übrigens auch noch ein kleiner Tip für dich, nix bis
            Ende zum Zählen , einfach tabelle.recordcount nehmen :)

            gruss
            Jens

            1. Hi again!

              Ähh.. was das 1,1 bedeutet weiss ich auch nicht
              genau, hab das auch nur aus nem Beispiel in meinen
              ASP-Anfangstagen mal so wo gesehen und benutze es
              immer noch

              Siehste, genauso ging's mir mit dem rs.execute ;-)

              Übrigens auch noch ein kleiner Tip für dich, nix bis
              Ende zum Zählen , einfach tabelle.recordcount nehmen :)

              Das wollte ich auch, aber da bisher das .MoveLast nicht ging und das .RecordCount auch nicht, habe ich es eben anders gemacht. Zumindest bei MS Access muss man, wenn man ein Recordset oeffnet, erst MoveLast machen, da sonst die RecordCount-Eigenschaft nicht stimmt. Wenn das bei den ASP-DAOs nicht noetig ist, um so besser.

              Calocybe

          3. Tach auch

            Jetzt frage ich mich nur, was bedeutet das , 3, 3 bzw. , 1, 1 in Jens' Beispiel.

            recordset.Open Source, ActiveConnection, CursorType, LockType, Options
            Die Konstanten dazu kannst  Du erfahren, wenn du bspw. einfach mal eine Referenz der ADO-Bibliothek in VB oder VBA einfügst.

            Weitere Details unter:
            http://msdn.microsoft.com/library/sdkdoc/dasdk/mdam4tgu.htm

            Ein Blick in das MSDN lohnt immer, wenns um APIs und Dokus von MS-Kram geht.

            Viel Spaß
            CirTap

            1. Ein Blick in das MSDN lohnt immer, wenns um APIs und Dokus von MS-Kram geht.

              Jepp.. im Prinzip schon nur finde ich da seltenst das
              was ich suche seit die da alles umgebastelt haben.. bzw. ich muss etwas wirklich umbedingt wissen das sich
              der Suchaufwand lohnt.. :)

              gruss
              Jens

      2. »»     set conn = server.CreateObject("ADODB.Connection")
        »»     conn.open odbc_source, odbc_login, odbc_passwd
        »»     set rs = conn.execute(sql)

        aber es gibt glaube ich noch eine andere Variante, wo man das RS-Objekt auch erst createn muss.

        Ähhhh.. execute ist eigentlich nur für Aktionsabfragen ,
        sprich einfügen , ändern , löschen gedacht (wunder mich
        das da überhaupt was bei dir mit funzt), für normale
        Abragen immer besser open nehmen also in etwa so :

        SQL = "SELECT * FROM [Links] ORDER BY [Links].Category, [Links].[Link] ; "
        Set DB = Server.CreateObject("ADODB.Recordset")
        DB.open SQL,"DSN=Roco_Main;UID=Admin",1,1

        gruss
        Jens

  4. Hey,

    tschuldigung für mein 2. Posting, aber ich hab's imersten vergessen.

    Probier doch mal rs.Fields("...") anstatt rs("...").
    Es gab eine Version der asp.dll, die die Zuordnung verloren hat, sobald das Feld einmal auf diese Art angesprochen wurde.

    Tschau, Stefan