2017-06-21 36 views
0

這是我的SQL查詢手冊工作:存儲過程的參數數組CSHARP到MSSQL

SELECT * FROM Accounts where Phone in ('05763671278','05763271578','04763125578') 

我怎麼能得到參數像這樣從csharp的存儲過程?

我在C#中有一個手機數組。我從視圖中的參數中獲取這個數組(複選框選擇)。這是我的看法:

<td><input type="checkbox" class="CheckboxClass" value="'@item.Phones'"/></td> 

這是我的控制器操作:

public ActionResult SendSMSOrMail(string[] values){ 

    // this give "'05763671278','05763271578','04763125578'" 
    string numbers = string.Join(",", values); 
    // ... 
    utility.cmd.Parameters.Add("@numbers", numbers); 
    // ... 
} 

但結果是null。哪裏不對?我想獲得包含這些手機的所有記錄的結果。

+0

參數按順序添加,不需要名稱。所以使用:utility.cmd.Parameters.Add(「05763671278」); – jdweng

+0

您不能參數化IN列表,而是使用Table Valued參數,例如, https://stackoverflow.com/questions/5595353/how-to-pass-table-value-parameters-to-stored-procedure-from-net-code/https://stackoverflow.com/questions/2377506/pass- array-parameter-in-sqlcommand –

+0

使用[Table-Valued Parameters](https://docs.microsoft.com/en-us/sql/relational-databases/tables/use-table-valued-parameters-database-engine) – Sami

回答

1

我建議你使用一個table valued parameter

CREATE TYPE PhonesTableType AS TABLE 
( 
    Phone VARCHAR(12) 
) 
GO 

那麼你應該申報(在創建腳本),您存儲過程預計這種類型的參數:

CREATE PROCEDURE dbo.your_stored_procedure_name 
(
    @PhonesTableType PhonesTableType READONLY 
) 
.... 
SELECT A.* 
FROM Accounts AS A 
INNER JOIN @PhonesTableType AS P 
ON A.Phone = P.Phone 

然後在C#代碼你應該用一列創建一個DataTable並將你提到的值傳遞給那裏。最後,你應該將這個參數傳遞給你的存儲過程。

var phonesDataTable = new DataTable("Phones"); 
phonesDataTable.Columns.Add("Phone", typeof(string)); 
foreach(var phone in phones) // phones is the values 
{ 
    phonesDataTable.Rows.Add(phone); 
} 

那麼,如果我們假設你有一個名爲command要執行,你會問的命令,你應該添加上面的參數在執行前:

var sqlParameter = new SqlParameter 
{ 
    ParameterName = "@PhonesTableType", 
    SqlDbType = SqlDbType.Structured, 
    Value = phonesDataTable 
}; 
command.Parameters.Add(sqlParameter); 
+0

DataTable方法很混亂。你可以直接傳遞一個集合,雖然我沒有這個方便的例子。 –

+0

@ErikFunkenbusch我不知道這一點。謝謝(你的)信息。我會看看。 – Christos

1

有幾種方法做這個。首先是將數組創建爲一串文本,用逗號或分號或其他分隔符分隔,然後在SQL中解析該字符串。這非常簡單直接,但不能很好地擴展,並且參數的最大字符長度有限制。

第二種選擇是使用XML參數。實施例這裏:

https://stackoverflow.com/a/1069388/61164

第三種選擇是使用一個表參數,它被作爲一個集合.NET傳遞。

我沒有那個方便的例子。我以前做過,但是這應該會給你足夠的信息來尋找你自己。