Autor Beitrag
Serena
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Mi 23.01.08 12:35 
Hallo hoffe mir kann wer helfen,

ich habe eine Acces Datenbank in der es eine Tabelle DVD gibt und die DVD hat folgende Eigenschaften in der Datenbank:

Kunde:
gesperrt/aktiv ja/nein (bool)
nachname (string)
vorname (string)
etc.

Eine Kunde soll sowohl neu angelegt werden, als auch ihre Daten bearbeitet werden können. Der Status gesperrt/aktiv ist in einer Drop Down Box eingebunden.

So und nun zum Problem, wenn ich den Kunden neu anlege klappt alles, er übernimmt alle Daten. Wenn ich die Daten aber bearbeite schreibt er den Status aktiv/gesperrt (bool) schreibt nicht geändert in die Datenbank. Habe schon Stunden gesucht aber ich finde den Fehler nicht, hoffe mir kann wer helfen.

Dasselbe Problem habe ich bei der DVD nur, dass es sich da nicht um einen Status, sondern um einen Preis (decimal) handelt. Irgendwie updatet er mir nur strings.

Ich hoffe so mir kann wer helfen :)

Und nun der Code:
ausblenden volle Höhe 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:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
250:
251:
252:
253:
254:
255:
256:
257:
258:
259:
260:
261:
262:
263:
264:
265:
266:
267:
268:
269:
270:
271:
272:
273:
274:
275:
276:
277:
278:
279:
280:
281:
282:
283:
284:
 public Anwendung.Kunde SetKunde(Anwendung.Kunde objKunde)

        {

            // Variablen

            string sql = '';

            OleDbCommand cmd = new OleDbCommand();

            OleDbDataReader dr;

            OleDbConnection conn = new OleDbConnection();

 

            try

            {

                conn.ConnectionString = Einstellung.Einstellung.ConnectionString;

                conn.Open();

 

                if (objKunde.KundeId == 0)

                {

 

                    // Prüfen, ob der Benutzername schon vorhanden ist

 

                    sql = 'SELECT KundeId FROM Kunde WHERE ' +

                        'Benutzername = @Benutzername';

 

                    // Daten übergeben

                    cmd.CommandText = sql;

                    cmd.Connection = conn;

 

                    // Parameter

                    cmd.Parameters.AddWithValue('@Benutzername', objKunde.BenuterName);

 

                    // Abfrage

                    dr = cmd.ExecuteReader();

 

                    if (dr.Read())

                    {

                        objKunde.FehlerMeldung = 'Der Benutzername ist schon vergeben.';

                        dr.Close();

 

                        return objKunde;

                    }

 

                    // Reader schliessen

                    dr.Close();

                    cmd.Parameters.Clear();

 

 

                    // SQL 

                    sql = 'INSERT INTO Kunde ( ' +

                        'Nachname, Vorname, Strasse, Hausnummer, Postleitzahl, Ort, Benutzername, Passwort,    Vorwahl, Rufnummer, Gesperrt) VALUES ( ' +

                        '@Nachname, @Vorname, @Strasse, @Hausnummer, @Postleitzahl, @Ort, @Benutzername, @Passwort, @Vorwahl, @Rufnummer, @Gesperrt );';

 

                    // Daten übergeben

                    cmd.CommandText = sql;

                    cmd.Connection = conn;

 

                    // Parameter

                    cmd.Parameters.AddWithValue('@Nachname', objKunde.Nachname);

                   

                    //cmd.Parameters.Add('@Nachname', SqlDbType.NVarChar).Value = '%' + objKunde.Nachname + '%';

                    cmd.Parameters.AddWithValue('@Vorname', objKunde.Vorname);

                    cmd.Parameters.AddWithValue('@Strasse', objKunde.Strasse);

                    cmd.Parameters.AddWithValue('@Hausnummer', objKunde.Hausnummer);

                    cmd.Parameters.AddWithValue('@Postleitzahl', objKunde.Postleitzahl);

                    cmd.Parameters.AddWithValue('@Ort', objKunde.Ort);

                    cmd.Parameters.AddWithValue('@Benutzername', objKunde.BenuterName);

                    cmd.Parameters.AddWithValue('@Passwort', objKunde.Passwort);

                    cmd.Parameters.AddWithValue('@Vorwahl', objKunde.Vorwahl);

                    cmd.Parameters.AddWithValue('@Rufnummer', objKunde.Rufnummer);

                    cmd.Prameters.AddWithValue('@Gesperrt', objKunde.Gesperrt);

                    

                    // Abfrage

                    cmd.ExecuteNonQuery();

                }

                else

                {

                    sql = 'SELECT * FROM Kunde WHERE KundeId = @KundeId';

 

                    cmd.CommandText = sql;

                    cmd.Connection = conn;

 

                    cmd.Parameters.AddWithValue('@KundeId',objKunde.KundeId);

 

                    dr = cmd.ExecuteReader();

 

                    if(dr.Read())

                    {

                        string aa = Convert.ToString(dr['Nachname']);

                    }

 

                    dr.Close();

                    cmd.Parameters.Clear();


 // Hier muss jetzt das Porblem sein!!!!!!!!!!!!!!!!!!

                    sql = 'UPDATE Kunde SET ' +

                      'Vorname = '' + objKunde.Vorname + '', ' +

                      'Nachname = '' + objKunde.Nachname + '', ' +

                      'Hausnummer = '' + objKunde.Hausnummer + '', ' +

                      'Postleitzahl = '' + objKunde.Postleitzahl + '', ' +

                      'Ort = '' + objKunde.Ort + '', ' +

                      'Benutzername = '' + objKunde.BenuterName + '', ' +

                      'Passwort = '' + objKunde.Passwort + '', ' +

                      'Vorwahl = '' + objKunde.Vorwahl + '', ' +

                      'Rufnummer = '' + objKunde.Rufnummer + '', ' +

                      'Gesperrt = '' + objKunde.Gesperrt + '', ' +

                      'Strasse = '' + objKunde.Strasse + '' WHERE ' +

                      'KundeId = ' + objKunde.KundeId + ' ';

 

 

                    // Daten übergeben

                    cmd.CommandText = sql;

                    cmd.Connection = conn;

 

                    // Parameter

                    cmd.Parameters.AddWithValue('@Hausnummer',         objKunde.Hausnummer);

                    cmd.Parameters.AddWithValue('@KundeId',      objKunde.KundeId);

                    cmd.Parameters.AddWithValue('@Nachname',     objKunde.Nachname);

                    cmd.Parameters.AddWithValue('@Vorname',      objKunde.Vorname);

                    cmd.Parameters.AddWithValue('@Strasse',      objKunde.Strasse);

                    cmd.Parameters.AddWithValue('@Postleitzahl',       objKunde.Postleitzahl.ToString());

                    cmd.Parameters.AddWithValue('@Ort',    objKunde.Ort);

                    cmd.Parameters.AddWithValue('@Benutzername', objKunde.BenuterName);

                    cmd.Parameters.AddWithValue('@Passwort', objKunde.Passwort);

                    cmd.Parameters.AddWithValue('@Vorwahl', objKunde.Vorwahl);

                    cmd.Parameters.AddWithValue('@Rufnummer', objKunde.Rufnummer);

                    cmd.Parameters.AddWithValue('@Gesperrt', Convert.ToBoolean(objKunde.Gesperrt));

                    

 

 

 

                    // Abfrage

                    int ff = cmd.ExecuteNonQuery();

                }

            }

            catch (Exception e)

            {

                Alert javascript = new Alert();

                javascript.Show('Es ist ein Fehler auf der Seite aufgetreten.');

            }

            finally

            {

                conn.Close();

            }

 

            return objKunde;

        }
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Mi 23.01.08 15:27 
Hallo,

