Laden...

Erzeugten SQL String in String Array speichern

Erstellt von sg-sd vor 12 Jahren Letzter Beitrag vor 12 Jahren 6.699 Views
S
sg-sd Themenstarter:in
106 Beiträge seit 2006
vor 12 Jahren
Erzeugten SQL String in String Array speichern

Hallo,

ich versuche das Ergebnis des folgenden SQL Statements in C# auszulesen:



 strSqlStatement = 
"SELECT m.mannschaftsname + ' | ' + m.mannschaftsart + ' | ' + s.sportart" +
 "FROM mannschaft m , sportart s WHERE m.sportart = s.ID_PK_Index";

In der Tabelle "Mannschaft" habe ich einen Fremdschlüssel "Sportart" auf die Tabelle "Sportart".

Nun möchte ich gerne, alle Mannschaften aus der Tabelle" Mannschaft" abrufen und in einem String Array in meinen Programm speichern.

Dies versuche ich wie folgt:



            sqlcon.ConnectionString = sqlmanager.constr;
//Hier steht die Anzahl meiner vorhandenen Zeilen ermittelt mit Count(*)
            sqlcmd.CommandText = strCountAnzahl;
            sqlcmd.Connection = sqlcon;
            sqlcon.Open();
            int iAnzahl = Convert.ToInt32(sqlcmd.ExecuteScalar());
            sqlcon.Close();

            sqlcon.ConnectionString = sqlmanager.constr;
            sqlcmd.CommandText = strLadeDaten;
            sqlcmd.Connection = sqlcon;
            sqlcon.Open();

            SqlDataReader sqldr = sqlcmd.ExecuteReader();

            arDaten = new string[iAnzahl];

Nun kommt mein Problem, ich schaffe es z.B. mit folgendem Code, die einzelnen Felder aus der Tabelle "Mannschaft" abzufragen:

      
            while (sqldr.Read())
            {
                arDaten[i] = sqldr["Mannschaftsname"].ToString() +
sqldr["Mannschaftsart"].ToString();
                    
                i++;
            }

            sqldr.Close();
            sqlcon.Close();

         }

Aber ich bekomme es beim besten Willen nicht hin, mein gewünschtes Ergebnis in das String Array zu speichern.
Ich habe schon nach vielem gegoogelt, aber nichts passendes gefunden, evtl. falsch gegoogelt, ich weiß es nicht!

Mein letzer Versuch war, eine Spalte zu erzeugen auf die ich mich beziehe:


 strSqlStatement = 
"SELECT m.mannschaftsname + ' | ' + m.mannschaftsart + ' | ' + s.sportart AS Test" +
 "FROM mannschaft m , sportart s WHERE m.sportart = s.ID_PK_Index";
.
.
.
  while (sqldr.Read())
            {
                arDaten[i] = sqldr["Test"].ToString()

                i++;
            }

Dies hat leider auch nicht funktioniert.

Mein Ziel ist es, das Array arDaten mit dem von mir in SQL erzeugten String zu füllen.

Hoffe ich habe mein Problem einigermaßen verständlich rüber bringen können.

Vielen Dank für jeden Tipp!

gruß sg-sd

Wer, Wie, Was, Wieso, Weshalb, Warum ??
Wer nicht fragt bleibt dumm!!!

771 Beiträge seit 2009
vor 12 Jahren

Hi,

mit deinem Select-Befehl erzeugst du ja einen String (Text) als einzige Rückgabe (durch das Verketten mittels +).
Du mußt schon die einzelnen Spalten getrennt angeben:


SELECT m.mannschaftsname, m.mannschaftsart, s.sportart
FROM mannschaft m, sportart s WHERE m.sportart = s.ID_PK_Index

S
sg-sd Themenstarter:in
106 Beiträge seit 2006
vor 12 Jahren

Guten Morgen Cat,

aber habe ich keine Möglichkeit meine Weise zu nutzen?
Ich finde es für mich persönlich einfacher den String direkt im SQL so zubasteln wie ich es gerne hätte. Dadurch finde ich, bin ich flexibler. Iich kann meinen Code mehrfach benutzen wenn ich nur einen String immer wieder befüllen kann und muss nicht für mehrere verschiedene Abfragen immer wieder den selben Code schreiben.
Das Ganze sieht nämlich so aus:


 //iDatenID:
            //1 = Sportarten
            //2 = Mannschaften

            SqlManager sqlmanager = new SqlManager();
            SqlConnection sqlcon = new SqlConnection();
            SqlCommand sqlcmd = new SqlCommand();
            int i = 0;
            string strCountAnzahl = "";
            string strLadeDaten = "";
            string strDatenFeld = "";

            if (iDatenID == 1)
            {
                strCountAnzahl = "SELECT COUNT(*) FROM sportart;";
                strLadeDaten = "SELECT sportart FROM sportart;";
                strDatenFeld = "Sportart";
            }
            else if (iDatenID == 2)
            {
                strCountAnzahl = "SELECT COUNT(*) FROM mannschaft;";
              
                strLadeDaten = "SELECT m.mannschaftsname , m.mannschaftsart , s.sportart " +
                    "FROM mannschaft m , sportart s WHERE m.sportart = s.ID_PK_Index";
                strDatenFeld = "Mannschaftsname";
            }

            sqlcon.ConnectionString = sqlmanager.constr;
            sqlcmd.CommandText = strCountAnzahl;
            sqlcmd.Connection = sqlcon;
            sqlcon.Open();
            int iAnzahl = Convert.ToInt32(sqlcmd.ExecuteScalar());
            sqlcon.Close();

            sqlcon.ConnectionString = sqlmanager.constr;
            sqlcmd.CommandText = strLadeDaten;
            sqlcmd.Connection = sqlcon;
            sqlcon.Open();

            SqlDataReader sqldr = sqlcmd.ExecuteReader();

            arDaten = new string[iAnzahl];
          
            while (sqldr.Read())
            {
//Hier nun die spezielle Art und Weise um an meinen String aus der Tabelle Mannschaften zu kommen.
                arDaten[i] = sqldr["Mannschaftsname"].ToString() + " , " +
                    sqldr["Mannschaftsart"].ToString() + " , " +
                    sqldr["Sportart"].ToString();
                
                i++;
            }

            sqldr.Close();
            sqlcon.Close();

         }

