Laden...

Forenbeiträge von ChrisHa Ingesamt 12 Beiträge

21.10.2015 - 14:50 Uhr

Passt soweit. Es geht doch so wie ich es gemacht habe und du es vorher erklärt hast. Danke dir.
Hatte nur einen kleinen Dreher beim Tippen noch.

Hier meine Endlösung:

string sCommandString = "SELECT Vorname,Name FROM [Tabelle1$] WHERE Geburtstage=@MyDateParameter";

            OleDbConnection conn = new OleDbConnection();
            conn.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=xxx" + @";Extended Properties=""Excel 8.0;HDR=YES;IMEX=1;ImportMixedTypes=Text;TypeGuessRows=0""";
            
            try
            {
                OleDbCommand command = new OleDbCommand(sCommandString, conn);
                command.Parameters.AddWithValue("@MyDateParameter", DateTime.Now.Day + "." + DateTime.Now.Month);

                DataSet dsGeburtstage = new DataSet();
                OleDbDataAdapter adapter = new OleDbDataAdapter(command);

                adapter.Fill(dsGeburtstage);
                dataGridView_Geburtstage_Heute.DataSource = dsGeburtstage.Tables[0];
            }
            catch (Exception exp)
            {
                MessageBox.Show(exp.Message);
                throw;
            }

21.10.2015 - 14:34 Uhr

Danke Bart.
Leider hilft das auch nichts. Da der Tag "heute" in meinem Fall falsch wäre. Ich benötige nur den Monat und den Tag, da es eine Art: Wer hat heute Geburtstag werden soll.

Trotzdem danke an alle die bis jetzt geantwortet haben.
Für weitere Tipps bin ich gerne offen.

Habe es jetzt so versucht:

string sCommandString = "SELECT Vorname,Name FROM [Tabelle1$] WHERE Geburtstage=@MyDateParameter";
            
            try
            {
                OleDbCommand command = new OleDbCommand(sCommandString, conn);
                command.Parameters.AddWithValue("@MyDateParameter", DateTime.Now.Day + "-" + DateTime.Now.Month);
21.10.2015 - 14:27 Uhr

Werden einstellige Ints nicht zu einstellige Strings? z.B. 1 = "1" != "01" etc.

Das kann durch aus sein, aber:
Wir haben den Monat Oktober und auch wenn ich:

string sCommandString = "SELECT Vorname,Name FROM [Tabelle1$] WHERE (Geburtstage)=21-10";

dann geht es leider auch nicht.

21.10.2015 - 13:52 Uhr

Versuch: Formatier mal das Datum im Excel genau so wie du es abfragst "year-month-day" und dann als string. Eine Zeile reicht ja.

Versucht und gibt mir zumindest keinen Fehler mehr aus.

Versuch 2: Übergib mal das DateTime-Objekt statt es auseinanderzunehmen. Und lass die Formatierung als Date im Excel.

Auch versucht, aber das löst mein Problem nicht. Ich habe meinen Code nun etwas angepasst:

string sConnectionString = "SELECT Vorname,Name FROM [Tabelle1$] WHERE (Geburtstage)=" + DateTime.Now.Day + "-" + DateTime.Now.Month;

            OleDbConnection conn = new OleDbConnection();
            conn.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=xxx.xlsx" + @";Extended Properties=""Excel 8.0;HDR=YES;IMEX=1;ImportMixedTypes=Text;TypeGuessRows=0""";
            
            try
            {
                OleDbCommand command = new OleDbCommand(sConnectionString, conn);

                DataSet dsGeburtstage = new DataSet();
                OleDbDataAdapter adapter = new OleDbDataAdapter(command);

                adapter.Fill(dsGeburtstage);
                dataGridView_Geburtstage_Heute.DataSource = dsGeburtstage.Tables[0];
            }
            catch (Exception exp)
            {
                MessageBox.Show(exp.Message);
                throw;
            }

In meiner Excel Tabelle habe ich sieht es wie folgt aus:
Name, Vorname jeweils Spalte
und die Geburtstage sind wie folgt formatiert: TT-MM

Geburtstage
15-04
30-09
07-12
21-10

Ich erhalte wie gesagt KEINE Fehlermeldung mehr, aber ich erhalte auch KEIN Ergebnis in meiner DataGridView

21.10.2015 - 11:14 Uhr

Danke für deinen Beitrag.

Habe in Excel alles nun auf Text gestellt bis auf das Datum natürlich.


