2012-08-02 23 views
5

Sto provando a creare una matrice di SqlParameters dbTyped e dimensionati. Funziona bene ma comporta la modifica del codice in entrambi i casi se ho bisogno di un'altra colonna.Array of SqlParameters Sized/Typed

SqlParameter[] parameters = { 
            new SqlParameter("@first_name", SqlDbType.VarChar, 50), 
            new SqlParameter("@last_name", SqlDbType.VarChar, 50), 
            new SqlParameter("@middle_name", SqlDbType.VarChar, 50), 
            new SqlParameter("@empid", SqlDbType.Int) 
          }; 
parameters[0].Value = to.FirstName; 
parameters[1].Value = to.LastName; 
parameters[2].Value = to.MiddleName; 
parameters[3].Value = to.EmpId; 

Qual è un modo migliore di farlo?

risposta

11

È possibile utilizzare object initializer espressioni:

SqlParameter[] parameters = 
{  
    new SqlParameter("@first_name", SqlDbType.VarChar, 50) { Value = to.FirstName }, 
    new SqlParameter("@last_name", SqlDbType.VarChar, 50) { Value = to.LastName }, 
    new SqlParameter("@middle_name", SqlDbType.VarChar, 50) { Value = to.MiddleName }, 
    new SqlParameter("@empid", SqlDbType.Int) { Value = to.EmpId } 
}; 

Si potrebbe anche creare una lista nello stesso modo, che è spesso preferito:

List<SqlParameter> parameters = new List<SqlParameter> 
{  
    new SqlParameter("@first_name", SqlDbType.VarChar, 50) { Value = to.FirstName }, 
    new SqlParameter("@last_name", SqlDbType.VarChar, 50) { Value = to.LastName }, 
    new SqlParameter("@middle_name", SqlDbType.VarChar, 50) { Value = to.MiddleName }, 
    new SqlParameter("@empid", SqlDbType.Int) { Value = to.EmpId } 
}; 

Oppure si potrebbe anche scrivere un metodo di estensione su SqlParameter:

public static SqlParameter WithValue(this SqlParameter parameter, object value) 
{ 
    parameter.Value = value; 
    return parameter; 
} 

quindi utilizzarlo in questo modo:

List<SqlParameter> parameters = new List<SqlParameter> 
{  
    new SqlParameter("@first_name", SqlDbType.VarChar, 50).WithValue(to.FirstName), 
    new SqlParameter("@last_name", SqlDbType.VarChar, 50).WithValue = to.LastName) 
    new SqlParameter("@middle_name", SqlDbType.VarChar, 50).WithValue(to.MiddleName), 
    new SqlParameter("@empid", SqlDbType.Int).WithValue(to.EmpId) 
}; 
+0

Esattamente quello che stavo cercando. Ho esplorato l'opzione 3 ma non mi è piaciuto quello che mi è venuto in mente. Grazie! –

+0

@Jon Skeet Ho trovato il tuo post molto utile ma attualmente sto lavorando a Framework 2.0. Quindi sta mostrando errore come "Feature Object Initializer non può essere usato perché non fa parte delle specifiche del linguaggio ISO-2 C#. Scusa se non è possibile aggiornare il progetto, quindi c'è un modo efficace per questo. –

+0

@RahulNikate: Solo perché stai utilizzando .NET 2.0 non significa che non puoi utilizzare le nuove funzionalità di C#. Ad esempio, potresti utilizzare Visual Studio 2013 e continuare a utilizzare .NET 2.0. Se ti limiti a C# 2.0, troverai un sacco di codice sui post di Stack Overflow non funziona per te, e non è pratico fornire alternative ovunque. –

-2

è possibile aggiungere il valore indietro in questo modo:

new SqlParameter("@first_name", SqlDbType.VarChar, 50).value = to.FirstName 
+0

No, non è possibile - perché il valore di tale espressione è 'to.FirstName', non' SqlParameter'. –

+0

Beh, lo uso e funziona .... – Stig

+1

In un'espressione di creazione di array? È più comune avere 'command.AddParameter (...). Value =" foo "' che è completamente diverso. –

0

È possibile utilizzare il constructor overload che consente di specificare il valore come parametro.

Ad esempio:

SqlParameter[] parameters = { 
           new SqlParameter("@first_name", SqlDbType.VarChar, 50, ParameterDirection.Input, true, 0, 0, "", DataRowVersion.Current, to.FirstName), 

etc... 
0

Un modo migliore? Certo: lasciare che un aiuto strumento che, per esempio "Dapper":

var rows = conn.Query<YourType>(@" your tsql ", 
    new { first_name = to.FirstName, 
      middle_name = to.MiddleName, 
      last_name = to.LastName, 
      empid = to.EmpId }).ToList(); 

Questo poi gestisce tutta la parametrizzazione e materializzazione per voi.