Announcement

Collapse
No announcement yet.

Accesstabelle in eine Listbox laden

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

  • Accesstabelle in eine Listbox laden

    Ich habe einen Webservice, den ich über ein kleines Programm (mit Listbox und zwei Buttons) bedienen soll.
    Der Webservice greift auf eine Datenbank zu in der eine kleine Tabelle ist.
    Wenn ich das Programm starte, soll es mir den Inhalt der ersten Tabellenzeile in die Listbox schreiben. Das soll in etwa so aussehen (die | soll die Begrenzung einer Spalte sein. Wird also eine mehrspaltige Listbox... ):

    Name: | Max Mustermann
    Straße: | Musterstraße
    HNr: | 18
    PLZ: | 00000
    Ort: | Musterort

    Er soll die Bezeichnungen der Felder also nicht oben (wie in Access), sondern links angeben.
    Die SQL-Befehle sind dafür schon geschrieben. Mein Problem ist, dass ich nicht weiß, wie ich diese Daten in eine Variable laden kann. Ich hab den Tipp gekriegt, ich solle eine Stringliste benutzen, aber ich hab leider keine Ahnung wie das geht und das Internet war bisher auch keine Hilfe.

    Im Webservice ist eine getValue-Methode hinterlegt, die bis jetzt auch ohne Problem einzelne Tabelleneinträge ausgelesen hat (habe sie auch schon für ganze Zeilen umgeschrieben).

    Weiß jemand, wie ich diese Zeilen in eine Stringliste laden und dann in der Listbox ausgeben kann?
    Später sollen dann nicht nur eine sondern zwei Adressen nebeneinander gezeigt werden, aber momentan geht es erst mal darum überhaupt eine zu zeigen.

  • #2
    Hast Du jetzt einen WebService der Dir die Daten liefert oder eine Access Datenbank? Oder übergibst du dem WebService ein SQL Kommando? Wenn ja, was gibt der WebService zurück?

    Comment


    • #3
      In der AccessDatenbank stehen die Einträge und der Webservice holt sie sich durch einen SQL-Befehl.
      Momentan soll er einfach alles aus der Tabelle "Adressen" holen (Select * from Adressen.

      Die Webservice-Funktion gibt dann mit Return das Ergebnis und das Programm soll sich das dann holen und eintragen.

      Comment


      • #4
        Also willst Du nun einen WebService bauen oder die Einträge vom WebService abholen? Das sind zwei ganz unterschiedliche Aufgaben

        Für den WebService würde ich Dir empfehlen Dir sogenannte Data Transfer Objects (kurz DTO) anzulegen.

        Erstmal führst Du das SQL Query auf der Datenbank aus und wandelst die einzelnen Zeilen in serialisierbare Objekte um.

        Ein Objekt sieht in etwa so aus:

        [highlight=c#]
        public class AddressDao
        {
        public String Name { get; set; }
        public String Straße { get; set; }

        // und so weiter...
        }
        [/highlight]

        Wie gesagt holst Du Dir die Objekte aus der Datenbank (suchwort: DataReader), wandelst jede Zeile in einen solchen Eintrag um (einfach für jede Zeile neues Objekt anlegen und mit Werten füllen) und schickst sie per WebService als übers Netz.
        Zuletzt editiert von fanderlf; 05.11.2009, 20:13.

        Comment


        • #5
          Standartmäßig kann ein WebService nur die "Basisdatentypen" zurückliefern (Int, String, Float u.s.w)
          MS unterstutzt aber auch DataSets, also als erste Möglichkeit wäre ein DataSet zurück zu liefern, obwohl dass nicht der richtige Weg ist.

          Richtig wäre eine benutzerdefinierte Klasse zurück zu liefern. (Siehe die Klasse im Beispiel von fanderlf z.B.)

          Die Klasse muss aber serializable sein.
          Das kann man hinkriegen indem man Attribute [Serializable] einfügt

          [Highlight=c#]
          [Serializable()]
          public class AddressDao
          {
          public String Name { get; set; }
          public String Straße { get; set; }

          // und so weiter...
          }
          [/highlight]
          Bitte vergessen Sie nicht die Antwort zu bewerten. Danke.:-)

          Comment


          • #6
            Jup von DataSets würde ich die Finger lassen. Evtl. will man den Service mal mit Java benutzen und dann ists wieder vor bei dem WebService

            Das Serializable hab ich wohl vergessen, obwohls im Text noch drinne stand

            Comment


            • #7
              Ich hab jetzt nochmal genauer nachgefragt.

              Die Aufgabe ist:
              Webservice liest eine Tabelle aus. Jede Zeile, die ausgelesen wird, wird in einem separaten Array gespeichert.

              Ich muss also schaun, womit ich die Tabelle auslese (derzeit versuche ichs mit einem Recordset). Dann brauch ich wohl eine Schleife, um das zeilenweise zurückzugeben (mit MoveNext usw. wäre das ja kein Problem).
              Aber wie speicher ich das jedes Mal in ein anderes Array?
              Ich dachte an eine Art Zähler (i), der mit jedem Durchgang erhöht und einfach an den Array-Namen gehängt wird. Wäre so was realisierbar und wie?
              Oder hat jemand eine Alternative zum RecordSet?

              Mir alle Arrays vordeklarieren bringt mir nichts (wäre wohl auch sehr aufwendig), da das ganze am Schluss mit jeder beliebigen Accessdatenbank gehen soll (auch Datenbanken, die ein paar tausend, zehntausen... Datensätze haben).

              Und letztendlich muss das Programm (Listbox, Gridview oder was auch immer) mir dann die Arrays einzeln bzw. später in zweiergrüppchen ausgeben.

              Comment


              • #8
                ja wenn es unbedingt ein Array sein soll, wovon eher abzuraten ist, kannst de es ja mit einem Mehrdimensionalen Array abbilden
                Rückgabewert(x,y) wobei x die Zeile in der Datenbank ist und y die Spaltennummer repräsentiert.
                Unsere Jugend ist unerträglich, unverantwortlich und entsetzlich anzusehen! - Aristoteles

                Comment


                • #9
                  Aber sinnvoller ist auf jeden Fall DataTable (mit Abruf durch DbDataAdapter.Fill), die kann dann beliebig weiterverarbeitet werden. Jürgen

                  Comment


                  • #10
                    Originally posted by Imari View Post
                    Jede Zeile, die ausgelesen wird, wird in einem separaten Array gespeichert.
                    Was für DataTyp in Array ? Beispiel ?

                    Originally posted by Imari View Post
                    da das ganze am Schluss mit jeder beliebigen Accessdatenbank gehen soll
                    Hängt von DataProvider ab.

                    auch Datenbanken, die ein paar tausend, zehntausen... Datensätze haben
                    Hier sehe ich ein potentielles Problem. Du kannst nicht beliebig länge Datensätze über WS übertragen.
                    Eine Lösung wäre FW 3.5 + WCF mit Streaming zu nutzen.
                    Aber bei hosting auf IIS muss man dann Buffering ausschalten, was allerdings unsicher und dazu erst nur ab IIS 7 möglich ist.
                    Bei Windows Hosting gibt's so ein Problem nicht, dafür verliert man interoperabilität.
                    Eine Lösung für FW 2.0 wäre WebFunktion asynchronisch aufzurufen und
                    dabei jedes mal nur eine Zeile zu übertragen. Es wird zwar langsamer sein, lässt aber beliebig große Daten übertragen.
                    (Anstatt String sollte natürlich dein Array übergeben werden, das ist aber ein anderes Thema, solange DataTyp nicht bekannt ist.)
                    [highlight=c#]

                    private void AsyncCallUsingCallBack
                    (object sender, System.EventArgs e)
                    {
                    string Result = "";

                    // Create an instance of the WebService
                    localhost.MyAsyncWebService webServ =
                    new localhost.MyAsyncWebService();

                    // Create a delegate to handle the callback
                    AsyncCallback asyncCall =
                    new AsyncCallback(CallbackSampleMethod);

                    // Make an Asynchronous Call by calling
                    // the Begin method of the proxy class
                    webServ.BeginMyWebMethod(this.mLangInput, asyncCall, webServ);


                    }

                    // CallBack function
                    private void CallbackSampleMethod(IAsyncResult asyncResult)
                    {
                    // Create an instance of the WebService
                    localhost.MyAsyncWebService webServ =
                    (localhost.MyAsyncWebService)asyncResult.AsyncStat e;

                    // Get the Result of the WebMethod by calling
                    // the end method of the proxy class
                    Result = webServ.EndMyWebMethod(asyncResult);


                    // Mann kann z.B. hier überprüfen ob das Ergebniss null ist
                    // und wenn ja - dann ist die Übertragung fertig,
                    // sonst muss man hier
                    // ein Ereigniss aufrufen, das
                    // AsyncCallUsingCallBack wieder und wieder aufruft,
                    // bis letztendlich ein NULL (oder ein anderes End-Zeichen) kommt.

                    }
                    [/highlight]
                    Zuletzt editiert von vadym voytas; 07.11.2009, 00:43.
                    Bitte vergessen Sie nicht die Antwort zu bewerten. Danke.:-)

                    Comment


                    • #11
                      Originally posted by Jürgen Thomas View Post
                      Aber sinnvoller ist auf jeden Fall DataTable (mit Abruf durch DbDataAdapter.Fill), die kann dann beliebig weiterverarbeitet werden. Jürgen
                      Die Fill-Methode ist nur für DataSets gedacht (sagt zumindest der WebDeveloper).
                      Die Daten vom DataSet könnte ich wohl in eine DataTable einsetzen, aber ich weiß nicht wie ich damit weiterarbeiten kann.

                      Das Problem ist letztendlich, dass das Programm mehrfach laufen soll. D.h. 2 PCs, der Webservice schickt Datensatz1 an PC1 und, wenn dann PC2 das Programm nutzt, merkt der Webservice bei der Anfrage "Halt! Datensatz1 hat bereits PC1, also sende ich nun Datensatz2." und so weiter. Also muss der Service irgendwie einzeln über die Zeilen der Tabelle verfügen können...
                      Ich hoffe das ist so verständlich.

                      EDIT:
                      Also DataTable geht nicht, da ein Webservice dieses nicht verschicken kann (laut MS).
                      Listbox streichen ma, ein DataGridView ist wohl die bessere Variante (laut meiner Mitschüler *g*).

                      Code Webservice:
                      [highlight=vbnet]
                      Dim ds As New DataSet

                      Dim da As OleDbDataAdapter
                      da = New OleDbDataAdapter("SELECT * FROM " & sTableName & ";", conn)
                      da.Fill(ds)

                      conn.Close()

                      Return ds
                      [/highlight]

                      Code Programm:
                      [highlight=vbnet]
                      Dim ds2 As New DataSet
                      ds2 = ws.getValue

                      dgvTabellen.DataSource = ds2.Tables()
                      [/highlight]
                      (Try und andere Abfragen habe ich mal rausgelassen...)
                      Ich steh kurz vor der Verzweiflung, da im DataSet ds2 leider nichts ankommt.
                      Beim Debuggen kommt zwar die kleine Meldung, dass ds2 ein System....DataSet ist, aber wenn man dann mit der Maus auf dgvTabellen.DataSource bleibt, steht am Schluss "Nothing".
                      Jedoch ist ds aus dem Webservice nicht leer, denn ich kann mir den Inhalt im Webdienst anschauen. Dort stehen ganz brav alle Tabelleneinträge.

                      Ich habe im Netz auch eine Anleitung zu meinem Problem gefunden und da scheint genau dieser Code auch zu funktionieren...
                      Weiß irgendjemand wo der Fehler liegen könnte oder hat jemand eine sinnvolle Alternative?


                      EDIT 2:
                      Arrg... in der Klammer nach der DataSource muss eine 0 stehen... dann steht die ganze Tabelle im Grid... Dann kann man sich das mit dem zweiten DataSet auch sparen.
                      dgvTabellen.DataSource = ws.getValue(0) reicht vollkommen aus.

                      1. Weiß jemand wie ich es nun hinbekommen nur 2 Zeilen anzeigen zu lassen?
                      2. Ist es möglich Spalten mit Zeilen zu vertauschen? Hat da jemand ne Idee?
                      Ich bastel schon mit Schleifen am DataSet rum, aber noch hat nichts geklappt.
                      (Nochmal zur Erinnerung: Ich brauche allgemeine Vorschläge, da die Quelle variabel ist...)
                      Zuletzt editiert von Imari; 11.11.2009, 10:38. Reason: Ergänzung, 1. Lösung

                      Comment

                      Working...
                      X