ich verstehe nicht alles, was Du erreichen und machen willst. Offensichtlich benutzt Du aber bei INSERT ausschließlich Parameter, während Du bei UPDATE Werte im Update-Befehl direkt einträgst (aber alles als Strings!!!) und zusätzlich Parameter zuordnest.

Lösung: Ersetze im Update-Befehl die Werte durch die Parameter, und alles dürfte laufen.

Hinweis 1:
SDK-Doku hat folgendes geschrieben:
Anstelle benannter Parameter verwendet der OLE DB-.NET Framework-Datenanbieter mit einem Fragezeichen (?) markierte Positionsparameter.


Hinweis 2: Die Verwendung der DbParameter ist 1000x besser als die String-Verknüpfung.

Gruß Jürgen


Zuletzt bearbeitet von JüTho am Mi 23.01.08 16:41, insgesamt 1-mal bearbeitet
Serena Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Mi 23.01.08 15:45 
Wenn ich die Werte durch Paramter ersetze bearbeitet er gar nichts mehr, das habe ich schon versucht. So bearbeitet er alles (Namen, Nachnamen) bis auf den Wert gesperrt/aktiv, der ein Bool Wert ist.
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Mi 23.01.08 16:39 
Nanu: Das Thema steht im Bereich "C#" und Du benutzt Strings mit einfachem Hochkomma? Was ist hier los? (Bei meinem folgenden Vorschlag verwende ich C# mit richtigen Anführungszeichen.)

Du musst auf zwei Bedingungen achten: die Parameter mit '?' benutzen und unbedingt die Reihenfolge einhalten. So müsste es gehen:
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:
27:
28:
string sql = "UPDATE Kunde SET " +
    "Vorname = ?, " +
    "Nachname = ?, " +
    "Hausnummer = ?, " +
    "Postleitzahl = ?, "
    "Ort = ?, "
    "Benutzername = ?, "
    "Passwort = ?, "
    "Vorwahl = ?, "
    "Rufnummer = ?, "
    "Gesperrt = ?, "
    "Strasse = ?, "
    "KundeId = ?";
cmd.CommandText = sql;
cmd.Connection = conn;

//  und in derselben Reihenfolge die Parameter zuordnen:
cmd.Parameters.Clear();   //  nur soweit ein "alter" cmd neu benutzt wird
cmd.Parameters.AddWithValue("@Vorname",      objKunde.Vorname);
cmd.Parameters.AddWithValue("@Nachname",     objKunde.Nachname);
//  usw., dabei folgendes beachten:
//  die PLZ muss als String deklariert sein, was wird denn sonst aus "04103"?
cmd.Parameters.AddWithValue("@Postleitzahl", objKunde.Postleitzahl);
//  objKunde.Gesperrt ist doch wohl ein bool-Wert, oder?
cmd.Parameters.AddWithValue("@Gesperrt",     objKunde.Gesperrt);
//  usw. bis
cmd.Parameters.AddWithValue("@Strasse",      objKunde.Strasse);
cmd.Parameters.AddWithValue("@KundeId",      objKunde.KundeId);
Zusatzhinweis: Die Regeln der OOP sagen doch, dass Klassen die Wirklichkeit abbilden sollen. Wenn "Gesperrt" einen bool-Wert darstellen soll, wäre es Quatsch, diese Eigenschaft als irgendetwas anderes zu deklarieren und nur bei Bedarf in bool zu konvertieren.

Gruß Jürgen
Serena Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Do 24.01.08 02:59 
Das mit den Hochkommata ist nicht von mir, dass ist beim einfügen passiert :)...keine Ahnung bei mir sind es Anführungszeichen, wie es sein soll.

