Eintrag überprüfen

magic_halli

Erfahrenes Mitglied
Hi,

wenn der User gewisse Sachen wählt und dann auf speichern klickt, sollen, bevor die Eintragung in die DB geschieht, diese gewählten Werte verglichen werden, ob diese in der DB schon vorhanden sind.
Hier ist mal mein Code:
Code:
'hier sind die ID´s der gewählten Werte
idper = DropDownList1.SelectedItem.Value
idtag = DropDownList2.SelectedItem.Value
idzeit = DropDownList3.SelectedItem.Value
idzyk = DropDownList4.SelectedItem.Value
....
'Hier wird die entsprechende Table in ein DataRow gelesen 
und die entsprechenden Werte ausgelesen
Dim dt_check As DataTable = ds_check.Tables("check")
Dim dr_check As DataRow
Dim idper_check, idtag_check, idzeit_check, idzyk_check  As Integer
Dim check as Boolean
        For Each dr_check In dt_check.Rows
            idper_check = dr_check("IDper")
            idzeit_check = dr_check("IDzeit")
            idtag_check = dr_check("IDtag")
            idzyk_check = dr_check("IDzyk")
            If idper_check = idper And idzeit_check = idzeit And idtag_check = idtag And idzyk_check = idzyk Then
                check=true
                exit for
            end if
        Next

'Vergleich, ob schon vorhanden. Wenn ja, dann 
Label1.Visible=True und nicht speichern
If check=true Then
            Label1.Visible = True
            Label1.Text = "Diese Eintragungen sind bereits vorhanden. Bitte wählen Sie andere Sperrzeiten."
Else
   'dbo.mat_ver füllen
   'hier kommt das INSERT-Commando für die Speicherung der Daten
   ...
   Dim msgRet As Integer
   msgRet = MsgBox("Ihre Daten wurden erfolgreich gespeichert. Möchten Sie weitere Eintragungen vornehmen? ", 131072 + MsgBoxStyle.YesNo, "Daten 
gespeichert")
   If msgRet = vbYes Then
                Response.Redirect("sperre.aspx")
   Else
                Response.Redirect("eing_auswahl.aspx")
   End If
End If

Wenn ich eine Kombination wähle, die bereits in der DB steht, dann kann ich diese trotzdem nochmals eintragen, ohne dass die Nachricht erscheint. Wenn ich diese jetzt nochmals wähle, dann erst erscheint Label1 und es wird nicht gespeichert... Ich verstehe das nicht so ganz!

Es soll jede Auswahl sofort verglichen werden, bevor diese eingetragen wird, egal wo diese bereits in der Datenbanktabelle steht!
Was habe ich falsch gemacht?

Danke, Rico.
 
Nur zum Verständnis - soll nicht gespeichert werden wenn nur ein Wert gleich ist oder wenn alle Werte gleich sind?
 
Es soll nicht gespeichert werden, wenn alle Werte gleich sind - also wenn die vorgenommene Auswahl schon einmal exakt genauso in der Tabelle der DB vorhanden ist.
 
Ehrlich gesagt schiesst du hier meiner Meinung nach mit Kanonen auf Spatzen ;)

Ich würde das ganze ein wenig anders lösen und SQL das machen lassen in folgender Art und Weise:

Code:
...Datenbankanbindung...
dim cmd as sqlcommand = new sqlcommand("SELECT COUNT(*) FROM tabellenname WHERE zeile1=@idper AND zeile2=@idtag AND zeile3=@idzeit AND zeile4=@idzyk", connection)

cmd.parameters.add(@idper, DropDownList1.SelectedItem.Value)
cmd.parameters.add(@idtag, DropDownList2.SelectedItem.Value)
cmd.parameters.add(@idtag, DropDownList3.SelectedItem.Value)
cmd.parameters.add(@idzeit, DropDownList4.SelectedItem.Value)

dim p as integer = cmd.executescalar

if p > 0 then 

.....fehlerbehandlung...

else

....alles okay und speichern...

end if

Natürlich musst du noch die Einträge im SQL-Statement anpassen und die Routinen für die Speicherung programmieren - aber ich denke du hast verstanden was ich meine. Auf jeden Fall entlastest du so auch den Server und das ganze ist wesentlich schneller.
 
Hi,

irgendwie bekomme ich das mit der Syntax nicht hin, da ich sowas noch nie gemacht habe! Hier mal mein geänderter Code:
Code:
idper = DropDownList1.SelectedItem.Value
idtag = DropDownList2.SelectedItem.Value
idzeit = DropDownList3.SelectedItem.Value
idzyk = DropDownList4.SelectedItem.Value