Nun dachte ich mir, ich bau das Ganze so auf, das ich den ganzen SQL Code nur einmal schreiben muss.
Mit der Methode von Dir müsste ich ja jetzt wieder eine IF-Abfrage bei der "While-Schleife" einbauen. Je nachdem wie groß diese Funktion noch wird finde ich das nicht schön.

Gibt es evtl. noch eine andere Möglichkeit, wie ich an mein Ziel komme?

gruß sg-sd

Wer, Wie, Was, Wieso, Weshalb, Warum ??
Wer nicht fragt bleibt dumm!!!

T
574 Beiträge seit 2008
vor 12 Jahren

Was genau funktioniert daran eigentlich nicht? Bekommst du irgendwelche Fehler oder welches nicht erwartete Ergebnis erhältst du?

S
sg-sd Themenstarter:in
106 Beiträge seit 2006
vor 12 Jahren

Ohje ich habe gerade meinen Fehler gefunden: 8o


"SELECT m.mannschaftsname + ' | ' + m.mannschaftsart + ' | ' + s.sportart AS Test" +
"FROM mannschaft m , sportart s WHERE m.sportart = s.ID_PK_Index";

Hinter der frei definierten Spalte "Test" fehlt ein Leerzeichen.

Danke für Eure Unterstützung, mir ist das absolut nicht aufgefallen, erst als tkrasinger mich fragte wo genau ich rausfliege und ich erneut das "fehlerhafte" SQL Statement mir anschaute.

Wer, Wie, Was, Wieso, Weshalb, Warum ??
Wer nicht fragt bleibt dumm!!!

T
574 Beiträge seit 2008
vor 12 Jahren

Interessant trotzdem, dass du da keine Exception bekommen hast, oder hast du uns irgendwo ein Try/Catch unterschlagen ... ?

F
10.010 Beiträge seit 2004
vor 12 Jahren

Es ist eher interessant das noch keiner gefragt hat warum sg-sd es so machen will.

Zu meinen das Stringefrickel ( nicht nur bei den Parametern ) auf dem Server mehr flexibilität bringt als die Daten getrennt in eine DataTable zu lesen und diese dann entsprechend weiterzuverarbeiten lässt sich schon schwer nachvollziehen.

Und dann bei variablen Daten feste Arrays zu benutzen macht noch weniger sinn.

Mir erscheint es eher so das sg-sd noch nicht mal nachgelesen hat was ADO.NET eigentlich an Funktionen bietet, sondern einfach ( evtl von VB6 kommend ) es so macht wie bisher.
Mit einem DataAdapter und einer DataTable ( die sich auch gleich überall binden liesse ) wäre das insgesamt ein 4 Zeiler.

S
sg-sd Themenstarter:in
106 Beiträge seit 2006
vor 12 Jahren

Hallo FZelle,

also eigentlich bin ich schon lange aus der Programmierung raus und mich hat es in den Fingern gejuckt wieder etwas zu machen.
Deswegen habe ich mir die wahrscheinlich allseitsbekannte Galileo Computing Seite geschnappt und losgelegt. In Bezug auf Datenbanken, habe ich mich dann dem Kapitel "25 ADO.NET Verbindung zu einer Datenbank herstellen" gewidmet.
Dort habe ich mich durchgearbeitet und letzendlich ist der hier veröffentlichte Code bei rausgekommen.

Früher habe ich, wen ich etwas mit DB's gemacht habe, auf Datasets zurückgegriffen:

 
//Datenbanktest
                DB ds= new DB();

                DBDataSetTableAdapters.mannschaftTableAdapter dt = new DBDataSetTableAdapters.mannschaftTableAdapter();
                dt.Fill(ds.mannschaft);

                foreach (DBDataSet.mannschaftRow row in ds.mannschaft)
                {
                   //Auslesen was man haben will aus der Tabelle Mannschaft

                }