Leider ist das nicht die Lösung, er trägt immernoch nichts ein. Auch wenn ich bei den Parametern Convert.toBoolean bei gesperrt mache. Das gesperrt will einfach nicht in die Datenbank. Er liest immer false aus, obwohl er true lesen soll.

Kann es irgendwie daran liegen, dass gesperrt/aktiv in einer Drop Down Box eingbunden ist und ich das beim Anzeigen in string konvertiere, aber sonst zeigt er es nicht an.

Ich versteh das nicht, wenn ich den Kunden neu anlege, geht es soch auch, nur wenn ich ihn update nicht
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Do 24.01.08 08:38 
Hallo Serena,
user profile iconSerena hat folgendes geschrieben:
Leider ist das nicht die Lösung, er trägt immernoch nichts ein. Auch wenn ich bei den Parametern Convert.toBoolean bei gesperrt mache. Das gesperrt will einfach nicht in die Datenbank. Er liest immer false aus, obwohl er true lesen soll.

Kann es irgendwie daran liegen, dass gesperrt/aktiv in einer Drop Down Box eingbunden ist und ich das beim Anzeigen in string konvertiere, aber sonst zeigt er es nicht an.

Damit hängt es ganz offensichtlich zusammen. Du musst also vor allem prüfen, an welcher Stelle eine Änderung sinnvoll oder notwendig ist:

  • Meinst Du mit "Drop Down Box" eine normale ComboBox oder etwas anderes?
  • Enthält sie genau zwei Einträge, die "gesperrt = ja" und "gesperrt = nein" entsprechen, oder gibt es mehr Einträge?
  • Die Anzeige in der ComboBox als String entspricht offensichtlich nicht dem eigentlich gewünschten Wert. Ist es wirklich nur ein bool-Wert, oder gehören noch andere "Nebenbedingungen" dazu?
  • Ist in Deiner Klasse Anwendung.Kunde die Eigenschaft Gesperrt bool oder nicht?

