Dataset & SqlDataAdapter

Horst1945

Cadet 4th Year
Registriert
Okt. 2014
Beiträge
106
Hallöchen,

ich komme mit dem DataSet und dem SqlDataAdapter so richtig in der Reihe:

Code:
 private void button1_Click(object sender, EventArgs e)
            {
                try
                {
                    con.Open();
                    string SQLAbfrage = "Select kdnr, anrede, firma, Extra from Stammdaten";
                    SqlDataAdapter da = new SqlDataAdapter(SQLAbfrage, con);
                    DataSet ds = new DataSet();

                    da.Fill(ds, "stammdaten");
                    //con.Close();
                    txtName.Text = ds.Tables("stammdaten").rows(0).item("firma");
                }
                catch
                {
                    MessageBox.Show("Fehler");
                }

            }
Ich bekomme immer die Fehlermeldung:

fehlermeldung.jpg

angezeigt!

Horst
 
( ) wird bei Methodenaufrufen verwendet. Eine Indizierung einer Tabllenarrays mußt du mit [ ] machen, also mit eckigen Klammern. Tables["stammdaten"] statt Tables("stammdaten")

Statt eines DataSets kannst du übrigens auch einen DataTable füllen. Dann brauchst du gar nicht über "Tables" gehen.
Aber natürlich nur wenn du nicht mehere Tabellen ansprechen oder kombinieren willst.
 
Danke für dein Hinweis:

Und so habe ich das hinbekommen:

Code:
private void button1_Click(object sender, EventArgs e)
            {
                con.Open();
                DataSet ds = new DataSet();
                SqlDataAdapter adapter = new SqlDataAdapter();

                adapter.SelectCommand = new SqlCommand("Select KdNr, Anrede, Firma, plz, ort, kd-seit from stammdaten", con);
                adapter.Fill(ds);

                txtKdnr.Text = ds.Tables[0].Rows[0]["kdnr"].ToString();
                txtAnrede.Text = ds.Tables[0].Rows[0]["anrede"].ToString();
                txtName.Text = ds.Tables[0].Rows[0]["firma"].ToString();
                txtOrt.Text = ds.Tables[0].Rows[0]["ort"].ToString();
                txtPlz.Text = ds.Tables[0].Rows[0]["plz"].ToString();
                txtPlz.Text = ds.Tables[0].Rows[0]["kd-seit"].ToString();
                con.Close();
               
                
            }

Horst
 
Außerdem würde ich dir empfehlen die Connection nicht so lange offen zu lassen.
In Zeile 8 hast du schon alle Daten, die du brauchst ins DataSet gelesen. hier Kannst du die DbConnection schliessen.

Ich kenn deinen Code nicht, aber am besten arbeitet man bei DbConnection mit using. das heisst du müsstest die Close()- Methode nicht einmal mehr aufrufen.
 
Hallo,

so jetzt habe ich wieder einmal ein bisschen Zeit gehabt und wollen
über eine Where [Klausel] nur den Kunden mit der kdnr = "00 001" ausgeben. siehe unten:

Code:
private void grbSuchenW_Click(object sender, EventArgs e)
        {
            if (cmbSuchen.SelectedItem.ToString() == "Kundennummer")
            {
                con.Open();
                var strSQL = "Select KdNr, Firma, Plz, Ort from stammdaten where kdnr ='" + txtBSuchen + "'";
                DataSet ds = new DataSet();
                SqlDataAdapter adapter = new SqlDataAdapter();
                adapter.SelectCommand = new SqlCommand(strSQL, con);
                adapter.Fill(ds, "Stammdaten");
               

                txtName.Text = ds.Tables[0].Rows[0]["firma"].ToString();
                txtKdnr.Text = ds.Tables[0].Rows[0]["kdnr"].ToString();
                txtOrt.Text = ds.Tables[0].Rows[0]["ort"].ToString();
                txtPlz.Text = ds.Tables[0].Rows[0]["plz"].ToString();
                //txtPlz.Text = ds.Tables[0].Rows[0]["kd-seit"].ToString();
                con.Close();
                //txtSeit.Text = (string)rdr["kd-seit"];


                rdr.Close();
                con.Close();
                btnSuchenGrB.Visible = false;

            }

        }

im strSQL-String stehen nach Ausführung folgender Text:

Code:
Select KdNr, Firma, Plz, Ort from stammdaten where kdnr ='System.Windows.Forms.TextBox, Text: 00 001'

und die Fehlermeldung lautet:

Code:
  txtName.Text = ds.Tables[0].Rows[0]["firma"].ToString();
 {"An der Position 0 befindet sich keine Zeile."}
 
Zuletzt bearbeitet:
txbBSuchen.Text natürlich sonst nimmt wird das Objekt genommen und nicht der Inhalt.