Kannst du mir sagen wie Dein 4 Zeiler aussehen würde?
Viel mehr Zeilen brauche ich auch nicht um z.B. ein Count abzusetzen:

    sqlcon.ConnectionString = strConnectionString;
            sqlcmd.CommandText = "SELECT COUNT(*) FROM sportart;";
            sqlcmd.Connection = sqlcon;
            sqlcon.Open();
            int iAnzahl = Convert.ToInt32(sqlcmd.ExecuteScalar());
            sqlcon.Close();

Kannst du mir evtl. sagen, was ich anders machen sollte?
Du schreibst ja schon etwas von

Zu meinen das Stringefrickel ( nicht nur bei den Parametern ) auf dem Server mehr flexibilität bringt als die Daten getrennt in eine DataTable zu lesen und diese dann entsprechend weiterzuverarbeiten lässt sich schon schwer nachvollziehen.

Und dann bei variablen Daten feste Arrays zu benutzen macht noch weniger sinn.

Allerdings weiß ich dies nicht zu interpretieren 🙁

Beispiel:
Wieso macht es keinen Sinn ein festes Array in meiner Funktion zu benutzen?

Danke für die Unterstützung

Wer, Wie, Was, Wieso, Weshalb, Warum ??
Wer nicht fragt bleibt dumm!!!

F
10.010 Beiträge seit 2004
vor 12 Jahren
  1. Du willst eine Variable Anzahl an Daten haben und dafür sind in .NET ( und eigentlich in allen modernen Sprachen ) extra Datentypen vorhanden.
    List<T> wäre da etwas.

  2. Weil Du diese nicht benutzt musst du zwei abfragen an die DB machen, eine für den Count, eine für die Daten.

  3. Da deine Count Abfrage nicht wirklich zu deiner Datenabfrage passt ist das Unheil vorprogrammiert.

  4. Du hast mit TableAdaptern gearbeitet und damit hast du dich nicht mit den Grundlagen beschäftigen müssen, ging ja alles per Klick.

  5. Wenn du dich mal hier im Forum umsiehst wirst du schnell auf Sachen wie DAL (Data Abstraction Layer) oder Repository stossen, was schon eine Erleichterung ist.

  6. Wäre dann z.b. deine Businesslogik auch gekapselt sähe die dann etwa so aus


public IMyDataLayer _dal{get;set}// Durch constructor oder injection gesetzt
.
.
.
.
protected DataTable DieFunktionDieWasZurueckGibt()
{
    return _dal.ExecuteDataTable("SELECT m.mannschaftsname , m.mannschaftsart , s.sportart FROM mannschaft m , sportart s WHERE m.sportart = s.ID_PK_Index");
}

Es reicht also nicht, nur die letzten Kapitel zu lesen, du solltest ganz von Vorne anfangen.
Wenn du ein Haus mit einem schönen Bad haben willst, musst du trotzdem vorher das Fundament erstellen.

S
sg-sd Themenstarter:in
106 Beiträge seit 2006
vor 12 Jahren

Danke für die Hinweise und Tipps!

Werde mir das ansehen und versuchen so gut wie möglich umzusetzen.
Werde mein Ergebnis dann hier posten oder weitere Fragen 😉

Wer, Wie, Was, Wieso, Weshalb, Warum ??
Wer nicht fragt bleibt dumm!!!

S
sg-sd Themenstarter:in
106 Beiträge seit 2006
vor 12 Jahren

Hallo FZelle,

so ich habe mich nun in die Materie DataSet, DataTable, DataView etc. eingelesen.
Ebenso habe ich mir DAL angesehen.

Bzgl. DAL habe ich mir zwei Methoden angesehen, zum einen über ein typisiertes Dataset und zum andern über ein untypisiertes Dataset.

Welche Variante würdest du bevorzugen?

Ich würde in die Richtung des untypisierten Datasets gehen, da ich dadurch flexibler bin, vorallem was Änderungen an der DB betrifft.

Das untypisierte Dataset ist zwar am Anfang wesentlich aufwendiger, da man sich nicht mit Mausklicks das ganze zusammen stellen kann, aber man muss es ja auch nur einmal machen und kann es immer und immer wieder verwenden.

Findest du man sollte generell immer mit dieser Methode arbeiten oder nur bei großen komplexen Programmen?

Danke für die Unterstützung!

Wer, Wie, Was, Wieso, Weshalb, Warum ??
Wer nicht fragt bleibt dumm!!!

3.825 Beiträge seit 2006
vor 12 Jahren

Arbeite immer so 😉

Mit dem untypsierten DataSet.

Bei komplexeren Programmen arbeite mit Entity Framework oder einem anderen O/R-Mapper.

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

F
10.010 Beiträge seit 2004
vor 12 Jahren

Bei Massendatenverarbeitung ist der Overhead eines ORMappers oder sogar von DataSets nicht akzeptabel.

Bei allen anderen Programmen kommt es auf die Aufgabenstellung und persönlichen Vorlieben an.
Aber nur so viel, es hat seinen Grund warum Moderne Sprachen streng typisiert sind.