| 

.NET C# Java Javascript Exception

2
Hallo zusammen,
Ich komme hier nicht weiter. Eigentlich will ich nur ein paar Zeilen einer Tabelle ändern und habe aber unglücklicherweise Null als Klausel bei einigen Feldern.

Also suche ich nach leeren Strings ändere die Klausel von "abc = ?" auf "abc is ?".
Die Anfrage sieht auch ganz gut aus. Wenn ich die durch den Oracle SQl Developer durchlaufen lasse klappt das auch alles. Aber über vb.Net kriegt er den Wert nicht auf ein korrektes NULL gesetzt. Ich habe schon mit DBNull.Value als Wert der Variablen probiert wie auch mit "" oder Nothing.

Fehler ist "ora 00908 Missing Null Keyword".

Das funktioniert nicht:

'rowsandvalues = "Hide = ?" '
'where= "SpalteA = ?"'

'Paramter 1: @Hide -> 1'
'Paramter 2: @SpalteA -> ""'

Dim com As New OleDbCommand("Update " + table + " set " + rowsandvalues + " " + where + " ", oledbConn)
com.Transaction = tx
com.UpdatedRowSource = UpdateRowSource.Both


For i = 0 To values.Length - 1
If dbms = "oracle" Then

'wenn der Suchstring leer ist dann muss die where Klausel von = auf is angepasst werden'
'SpalteA hat bei mir einen leeren String ->""'
If values(i).Value.ToString = "" Then

where = where.Replace(values(i).ParameterName.Substring(1) + " =", values(i).ParameterName.Substring(1) + " is")
values(i).IsNullable = True
End If


End If
'die 2 Parameter ergänzen (Hide, SpalteA)'
'!!!hier ist der Knackpunkt, für SpalteA funktioniert weder DBNull.Value, "" oder Nothing später beim Excecute !!!'
com.Parameters.AddWithValue(values(i).ParameterName, values(i).Value)
Next
'where= "SpalteA is ?"'
'rowsandvalues = "Hide = ?" '
com.CommandText = "Update " + table + " set " + rowsandvalues + " " + where + " "

End If
com.ExecuteReader()
tx.Commit()

tx.Dispose()
oledbConn.Close()


Hat einer ne Idee. Kann ja nicht der erste sein, der das machen will...

Danke,
Daniel
14.12.2012
schlumpfger 288 1 8
2 Antworten
0
Warum schreibst du nicht direkt "abc is null" wenn der String leer ist.
Ich habe das noch nie mit einem ? als Parameter gesehen.
14.12.2012
PinBack 687 1 8
0
Das ? verwendet man um eine SQL Injektion zu vermeiden. Hier werden die Parameter als echte Parameter übergeben und nicht als String. Die Parameter kommen hier aus Textboxen und bergen daher diese Gefahr.

Hier die Beschreibung zu den lustigen Fragezeichen...

http://msdn.microsoft.com/en-us/library/system.data.oledb.oledbcommand.commandtext(v=vs.80).aspx
14.12.2012
schlumpfger 288 1 8
1
Bei "normalen" Parametern sollte man auch immer ? verwenden. Aber wenn bei einem Where-Bedingung "abc is null" gesetzt werden muss gibt es keine Gefahr für eine SQL Injektion.
If values(i).Value.ToString = "" Then
where = "abc is null"
End If
PinBack 17.12.2012
Das habe ich jetzt auch so umgesetzt. Wünschte es gäbe eine kosequentere Lösung über die Parameter. Ich lass die Frage mal als nicht gelöst offen. Vielleicht gibt es noch die Lösung.
schlumpfger 20.12.2012

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH