Entwickler-Ecke

Datenbanken (inkl. ADO.NET) - Datareader gibt nix aus


Deutron - Do 21.04.11 10:14
Titel: Datareader gibt nix aus
Hi komme nicht weiter :(
Ziel ist es 2 Tabellen in einer XML auszugeben, das Problem liegt im DataReader habe jetz extra eine Textbox statt Variable in ihn gelegt um zu sehen ob überhaupt was kommt.
Da die Tb leer bleibt bin ich aber ein wenig überfordert.






C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
private void button6_Click(object sender, RoutedEventArgs e)
        {
        

            OleDbConnection con = new OleDbConnection();

            con.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;data source=C:\\....accdb";

            string sql = ("SELECT * FROM tblinvoiceheader where fldid = '" + tbdelete.Text + "'");

            OleDbCommand cmd = new OleDbCommand(sql, con);

            con.Open();


            OleDbDataReader reader = cmd.ExecuteReader();

            while (reader.Read())
            {
                textBox1.Text = "" + (reader.GetString(0)) + "";
            }
            reader.Close();
            con.Close();


            OleDbDataAdapter da = new OleDbDataAdapter("Select * from tblinvoiceheader WHERE fldid = '" + tbdeladdress.Text + "'", con);
            OleDbDataAdapter da1 = new OleDbDataAdapter("Select * from tbladdress WHERE fldid = '" + textBox1.Text + "'", con);
            DataSet dsrechnung = new DataSet();
            da.Fill(dsrechnung, "Rechnungskopf");
            da1.Fill(dsrechnung, "Adressen");

            dsrechnung.WriteXml("C:\\...");
                
           
        }


Moderiert von user profile iconKha: C#-Tags hinzugefügt


qwertzio - Do 21.04.11 10:24

hoi,
hier mal meine lösung aber für alle 3 tabellen:

man gibt die "Rechnungs-ID" an nach welcher gefiltert werden soll also aus tblinvoiceheader.
dann werden die werte in den Dataset geschrieben.
danach wird über die rechnungsID noch die masterid der tblinvoicedetails ermittelt um auch´diese in den dataset zu bringen und danach wird die addressid aus der tblinvoiceheader mit einem datareader ermittel um dann die fldid aus der tbl address zu bekommen:



C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
                OleDbConnection con = new OleDbConnection(
           @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\svn\Azubi\Völk Dennis Lukas\Datenbank\prakdb.accdb");

                int eingabe = Convert.ToInt16(textBoxEingabe.Text);
                string addressid = "";
                string dateiname = textBoxDateiname.Text;

                OleDbDataAdapter oledbAdapter;
                DataSet ds = new DataSet();



                string strInvoiceheader = "SELECT * FROM tblinvoiceheader WHERE fldid='" + eingabe + "'";
                string strInvoicedetails = "SELECT * FROM tblinvoicedetails WHERE fldmasterid = '" + eingabe + "'";


                con.Open();

                oledbAdapter = new OleDbDataAdapter(strInvoiceheader, con);

                oledbAdapter.Fill(ds, "tblinvoiceheader");

                oledbAdapter.SelectCommand.CommandText = strInvoicedetails;
                oledbAdapter.Fill(ds, "tblinvoicedetails");


                //Reader für Invoiceheader tabelle
                OleDbCommand invoiceheader = new OleDbCommand(strInvoiceheader, con);
                OleDbDataReader dr_invoiceheader = invoiceheader.ExecuteReader();

                // addressid aus der Db in einer variable speicher um sie später einzufügen
                while (dr_invoiceheader.Read())
                {
                    addressid += dr_invoiceheader[2].ToString();

                }


                // SQL befehle für die address tabelle
                string strAddress = "SELECT * FROM tbladdress WHERE fldid='" + addressid + "'";

                oledbAdapter.SelectCommand.CommandText = strAddress;
                oledbAdapter.Fill(ds, "tbladdress");



                oledbAdapter.Dispose();


                con.Close();



                StreamWriter myStreamWriter = new StreamWriter(@"C:\\svn\\Azubi\\Völk Dennis Lukas\\XML-Dateien\\" + dateiname + ".xml");

                ds.WriteXml(myStreamWriter);
                myStreamWriter.Close();

                MessageBox.Show("XML-Datei wurde erstellt");



lg

Moderiert von user profile iconKha: C#-Tags hinzugefügt


Deutron - Do 21.04.11 11:01

bei deinem Lösungsvorschlag gibt er mir nach wie vor nicht die Adresstabelle mit aus


Trashkid2000 - Do 21.04.11 18:38

Hallo,

erstmal: könntet Ihr beide mal bitte Code in <span class="inlineSyntax"></span>-Tags packen?
So kann man ihn kaum lesen. Gerade in Sachen Hochkommas.
Oh, gerade gesehen, dass das user profile iconKha für Euch erledigt hat.

Also, ich denke, das Problem ist folgendes:

C#-Quelltext
1:
string sql = "SELECT * FROM tblinvoiceheader where fldid = '" + tbdelete.Text + "'";                    
Denn fldid ist doch bestimmt eine Zahl und keine Zeichenkette, oder? Sollte zumindest so sein, wenn es schon id heißt.
Wenn es also ein int-Wert in der Datenbank ist, so wird mit dem Vergleich natürlich nichts gefunden. Also hat der Reader auch nichts zum lesen, bzw. es wird auch nichts in die Table im DataSet gefüllt. Und eine leere Tabelle erscheint auch nicht in der XML.
Also änder das Select (und das andere dann auch) so um:

C#-Quelltext
1:
string sql = "SELECT * FROM tblinvoiceheader where fldid = " + tbdelete.Text + ";";                    
Oder lieber gleich mit Parametern, wie es sich auch gehört:

C#-Quelltext
1:
2:
3:
4:
string sql = "SELECT * FROM tblinvoiceheader where fldid = @value";
OleDbDataAdapter ad = new OleDbDataAdapter(sql, con);
ad.SelectCommand.Parameters.AddWithValue("@value", value);
...
LG