Gestione dei valori vuoti con ADO.NET e AddWithValue ()

voti
3

Ho un controllo che, al postback, salva i risultati del modulo al database. Si popola i valori da salvare scorrendo querystring. Così, per la seguente istruzione SQL (enormemente semplificato per il bene della discussione) ...

UPDATE MyTable
SET MyVal1 = @val1,
    MyVal2 = @val2
WHERE @id = @id

... sarebbe scorrere le chiavi querystring nel seguente modo:

For Each Key As String In Request.QueryString.Keys
    Command.Parameters.AddWithValue(@ & Key, Request.QueryString(Key))
Next

Tuttavia, sono ora in esecuzione in una situazione in cui, in determinate circostanze, alcune di queste variabili non possono essere presenti nella querystring. Se non passare lungo val2 nella querystring, ottengo un errore: System.Data.SqlClient.SqlException: Must declare the scalar value @val2.

I tentativi di rilevare il valore mancante nell'istruzione SQL ...

IF @val2 IS NOT NULL
UPDATE MyTable
SET MyVal1 = @val1,
    MyVal2 = @val2
WHERE @id = @id

... Ha fallito.

Qual è il modo migliore per attaccare questo? Devo analizzare il blocco di SQL con RegEx, la scansione per i nomi delle variabili non presenti nel querystring? Oppure, c'è un modo più elegante per avvicinarsi?

UPDATE: Rilevare valori nulli nel codebehind VB sconfigge lo scopo di disaccoppiare il codice dal suo contesto. Preferirei non figliata mia funzione con le condizioni per ogni variabile concepibile che potrebbe essere passato, o non passato.

È pubblicato 15/09/2008 alle 19:44
fonte dall'utente
In altre lingue...                            


4 risposte

voti
8

Prima di tutto, vorrei suggerire contro l'aggiunta di tutte le voci sul querystring come nomi di parametri, non sono sicuro che questo è sicuro, ma non vorrei correre il rischio.

Il problema è che stai chiamando

Command.Parameters.AddWithValue("@val2", null)

Invece di questo si dovrebbe essere chiamando:

If MyValue Is Nothing Then
    Command.Parameters.AddWithValue("@val2", DBNull.Value)
Else
    Command.Parameters.AddWithValue("@val2", MyValue)
End If
Risposto il 15/09/2008 a 19:50
fonte dall'utente

voti
0

Aggiornamento: La soluzione che ho dato si basa sul presupposto che si tratta di una stored procedure. Sarà dando un valore predefinito di Null al lavoro SQL stored parametri proc?

Se è SQL dinamico, passare sempre il numero corretto di params, se è nullo o il valore effettivo o specificare i valori predefiniti.

Risposto il 15/09/2008 a 19:51
fonte dall'utente

voti
0

Mi piace usare il AddWithValuemetodo.

Ho sempre specificare i parametri di default SQL per i parametri "facoltativi". In questo modo, se è vuoto, ADO.NET sarà non include il parametro, e la stored procedure userà il suo valore di default.

Non ho a che fare con il controllo / passando DBNull.Value quel modo.

Risposto il 15/09/2008 a 19:57
fonte dall'utente

voti
0

Dopo aver lottato per trovare una soluzione più semplice, ho rinunciato e ho scritto una routine per analizzare la mia query SQL per i nomi delle variabili:

Dim FieldRegEx As New Regex("@([A-Z_]+)", RegexOptions.IgnoreCase)
Dim Fields As Match = FieldRegEx.Match(Query)
Dim Processed As New ArrayList

While Fields.Success
    Dim Key As String = Fields.Groups(1).Value
    Dim Val As Object = Request.QueryString(Key)
    If Val = "" Then Val = DBNull.Value
    If Not Processed.Contains(Key) Then
        Command.Parameters.AddWithValue("@" & Key, Val)
        Processed.Add(Key)
    End If
    Fields = Fields.NextMatch()
End While

E 'un po' di un hack, ma mi permette di mantenere il mio codice beatamente ignaro del contesto della mia query SQL.

Risposto il 15/09/2008 a 21:37
fonte dall'utente

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more