Dim datasource As String =
System.Configuration.ConfigurationSettings.AppSettings.Item("dsn")
Dim planconn As New SqlConnection(datasource)
planconn.Open()
Dim cmd_check As SqlCommand = New SqlCommand("Select COUNT(*) From sperrzeiten Where IDper='" & idper & "' AND IDzeit='" & idzeit & "' AND IDtag='" & idtag & "' AND IDzyk='" & idzyk & "' ")
Dim da_check As New SqlDataAdapter(cmd_check)
Dim ds_check As New DataSet()
da_check.Fill(ds_check, "check")
planconn.Close()

cmd_check.Parameters.Add(idper, DropDownList1.SelectedItem.Value)
cmd_check.Parameters.Add(idtag, DropDownList2.SelectedItem.Value)
cmd_check.Parameters.Add(idtag, DropDownList3.SelectedItem.Value)
cmd_check.Parameters.Add(idzeit, DropDownList4.SelectedItem.Value)

Dim p As Integer = cmd_check.ExecuteScalar

If p > 0 Then
...Fehlermeldung
Else
...Eintrag in DB
End If

Die '&'-Zeichen in cmd_check.Parameters.Add(...) musste ich entfernen, da Fehlermeldung.
Ansonsten ist´s mir schon halbwegs klar was passiert: Wenn eine Übereinstimmung vorherrscht, dann wird eine Zahl>0 zurückgegeben, ansonsten eine -1 ?!
Aber die Syntax rund um die Datenbindung ist mir noch etwas rätselhaft, wie ich dies machen soll... bitte hilf mir nochmal!

Danke, Rico.

PS.: Wenn ich´s so ausführe, dann bekomme ich eine Fehlermeldung "Fill: SelectCommand.Connection-Eigenschaft wurde nicht initialisiert."
 
Ok, ich habs jetzt nach vielen Versuchen gelöst. So funktionierts:
Code:
Dim datasource As String = System.Configuration.ConfigurationSettings.AppSettings.Item("dsn")
        Dim planconn As New SqlConnection(datasource)
        planconn.Open()
        Dim sqlStr_check As String = "Select COUNT(*) From sperrzeiten Where IDper='" & idper & "' AND IDzeit='" & idzeit & "' AND IDtag='" & idtag & "' AND IDzyk='" & idzyk & "' "
        Dim cmd_check As New SqlCommand(sqlStr_check, planconn)
        Dim da_check As New SqlDataAdapter(cmd_check)
        Dim ds_check As New DataSet()
        da_check.Fill(ds_check, "check")
        
        Dim p As Integer = cmd_check.ExecuteScalar
        planconn.Close()

        If p > 0 Then
        ...
        Else
        ...
        End If

Danke für die Hilfe.
 
Hi

Nochmal zur Erläuterung für die parametrisierten Abfragen

cmd.parameters.add("@text", value) --> wichtig ist, das das @text genau so im Sql-String auftaucht und dann erst der Wert zugewiesen wird. Den Fehler hatte ich in meinem ersten Post - hab die Anführungszeichen vergessen - mea culpa. Das @-Zeichen ist dabei wichtig. Du solltest das auch auf jeden Fall verwenden mit den parametrisierten Abfragen, weil du dadurch auch SQL-Injection verhinderst und somit eine wesentlich erhöhte Sicherheit hast. Und der zweite Vorteil ist einfach auch noch die Übersichtlichkeit, da du bei langen Zuweisungen in langen SQL-Strings die Übersicht schnell verlieren kannst und es bei Änderungen in den Wertzuweisungen schnell zu Fehlern kommen kann. Man gewöhnt sich schnell an die Schreibweise ;)

In deinem ersten Code kam es zu dem Fehler weil du 1. die @Zeichen in den Parameter-Zuweisungen vergessen hast und 2.im SQL-String die Connection nicht zum Schluss eingetragen hast.

In deinem letzten Code-Abschnitt verstehe ich folgendes nicht:

Dim da_check As New SqlDataAdapter(cmd_check)
Dim ds_check As New DataSet()
da_check.Fill(ds_check, "check")

Brauchst du das? Du machst doch gar nichts mit dem Dataset und verschwendest nur Ressourcen. Durch die executescalar-Abfrage wird der Wert doch schon automatisch zugewiesen ;)

Wenn du willst schick mir mal deinen Codeteil und ich optimier ihn dir ;)
 
Zuletzt bearbeitet:
Zurück