Ausserdem soltest du mit Parametern arbeiten und nicht den Command nändisch zusammenkleben.
Code:
var strSQL = "Select KdNr, Firma, Plz, Ort from stammdaten where kdnr =  @query";
adapter.SelectCommand.Parameters.AddWithValues("@query", txbBSuchen.Text):

So müsste das klappen.

Vorausgesetzt es gibt einen Datensatz der dem parameter entspricht.
 
Zuletzt bearbeitet:
J4CK50N schrieb:
txbBSuchen.Text natürlich sonst nimmt wird das Objekt genommen und nicht der Inhalt.

Ausserdem soltest du mit Parametern arbeiten und nicht den Command nändisch zusammenkleben.
Code:
var strSQL = "Select KdNr, Firma, Plz, Ort from stammdaten where kdnr =  @query";
adapter.SelectCommand.Parameters.AddWithValues("@query", txbBSuchen.Text):

So müsste das klappen.

Vorausgesetzt es gibt einen Datensatz der dem parameter entspricht.


ich bin noch Laie auf dem Gebiet C#

wo muss ich den die beiden Zeilen von dir einfügen?
 
Code:
    private void grbSuchenW_Click(object sender, EventArgs e)
    {
    if (cmbSuchen.SelectedItem.ToString() == "Kundennummer")
    {
    con.Open();
    var strSQL = "Select KdNr, Firma, Plz, Ort from stammdaten where kdnr =  @query";
    adapter.SelectCommand.Parameters.AddWithValues("@query", txbBSuchen.Text):
    DataSet ds = new DataSet();
    SqlDataAdapter adapter = new SqlDataAdapter();
    adapter.SelectCommand = new SqlCommand(strSQL, con);
    adapter.Fill(ds, "Stammdaten");
     
    txtName.Text = ds.Tables[0].Rows[0]["firma"].ToString();
    txtKdnr.Text = ds.Tables[0].Rows[0]["kdnr"].ToString();
    txtOrt.Text = ds.Tables[0].Rows[0]["ort"].ToString();
    txtPlz.Text = ds.Tables[0].Rows[0]["plz"].ToString();
    //txtPlz.Text = ds.Tables[0].Rows[0]["kd-seit"].ToString();
    con.Close();
    //txtSeit.Text = (string)rdr["kd-seit"];
     
     
    rdr.Close();
    con.Close();
    btnSuchenGrB.Visible = false;
     
    }
     
    }

und ich sehe grade du machst ein Connection.Close in Zeile 18 und 23.
Das wird krachen. Deshalb, das using aujs dem vorherigen Post von mir verwenden, dann musst du dich um das ganze Closing nicht mehr kümmmern.
 
Zuletzt bearbeitet:
Ich habe folgende Daten in der Tabelle "Stammdaten" :

Datenbank.jpg

Und mit dem Parameter @query den du angegeben hast, weiß ich nicht einzuordnen!
 
Das ist ein Platzhalter.
Mit dieser Zeile wird der Platzhalter ersetzt
Code:
adapter.SelectCommand.Parameters.AddWithValues("@query", txbBSuchen.Text):
Mit dem text, der in deiner TextBox steht.
 
J4CK50N schrieb:
Das ist ein Platzhalter.
Mit dieser Zeile wird der Platzhalter ersetzt
Code:
adapter.SelectCommand.Parameters.AddWithValues("@query", txbBSuchen.Text):
Mit dem text, der in deiner TextBox steht.

Wenn ich per Einzelschritt auf dieser Zeile treffe, bekomme ich eine Fehlermeldung an gezeigt:

{"Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt."}
 
Zeile 7 unter Zeile 10
 
J4CK50N schrieb:
Zeile 7 unter Zeile 10

@JACKSON

Habe ich so gemacht wie beschrieben, trotzdem eine neue Fehlermeldung:

{"Es ist keine Zuordnung zwischen dem Objekttyp System.Windows.Forms.TextBox und einem bekannten verwalteten systemeigenen Providertyp vorhanden."}
 
benutzt du txbBSuchen oder txbBSuchen.Text?
.Text ist gabz wichtig.
 
J4CK50N schrieb:
benutzt du txbBSuchen oder txbBSuchen.Text?
.Text ist gabz wichtig.

Vor lauter Fehlermeldungen sehe ich meine Fehler nicht mehr.
Ich hatte txbBSuchen verwand und nicht txtBSuchen.Text. Jetzt haben txtBSuchen.Text geschrieben und siehe da es hat geklappt!!!

Besten dank @J4chson

Horst
 
Was lange währt, wird endlich gut! ;)
 
So bis klappt es mit der Suchroutine!

Jetzt möchte ich noch zusätzlich noch unter Firma suchen! Aber kann ich genauso vorgehen und den Parameter einsetzen?

Horst
Ergänzung ()

Ich habe es einmal so probiert:

