2009-12-02 9 views
5

Quindi, ecco l'affare. Nel nostro database, avvolgiamo la maggior parte delle nostre letture (cioè istruzioni selezionate) in funzioni con valori di tabella per scopi di sicurezza e modularità. Quindi ho un TVF che definisce uno o più parametri opzionali.Come passare la parola chiave predefinita per la funzione chiamata a valore di tabella in ADO.NET

Credo che avere un TVF con i parametri in default mandati l'uso della parola chiave default quando si chiama il TVF in questo modo:

select * from fn_SampleTVF(123, DEFAULT, DEFAULT) 

va bene, tutto funziona nella Query Analyzer, ma quando arriva il momento di realtà effettuare questa richiesta da ADO.NET, non sono sicuro di come creare un parametro sql che in realtà inserisce la parola default nello sql reso.

Ho qualcosa o meno così ora:

String qry = "select * from fn_SampleTVF(@requiredParam, @optionalParam)"; 

DbCommand command = this.CreateStoreCommand(qry, CommandType.Text); 

SqlParameter someRequiredParam = new SqlParameter("@requiredParam", SqlDbType.Int); 
someRequiredParam.Value = 123; 
command.Parameters.Add(someRequiredParam); 

SqlParameter optionalParam = new SqlParameter("@optionalParam", SqlDbType.Int); 
optionalParam.Value = >>>> WTF? <<<< 
command.Parameters.Add(optionalParam); 

Quindi, Qualcuno ha qualche idea su come passare default al TVF?

+1

migliore soluzione che ho visto così lontano è quello di evitare di usare le clausole di default in la definizione dei parametri TVF, passa i null come suggerito da Kevin e crea manualmente i valori predefiniti nel tuo corpo TVF. Ecco un articolo che ho trovato (si tratta di Sprocs, ma il problema è lo stesso). http://social.msdn.microsoft.com/Forums/en/sqldataaccess/thread/3825fe1c-7b7e-4642-826b-ea024804f807 Come per tutte le altre cose associate a Microsoft, ottenendo questo lavoro comporterà un mezzo soluzione alternativa. – Mason

risposta

0

È possibile passare Null come valore del parametro.

Questo articolo mostra esempi: http://support.microsoft.com/kb/321902

+0

Grazie, ci proverò, ma sono abbastanza sicuro che il passaggio di un valore null esplicito sovrascriverà i valori predefiniti definiti nella definizione tvf, rendendo inutilizzabili le impostazioni predefinite. – Mason

+0

Mi piacerebbe sentire le tue scoperte. Sono sorpreso che non ho mai avuto bisogno di saperlo prima di vedere la tua domanda. Mi aspetterei comunque che Null funzioni e che DBNull annullerebbe la definizione del paramater. –

+0

Sì, ho appena controllato, non va bene. E la ragione è perché c'è una differenza tra: select * from fn_SampleTVF (123, DEFAULT) e select * from fn_SampleTVF (123, null) Grazie comunque. – Mason

3
SqlParameter optionalParam = new SqlParameter("@optionalParam", SqlDbType.Int); 
optionalParam.Value = >>>> WTF? <<<< 
command.Parameters.Add(optionalParam); 

Non è necessario aggiungere il codice di cui sopra (Il parametro opzionale) per impostazione predefinita. SQL Server utilizzerà l'impostazione predefinita come definita nell'UDF. Tuttavia, se si desidera passare diverso valore, allora si può passare:

SqlParameter optionalParam = new SqlParameter("@optionalParam", SqlDbType.Int); 
optionalParam.Value = newValue; 
command.Parameters.Add(optionalParam); 
+0

Inoltre, sembra (dai miei test fino ad ora) non è nemmeno necessario specificare il tipo di dati; quindi puoi dire: command.Parameters.Add (new SqlParameter ("@ OptionalParam", null)); ...e [null] verrà interpretato come [predefinito] – tbone

+1

MODIFICA: il mio commento precedente non è corretto: [null] è ** non ** interpretato come [predefinito] – tbone

+0

Ok, dopo ancora più test, almeno con la versione corrente del framework Sto usando, l'aggiunta del parametro senza specificare un valore NON comporta l'utilizzo del valore predefinito. La chiamata da SSMS con [impostazione predefinita] non produce lo stesso risultato del passaggio del parametro senza valore, anche se questo è il comportamento implicito qui: https://msdn.microsoft.com/en-us/library/system.data. sqlclient.sqlparameter.value% 28v = vs.110% 29.aspx – tbone

1

avrei fatto così:

public void YourMethod(int rparam, int? oparam = null) 
{ 
    String qry = string.Format("select * from fn_SampleTVF(@requiredParam, {0})" 
     , !oparam.HasValue ? "default" : "@optionalParam"); 

    SqlParameter someRequiredParam = new SqlParameter("@requiredParam", SqlDbType.Int); 
    someRequiredParam.Value = rparam; 
    command.Parameters.Add(someRequiredParam); 

    if (oparam.HasValue) 
    { 
     SqlParameter optionalParam = new SqlParameter("@optionalParam", SqlDbType.Int); 
     optionalParam.Value = oparam.Value; 
     command.Parameters.Add(optionalParam); 
    } 
}