Nach meinem Verständnis müsste (ausgehend von Deinen bisherigen Erläuterungen) eine sinnvolle Lösung etwa so lauten:
  • Entsprechend zu bool-Werten darf die ComboBox nur genau zwei Werte haben.
  • Anwendung.Kunde.Gesperrt muss bool sein. (Damit hat das Problem nichts mehr mit dem Insert-Befehl zu tun, sondern nur noch mit der Anwendungslogik.)
  • Die Auswertung für Anwendung.Kunde.Gesperrt geht etwa so:
    ausblenden C#-Quelltext
    1:
    2:
    3:
    4:
    5:
    6:
    7:
    8:
    public bool Gesperrt {
        get { return gesperrt; }
    }
    public void SetGesperrt(ComboBox box) {
        gesperrt = box.SelectedIndex == 0;   
        //  oder wie auch immer die Einträge zugeordnet werden
        //  Aufruf dieser Methode durch box.SelectedIndexChanged
    }

    Oder auch so:
    ausblenden C#-Quelltext
    1:
    2:
    3:
    4:
    5:
    6:
    7:
    public bool Gesperrt {
        get { return gesperrt; }
        set { gesperrt = value; }
    }
    void MyGesperrtBoxSelectedIndexChanged(object sender, System.EventArgs e) {
        currentKunde.Gesperrt = (sender as ComboBox).SelectedIndex == 0;   
    }

An allen Stellen, die "bool" meinen, steht damit auch "bool", insbesondere beim Parameter "@Gesperrt".

Die Methoden der Convert-Klasse sind übrigens meistens ungünstig; besser sind schon bei Zahlen und Datumsangaben TryParse oder TryParseExact. Convert.ToBoolean() scheitert bei Deinen Versuchen höchstwahrscheinlich daran:
SDK-Doku hat folgendes geschrieben:
Convert.ToBoolean-Methode (String)
Parameter value
Ein String, der den Wert von TrueString oder von FalseString enthält.

TrueString ist konstant "true", aber nicht Dein "Gesperrt". Also erhältst Du zwangsläufig immer false, niemals true.

Ich hoffe, das hilft jetzt weiter. Jürgen