Code:
}else if (cmbSuchen.SelectedItem.ToString() == "Firma")
            {
                con.Open();
                var strSQL = "Select kdnr, firma, plz, ort, extra from stammdaten where firma = LIKE '%' + @SEARCH + '%'" ;
                DataSet ds = new DataSet();
                SqlDataAdapter adapter = new SqlDataAdapter();
                adapter.SelectCommand = new SqlCommand(strSQL, con);
                adapter.SelectCommand.Parameters.AddWithValue("@SEARCH", "%"  + txtBSuchen.Text + "%");
                adapter.Fill(ds, "Stammdaten");

                txtName.Text = ds.Tables[0].Rows[0]["firma"].ToString();
                txtKdnr.Text = ds.Tables[0].Rows[0]["kdnr"].ToString();
                txtOrt.Text = ds.Tables[0].Rows[0]["ort"].ToString();
                txtPlz.Text = ds.Tables[0].Rows[0]["plz"].ToString();

                    //SelectCommand.Parameters.AddWithValue("@query", txtBSuchen.Text);
                //adapter2.Fill(ds1, "Stammdaten");
                con.Close();
                grbSuchen.Visible = false;
                grbStamm.Visible = true;
            }

aber ich bekomme die Fehlermeldung:

Code:
{"Falsche Syntax in der Nähe des LIKE-Schlüsselworts."}
 
Lass dir den query ausgeben, dann wirst du feststellen, dass da zu viele ' drin sind. Außerdem darfst du die % nicht im Parameterstring übergeben. Dieser hat schließlich die Aufgabe, solche SQL-Befehle zu maskieren.
 
Das ist total falsch :D. ( nicht böse gemeint)
Du musst dir die addwithvalue-Syntax auf jeden Fall noch einmal anschauen.
@search wird ersetzt mit dem Parameter.
Und niemals "Firma = like". Entweder "like" oder =. Niemals beides.

Code:
}else if (cmbSuchen.SelectedItem.ToString() == "Firma")
            {
                con.Open();
                var strSQL = "Select kdnr, firma, plz, ort, extra from stammdaten where firma LIKE @SEARCH";
                DataSet ds = new DataSet();
                SqlDataAdapter adapter = new SqlDataAdapter();
                adapter.SelectCommand = new SqlCommand(strSQL, con);
                adapter.SelectCommand.Parameters.AddWithValue("@SEARCH", "%"  + txtBSuchen.Text + "%");
                adapter.Fill(ds, "Stammdaten");
 
                txtName.Text = ds.Tables[0].Rows[0]["firma"].ToString();
                txtKdnr.Text = ds.Tables[0].Rows[0]["kdnr"].ToString();
                txtOrt.Text = ds.Tables[0].Rows[0]["ort"].ToString();
                txtPlz.Text = ds.Tables[0].Rows[0]["plz"].ToString();

                    //SelectCommand.Parameters.AddWithValue("@query", txtBSuchen.Text);
                //adapter2.Fill(ds1, "Stammdaten");
                con.Close();
                grbSuchen.Visible = false;
                grbStamm.Visible = true;
            }
 
Zuletzt bearbeitet:
J4CK50N schrieb:
Das ist total falsch :D. ( nicht böse gemeint)
Du musst dir die addwithvalue-Syntax auf jeden Fall noch einmal anschauen.
@search wird ersetzt mit dem Parameter.
Und niemals "Firma = like". Entweder "like" oder =. Niemals beides.

Code:
}else if (cmbSuchen.SelectedItem.ToString() == "Firma")
            {
                con.Open();
                var strSQL = "Select kdnr, firma, plz, ort, extra from stammdaten where firma LIKE @SEARCH";
                DataSet ds = new DataSet();
                SqlDataAdapter adapter = new SqlDataAdapter();
                adapter.SelectCommand = new SqlCommand(strSQL, con);
                adapter.SelectCommand.Parameters.AddWithValue("@SEARCH", "%"  + txtBSuchen.Text + "%");
                adapter.Fill(ds, "Stammdaten");
 
                txtName.Text = ds.Tables[0].Rows[0]["firma"].ToString();

So es hat geklappt, dank deiner Hilfe!

Vor 10 Jahren hatte ich diese Faktura Programm mit Visual Basic 6 geschrieben, aber unter VB 2013 Express Prof sieht die ganze Sache anders aus.

Wie kann ich das bewerkstelligen, wenn zwei oder sogar mehrere Datensätze unter "Gla" oder "Glase" auftauchen. Normal würde ich diese 2 oder mehr Datensätze im DATAGRIDVIEW packen und da den entsprechenden zur weiteren Bearbeitung auswählen.
Ergänzung ()

Das Problem mit Anzahl der Datensätze habe ich gelöst:

Code:
int counter = 0; 
counter = ds.Tables[0].Rows.Count;
 
Zuletzt bearbeitet:
Zurück
Oben