2012-04-03 16 views
45

ho letto la documentazione MSDN e gli esempi here e so che la sintassi corretta per una chiamata Paramters.Add è:Differenza tra Parameters.Add e Parameters.AddWithValue

command.Parameters.Add("@ID", SqlDbType.Int); 
    command.Parameters["@ID"].Value = customerID; 

Dove è necessario specificare il nome del parametro, la SqlDbType E il valore con .Value.

Ora la sintassi corretta per una chiamata Parameters.AddWithValue è:

command.Parameters.AddWithValue("@demographics", demoXml); 

linea singola e saltare la parte Type.

mia domanda è: Come è possibile che quando lo faccio come questo,

command.Parameters.Add("@demographics", demoXml); 
    // .Add method with .AddWithValue syntax 

non ottengo alcun errore di compilazione e ancora più strano, tutto sembra funzionare correttamente quando viene eseguito il codice?

risposta

70

Non v'è alcuna differenza in termini di funzionalità. Infatti, sia fare questo:

return this.Add(new SqlParameter(parameterName, value)); 

Il motivo per cui deprecato il vecchio a favore di AddWithValue è quello di aggiungere ulteriore chiarezza, così come, perché il secondo parametro è object, che lo rende non immediatamente evidente per alcune persone quale sovraccarico di Add veniva chiamato e hanno comportato un comportamento estremamente diverso.

Date un'occhiata a questo esempio:

SqlCommand command = new SqlCommand(); 
command.Parameters.Add("@name", 0); 

A prima vista, sembra che sta chiamando il Add(string name, object value) sovraccarico, ma non è. Sta chiamando il sovraccarico Add(string name, SqlDbType type)! Questo perché 0 è implicitamente convertibile in tipi enum. Così queste due linee:

command.Parameters.Add("@name", 0); 

e

command.Parameters.Add("@name", 1); 

effettivamente portare a due metodi diversi di essere chiamati. 1 non è convertibile in un'enum implicitamente, in modo che sceglie la object sovraccarico. Con 0, sceglie il sovraccarico enum.

+0

L'unica cosa è che dovrete convivere con un nuovo avvertimento per ogni parametro si aggiunge in questo modo. – phadaphunk

+4

Sì, l'avviso è perché ** questo sovraccarico è obsoleto ** come indicato nella documentazione. Dalla documentazione, inoltre, "Prestare attenzione quando si utilizza questo overload del metodo SqlParameterCollection.Add per specificare valori di valori integer." –

+0

Nel caso in cui qualcuno che è curioso come me, si chieda perché lo zero possa implicitamente convertirsi in enum ma non in qualsiasi altro intero. Ecco un link a una spiegazione SO, http://stackoverflow.com/questions/14950750/why-switch-for-enum-accepts-implicit-conversion-to-0-but-no-for-any-other-intege –

3

Senza fornire esplicitamente il tipo di command.Parameters.Add("@ID", SqlDbType.Int);, tenterà di convertire implicitamente l'ingresso a quello che si aspetta.

Lo svantaggio di questo, è che la conversione implicita non può essere il più ottimale di conversioni e può provocare un calo di prestazioni.

C'è una discussione su questo argomento molto qui: http://forums.asp.net/t/1200255.aspx/1

8

La differenza è la conversione implicita nell'uso AddWithValue. Se si sa che la query SQL in esecuzione (stored procedure) accetta un valore di tipo int, nvarchar, ecc., Non c'è motivo di ripeterla nel codice.

Per scenari di tipi complessi (ad esempio DateTime, float), probabilmente utilizzerò Aggiungi poiché è più esplicito, ma AddWithValue per scenari di tipo più diretto (Int a Int).

1

quando usiamo CommandObj.Parameter.Add() impiega 2 primo parametro è parametro procedimento e secondo è il tipo di dati, ma .AddWithValue) prendere (2 primo parametro è parametro procedimento e la seconda è la variabile dati

CommandObj.Parameter.Add("@ID",SqlDbType.Int).Value=textBox1.Text; 

// per .AddWithValue

CommandObj.Parameter.AddWitheValue("@ID",textBox1.Text); 

dove ID è il parametro di procedura immagazzinata quale tipo di dati è Int

0

non v'è alcuna differenza in termini funzionalità


Procedimento addwithvalue prende un oggetto come valore. Non esiste un tipo di controllo del tipo di dati. Potenzialmente, ciò potrebbe causare errori se il tipo di dati non corrisponde alla tabella SQL. Il metodo add richiede di specificare prima il tipo di Database. Questo aiuta a ridurre tali errori.

Per ulteriori dettagli Please click here