C#.net Windows-Anwendung - Input-Daten zu überprüfen, bevor einfügen in Datenbank
Ich bin der Buchung system.
Ich kann nicht herausfinden, die Validierungs-Algorithmus für eine Reihe von Daten vor dem einfügen in die DB.
Der Primärschlüssel wird die Buchungs-ID, die automatisch generiert durch das system.
Brauche ich, um zu validieren, bdate, btime und sname. (bdate=Buchung, btime=der Buchung, und sname=Mitarbeiter-name)
Im Falle der bdate, btime und sname ist dasselbe wie das, was die client-Eingang. das system warnt seine doppelte als die Mitarbeiter bereits haben-Buchung auf das Datum und die Uhrzeit ein.
Finden Sie meine insert-Abfrage an unten und geschätzt werden, können Sie zeigen Sie mir den richtigen Weg.
private void btn_save_Click(object sender, EventArgs e)
{
OleDbCommand cmd = new OleDbCommand();
cmd.CommandType = CommandType.Text;
//query for duplicate
cmd.CommandText = "select count(*) from Booking where sname = @newName and bdate = @newDate and btime = @newTime";
//cmd.Parameters.Add("@newName", OleDbType.VarChar).Value = txt_cname.Text;
//cmd.Parameters.Add("@newDate", OleDbType.DBDate).Value = dtp_bdate.Value.Date;
//cmd.Parameters.Add("@newTime", OleDbType.VarChar).Value = dtp_btime.Value.ToString("hh:mm tt");
cmd.CommandText = "insert into Booking(cname, bdate, btime, ccontact, sname) Values('" + txt_cname.Text + "','" + dtp_bdate.Value.Date + "','" + dtp_btime.Value.ToString("hh:mm tt") + "','" + txt_ccontact.Text + "','" + txt_sname.Text + "')";
cmd.Connection = myCon;
myCon.Open();
int recordCount = Convert.ToInt32(cmd.ExecuteScalar());
myCon.Close();
if (recordCount>0)
{
//handle duplicates
MessageBox.Show("Duplicated", "My Application",
MessageBoxButtons.OKCancel, MessageBoxIcon.Asterisk);
}
//cmd.Connection = myCon;
//myCon.Open();
//cmd.ExecuteNonQuery();
//myCon.Close();
//MessageBox.Show(dtp_bdate.Value.ToString());
//MessageBox.Show("Booking completed", "My Application",
//MessageBoxButtons.OKCancel, MessageBoxIcon.Asterisk);
}
- Sie haben Zugang zu der Datenbank? Eine UNIQUE-Einschränkung wäre viel einfacher, zu beschäftigen, auf diese drei Felder. Es sei denn, der Buchung des gleichen Kunden zweimal auf den gleichen Tag/Zeit gültig ist.
- verwenden Sie sql Parameter zu vermeiden, sql-Injektionen, können Sie gespeicherte Prozeduren verwenden, und überprüfen Sie, ob Daten vorhanden sind, und werfen sql-exception anderes einfügen von Daten
- Übrigens, Sie haben sich Links öffnen sich nicht nur zu schweren injection-Angriffe, aber auch dumme kleine Fehler. Wenn der name des Kunden ist Bill O ' Reilly, deine Abfrage einen Fehler.
- Ich werde zu erraten, dass Ihre Datenquelle Zugreifen? Ansonsten, warum sind Sie mithilfe von OleDb?
- Anstatt zu warten, bis die sql zu einem Fehler, da die eindeutigen index, warum nicht versuchen, ein wählen Sie zuerst? Dies wird auch ermöglichen es Ihnen, ändern Sie die Buchung, wenn nötig.
- Haben Sie sich überlegt mit Entity Framework oder LinqToSQL als ORM für Ihre Lösung? Mit einem von diesen erheblich vereinfachen Ihre Aufgaben Daten-Validierung und Daten-Zugriff für diese Angelegenheit.
- Wenn Sie select count verfügbar ist, dann nur einfügen, wenn die vorhandenen Zahl auf die Felder null ist. wenn count = fügen. Und wie andere darauf hingewiesen. Immer Parameter verwenden, und nicht inline-build-string der Abfrage.
- Sie können
try
/catch
in SQL zu behandeln, dieINSERT
. Das hält das prüfen und einfügen als eine Atomare operation.
Du musst angemeldet sein, um einen Kommentar abzugeben.
werden Sie brauchen, um zu überprüfen, ob die Buchung existiert, bevor Sie Ihre insert -, so müssen Sie einen zusätzlichen Schritt:
wenn Sie diese ausführen, wird es entweder zurückgeben, die Anzahl der passenden Zeilen, wenn diese 1 oder mehr ist, dann sollten Sie rufen Sie dann Ihre doppelte Logik.
bearbeitet werden, um korrekte code
ExecuteScalar();
int recordCount = Convert.ToInt32(cmd.ExecuteScalar());
Um zu überprüfen, ob das vorhandene Feld können Sie eine
Select
- und dann vergleichen:Lassen Sie mich wissen, ob es funktioniert oder die Fehlermeldung, die Sie erhalten.
arbeiten nützlich-code versuchen Sie, diese