string sConnectionString = "SELECT Id,Vorname,Name FROM [Tabelle1$] WHERE Datum='" + DateTime.Now.Year + "-" + DateTime.Now.Month + "-" + DateTime.Now.Day  + "';";

            OleDbConnection conn = new OleDbConnection();
            conn.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=xxx.xlsx" + @";Extended Properties=""Excel 8.0;HDR=YES;IMEX=1;ImportMixedTypes=Text;TypeGuessRows=0""";

            OleDbCommand command = new OleDbCommand(sConnectionString, conn);

            DataSet dsGeburtstage = new DataSet();
            OleDbDataAdapter adapter = new OleDbDataAdapter(command);

            adapter.Fill(dsGeburtstage);

            dataGridView_Geburtstage_Heute.DataSource = dsGeburtstage.Tables[0];

**Fehlermeldung erhalten ich trotzdem weiterhin. **
Noch irgendeinen Tipp?

21.10.2015 - 10:56 Uhr

Das was Du als ConnectionString bezeichnest ist kein ConnectionString sondern dein CommandString.

vielen dank dafür! Das ist schon mal richtig und klingt auch sehr logisch.

Deine Fehlermeldung bedeutet hier, daß ein Feld, das Du in dieser Select-Anweisung benutzt (hier Vorname, Nachname, Id) nicht in der Datenbank vorkommt.

Problem wurde dadurch beseitigt.

Erhalte nun eine neue Meldung:> Fehlermeldung:

Datentypenkonflikt in Kriterienausdruck.

Der Fehler erscheint wieder beim füllen des Akapters.

21.10.2015 - 10:36 Uhr

Hallo Gemeinde,

ich möchte gerne Werte aus einer Excel Datei auslesen und in ein DataGridView schreiben. Es sollen aber nur Werte genommen werden, die eine bestimmte Id besitzen.

Fehlermeldung:> Fehlermeldung:

Für mindestens einen erforderlichen Parameter wurde kein Wert angegeben.

Meine Vermutung es liegt am Connection String:

string sConnectionString = "SELECT Vorname, Nachname FROM [Tabelle1$] WHERE Id='" + iIndex + "';";

Die Spalten _Vorname _und _Nachname _sind in der Excel Tabelle als Überschriften vorhanden. _Tabelle1 _ist meine einzige Tabelle in der Excel Datei.
_iIndex _wird vorher übergeben. iIndex ist als Bsp. der Wert 30.

Das Programm läuft mit Haltepunkt bis zum füllen des OleDB Adapters:

           
DataSet dsGeburtstage = new DataSet();
OleDbDataAdapter adapter = new OleDbDataAdapter(command);

adapter.Fill(dsGeburtstage); //Hier entsteht der Fehler

Meine Frage:
Was habe ich falsch gemacht bzw. einen Tipp wo mein Fehler liegen könnte. In einer bekannten Suchmaschine namens google habe ich nur gelesen, dass mein Connection String falsch sein könnte bzw. mir ein Verweis fehlt. Ich wüsste aber nicht, was falsch ist bzw. welchen Verweis ich denn für eine OleDB Verbindung brauche.

Vielen Dank für eure Hilfe und noch einen schönen Tag.

Lg

ChrisHa

27.11.2013 - 11:39 Uhr

Zunächst mal Danke für eure beider Antworten. Ich habe auch beide wie folgt genutzt:


//Rechnen mit SQL
MySqlDataAdapter daTest = new MySqlDataAdapter("SELECT Einkauf,Verkauf,(Einkauf-Verkauf) AS Gesamt FROM datenbank.tester", connection);

                DataSet dsSet = new DataSet("test");
                daTest.FillSchema(dsSet, SchemaType.Source, "datenbank.tester");
                daTest.Fill(dsSet, "datenbank.tester");

                DataTable tblTest = dsSet.Tables["datenbank.tester"];

                //Für die zweite Spalte wird ein DataRow benötigt
                DataRow tdrTest = tblTest.NewRow();

                foreach (DataRow drCurrent in tblTest.Rows)
                {

                    //Nimmt alle Daten auf einmal und schreibt sie von selbst in die GridView
                    dataGridView1.DataSource = tblTest;

                }

Das einzige Probleme bei der Lösung von Th69: Ab der zweiten Zeile ist die Berechnung nicht mehr Einkauf - Verkauf, sondern GesamtNeu = GesamtAlt + (Einkauf-Verkauf).

Lösungsansatz:
Ich könnte doch theoretisch auch von meiner MySQL Datenbank, die über xampp läuft, diesen Wert berechnen und schreiben lassen oder? Ich versuche das mal.

27.11.2013 - 10:11 Uhr

Hallo herbivore,

zunächst mal danke für deine schnelle Antwort.

Der Code ist für die erste ListView (die linke) gedacht.
Ich frage mich wie ich das Einlesen, da ich zwei Updates strings benötige, machen soll? Oder ist mein anderer String richtig, um die Daten auszulesen? Wenn ja wie fühle ich die ListView dann (meine Variante dürfte dann wohl eher nicht funktionieren).

Gibt es noch eine andere BESSERE Möglichkeit als die Add-Schleife?

Zum Thema DataBinding werde ich mich mal schlau machen.

ChrisHa

27.11.2013 - 10:00 Uhr

Hallo liebe Gemeinde,

ich glaube ich stehe gerade nur etwas auf dem Schlau und komme nicht weiter...

Hier mein kleines Problem (siehe Anhang):
Ich habe zwei ListViews die aus einer Datenbank (MySql - nicht lokal), Daten einlesen.
Die linke der zwei Listviews besitzt zwei Spalten. Gefüllt hab ich diese wie folgt:

//Jede einzelne Reihe des Datensatzes auslesen
                        string row = "";
                        for (int i = 0; i < Reader.FieldCount; i++)
                            row += Reader.GetValue(i).ToString();

                            ListViewItem lvi = new ListViewItem();
                            lvi.Text = iCounter.ToString();
                            lvi.SubItems.Add(row);
                            list_WerteWoche.Items.Add(lvi);
                            iCounter++;        

Funktioniert einwandfrei. Die "Wochen" sind hierbei Werte die nach oben gezählt werden und die zweite Spalte liest aus einer Datenbank den aktuellen Preis heraus.
(Falls es hier schon eine bessere Lösung gibt bin ich gerne offen für Kritik 😁 )

Nun kommen wir zu meiner zweiten ListView:
Hierbei sollen die ersten ZWEI Spalten aus meiner Datenbank ausgelesen werden und die Dritte soll sich dann durch Berechnung aus der ersten und zweiten ergeben.
Heißt: Gesamt = Einkauf - Verkauf (in der ersten Zeile) und GesamtNeu = Einkauf - Verkauf + GesamtAlt.

Nun bekomme ich die Werte erst gar nicht in meine ListView rein und kann auch keine Berechnung durchführen. Stehe wohl etwas auf dem Schlau, da es bei der ersten ListView auch super geklappt hat.

Was vielleicht noch relevant ist:
Die beiden Daten liegen beide (Einkauf und Verkauf) in einer gemeinsamen Tabelle

Müsste mein Einlese - String also glaube ich wie folgt aussehen:

string Update = "SELECT Einkauf,Verkauf FROM datenbank.tabelle;";

Meine Lösungsidee:

  • Erst die erste Spalte zu füllen (row --> basierend auf dem oberen Quelltext) und dann die nächste, was aber glaube nicht möglich ist da er Zeilenweise die ListView füllt

Bitte um Lösungstipps oder einfach jemandem der mich von dem Schlau runterhebt, damit ich meine Lösung finde 😁 🙂

Habt noch einen schönen Tag 🙂

21.11.2013 - 17:24 Uhr

Hallo gfoidl,

ich werde mich morgen mal einlesen und bedanke mich im Voraus für deine schnelle Hilfe.

Grüße

ChrisHa

21.11.2013 - 17:04 Uhr

Hallo liebe Gemeinde,

ich bin gerade dabei einen Netzwerkchat zu schreiben. Dies passiert auf der Basis von StreamReader und Writer. Später soll das ganze mit einer Datenbank realisiert werden.

Wie es für einen Netzwerkchat üblich ist, soll der User2 am anderen Ende die Nachricht vom User1 so schnell wie möglich erhalten und nicht erst sobald dieser wieder eine Nachricht getippt hat.

Dafür hatte ich zwei Gedanken:

  1. Ein Timer der unabhängig von dem was der User gerade macht (tippt oder liest), runterzählt und dann meine Konsolenanwendung leert (Console.Clear()) und den Stream neu (sprich den Reader() wieder aufruft) einliest?
    Das es die Funktion Timer an sich gibt weiß ich, aber diese zählt meines Erachtens nicht dauerhaft sondern eben nur, wenn man in der entsprechenden Schleife ist.

Immer dann zu aktualisieren, wenn sich die Datei verändert hat. Sprich eine dauerhaftes Reading (was aber glaube ich die schlechtere Variante ist, da der gegenüber dann soweit ich weiß nicht auf die Datei zugreifen kann)

Um euch das ganze etwas genauer zu zeigen hier ein Code Ausschnitt:


string sName = "";
            //Namensvergabe
            Console.WriteLine("Netzwerkchat");
            sName = Namensvergabe();

            do
            {
                //File erstellen, wenn nicht vorhadnen
                FileCreater();

                //Lesen der Datei
                Reader();

//Eintippen der Nachricht
                Eintippen(sName);


            } while (true);
        }




        static void Reader()
        {
                        Console.Clear();
            // dieser Code wird ausgeführt, wenn der Timer abgelaufen ist
            try
            {
//**** ist der RICHTIGE Pfad
                StreamReader reader = new StreamReader(@"****\Netzwerkchat\test.txt");
                Console.WriteLine(reader.ReadToEnd());
                reader.Close();
            }
            catch (Exception a)
            {
                Console.WriteLine(a.Message);
                throw;
            }
        }


Es handelt sich hierbei um eine KONSOLENANWENDUNG!

Vielen Dank für Eure Hilfe.