Autor Beitrag
burns1111
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Di 14.03.17 23:23 
Hallo,

ich versuche mich an meinem ersten C# Programm und einem Access Datenbankzugriff. Leider kommt nicht das in der Datenbank an was ich erwarte.
Vielleicht kann sich jeman mal den Code anschauen und mir einen Tipp geben.
Vielen Dank schon mal.

Hier mein Code:
ausblenden 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:
while (Tage <= ts.Days)
{
    DateTime Urlaubstag = DateTime.Now;
    Urlaubstag = Urlaubstag.AddDays(Tage);
                            

    if (cbVertreter.Visible == false)
        cmd.CommandText = "Insert into Anwesenheit (Mitarbeiter, Beginn, Grund) values ( ?, ?, ?)";    
    else
        cmd.CommandText = "Insert into Anwesenheit (Mitarbeiter, Beginn, Grund, Urlaubsvertreter) values ( ?, ?, ?, ?)";    
                            
    cmd.Parameters.Add(new OleDbParameter("", ID_NR));

    //#############################   Falscher eintrag ###########################
    cmd.Parameters.Add(new OleDbParameter("", Urlaubstag.ToString()));
    //#############################   Falscher eintrag ########################### 
 
    cmd.Parameters.Add(new OleDbParameter("", cbGrund.SelectedItem.ToString()));
    if (cbVertreter.Visible == true)
    {
        cmd.Parameters.Add(new OleDbParameter("", cbVertreter.SelectedItem.ToString()));
    }

    cmd.ExecuteNonQuery();
    Tage++;                           
}

Was möchte ich machen. Ich will eine Schleife laufen lassen die mir Urlaubstage in eine Datenbank einträgt. Zum Test habe ich mir die Variable "DateTime Urlaubstag" angelegt mit aktuellem Datum. Die Variable Tage wird in jedem Schleifendurchlauf inkrementiert. Das scheint soweit zu passen, weil wenn ich diese in ein label lege wird es richtig angezeigt. Leider ist in der Datenbank immer das gleiche datum eingetragen und nicht das fortlaufende.

Woran kann das liegen?

Moderiert von user profile iconNarses: C#-Tags hinzugefügt
Moderiert von user profile iconTh69: Beitragsformatierung überarbeitet.
Moderiert von user profile iconTh69: Titel (leicht) geändert.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mi 15.03.17 00:00 
Für mich sieht es gerade so auch als würdest du immer weiter Parameter hinzufügen ohne die alten zu entfernen damit bleiben die ersten Parameter die du tatsächlich benutzt gleich egal wieviele du noch zusätzlich anhängst.

Entweder die Parameter Collection zwischendurch clearen, die 4 Parameter wiederverwenden und den Wert der Parameter ändern und nicht neue anhängen oder aber was ich persönlich machen würde erst gar nicht soweit kommen lassen und einfach immer ein neues DBCommand Object verwenden. Da hängen keine großen Kosten dran.
burns1111 Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Mi 15.03.17 20:36 
Hallo,

schon mal Danke für die Antwort und hier noch ein paar Informationen zu meinem Plan wie das Programm funktionieren soll.
Der Parameter für Mitarbeiter und Grund bleibt immer gleich, es soll in der Datenbank sich nur das Datum ändern.Ich brauche in der Datenbank Fur jeden Tag einen Eintrag welcher Mitarbeiter und aus welchem Grund er nicht da ist.

Wäre es möglich mir ein ansatz vom Programmcode zukommen zu lassen, weil ich es so nicht verstehe.
Ich wiederhole doch die Schleife je nach Anzahl der Tage. Das Datum wird meines erachtens auch in der Variable "Urlaubstag" bei jedem Schleifendurchlauf verändert und über den Befehl "cmd.Parameters.Add(new OleDbParameter("", Urlaubstag.ToString()));" mit wechselnden Wert dann Eingetragen.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mi 15.03.17 20:54 
Zitat:
Wäre es möglich mir ein ansatz vom Programmcode zukommen zu lassen, weil ich es so nicht verstehe.

Ich versuche es besser zu erklären. Dann bist du an der Reihe. Nur selbst machen macht schlau ;)

ausblenden C#-Quelltext
1:
cmd.Parameters.Add(new OleDbParameter("", Urlaubstag.ToString()));					

Dieser Befehl erzeugt einen neuen Parameter in der cmd.Parameters Collection. In deinem Code legst du pro Schleifendurchlauf also 3(4) Parameter an und im nächsten Schleifendurchlauf hängst du dann wieder neue Parameter an. Gehen wir mal von dem Fall aus das du Urlaubsvertreter nicht eintragen willst also 3 Parameter benutzt. Dann legst du im ersten Schleifendurchlauf 3 Parameter an die auch im Sql benutz werden. Im nächsten Schleifendurchlauf legst du dann 3 weitere Parameter an ohne die vorherigen 3 zu entfernen du hast dann zusammen 6 Parameter. Im SQL benutzt du weiterhin 3 Parameter und zwar die ersten 3. Die hast du nicht verändert und die 3 dahinter mit den neuen Daten werden ignoriert da sie im SQL nicht angesprochen werden. Du bekommst also immer die gleichen Daten da immer die gleichen Parameter verwendet werden.

Bonushinweise zu den 3 angeboten Lösungsmöglichkeiten.
  • Die Parameter in der Parameters Collection kann man löschen die hat eine Clear() Methode.
  • Man kann auch den Wert im Parameter ändern. Man muss keinen neuen Parameter anlegen. Du könntest also die 4 Parameter vor definieren und in der Schleife einfach den aktuellen Wert im Parameter ändern. Also einfach denn Parameter den du jetzt schon mit new erzeugst in einer Variablen merken und diesem Parameter immer den passen Wert zuweisen. Ein Parameter hat eine Value Property.
  • Und die dritte Lösung einfach immer ein neues Command Object erzeugen. Irgendwo erzeugst du ja schon das Command Object an der cmd Variablen. Erzeuge die einfach innerhalb deiner Schleife anstatt davor.
burns1111 Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Fr 17.03.17 20:34 
Vielen Dank für die zusätzliche Info ich werde es probieren.