2012-08-02 10 views
5

dbTypedおよびサイズの変更されたSqlParametersの配列を作成しようとしています。これは正常に動作しますが、別の列が必要な場合はコードを両方の場所で変更する結果になります。サイズ/型指定されたSqlParametersの配列

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; 

これを行うにはどうすればよいでしょうか?

答えて

11

あなたはobject initializer表現を使用することができます

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 } 
}; 

をあなたもしばしば好まれるのと同じ方法でリストを作成することができます。

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 } 
}; 

に拡張メソッドを記述することもできます:

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

次に、このようにそれを使用します。

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

まさに私が探していたものです。私はオプション3を検討しましたが、私が思いついたものは好きではありませんでした。ありがとう! –

+0

@Jon Skeetあなたの投稿が非常に役に立ちましたが、現在私はFramework 2.0で作業しています。 "ISO-2 C#言語仕様の一部ではないため、Feature Object Initializerを使用できません。プロジェクトをアップグレードすることはできませんので、効率的な方法があります。 –

+0

@RahulNikate: .NET 2.0を使用しているからといって、C#の新しい機能を使用することはできません。たとえば、Visual Studio 2013を使用して.NET 2.0をターゲットにすることができます。 –

-2

あなたが戻って、このような値を追加することができます。

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

いいえ、できません。その式の値は 'SqlParameter'ではなく' to.FirstName'であるためです。 –

+0

さて、私はそれを使用し、それは動作します.... – Stig

+1

配列作成式では? 'command.AddParameter(...)。Value =" foo "'はまったく異なるものです。 –

0

あなたは、パラメータとして値を指定することができますconstructor overloadを使用することができます。例えば

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

etc... 
0

より良い方法はありますか?確かに:例えば「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(); 

これは、あなたのためにすべてのパラメータ化とマテリアを処理します。

関連する問題