2012-08-02 68 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 } 
}; 

或者你甚至可以寫一個擴展方法SqlParameter

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,但不喜歡我提出的。謝謝! – 2012-08-02 18:09:19

+0

@Jon Skeet我發現你的帖子非常有幫助,但是目前我正在使用Framework 2.0。所以它顯示錯誤,如「Feature Object Initializer無法使用,因爲它不是ISO-2 C#語言規範的一部分,對不起,現在不可能升級項目,那麼是否有任何有效的方法呢? – 2015-01-20 08:49:09

+0

@RahulNikate:僅僅因爲你使用的是.NET 2.0並不意味着你不能使用C#的新特性,例如,你可以使用Visual Studio 2013並且仍然以.NET 2.0爲目標,如果你只限於C#2.0,你會發現Stack Overflow帖子上的很多代碼都不適合你,並且在所有地方都提供替代品是不現實的。 – 2015-01-20 10:01:12

-2

您可以添加值回這樣的:

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

不,你不能 - 因爲那個表達式的值是'to.FirstName',而不是'SqlParameter'。 – 2012-08-02 18:02:46

+0

那麼我使用它,它的工作原理.... – Stig 2012-08-02 18:06:51

+1

在數組創建表達式?使用'command.AddParameter(...).value =「foo」'這更常見,這是完全不同的。 – 2012-08-02 18:09:13

0

可以使用constructor overload,允許你指定的值作爲參數。

例如:

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

etc... 
0

更好的辦法?肯定的是:讓一個工具幫助你,例如「短小精悍」:

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

這則處理所有的參數設置和物化爲您服務。