2014-05-15 32 views
1

我試圖將字符串列表作爲參數傳遞到存儲過程,該過程期望具有單列的表的UDT。我正在與SqlCommand對象錯誤,我發現那個帖子說使用數據表:將IEnumerable <string>作爲用戶定義的表類型參數傳遞給SQL Server存儲過程

How to pass User Defined Table Type as Stored Procedured parameter in C#

我想知道是否有考慮到我沒有多列一個簡單的方法。在該過程中,我正在將表類型作爲子選擇與其他表進行操作,因此保留此功能將很不錯。

有沒有更好的方法,或者只是轉換爲DataTable?

謝謝!

+0

參見[目前公認的答案(http://stackoverflow.com/a/1253737/173497)現有問題[C# - 轉換IEnumerable的數據表來(http://stackoverflow.com/questions/1253725/convert-ienumerable-to-datatable),您可以使用它將一個'IEnumerable'轉換爲'DataTable'。 –

回答

3

您不必使用DataTable

System.Data.SqlClient的支持從DataTableDbDataReaderSystem.Collections.Generic.IEnumerable<SqlDataRecord>填充表值參數([T:System.Collections.Generic.IEnumerable`1) ]對象。您必須使用SqlParameter的TypeName屬性爲表值參數指定一個類型名稱。 TypeName必須與先前在服務器上創建的兼容類型的名稱匹配。以下代碼片段演示瞭如何配置SqlParameter以插入數據。

以上是從Table-Valued Parameters (MSDN)

...但使用DataTable可能比替代品容易得多;這裏是展示如何從IEnumerable<string>創建DataTable一個簡單的例子:

IEnumerable<string> strings = new List<string>() { "blah", "blah blah", "blah blah blah" }; 

DataTable table = new DataTable(); 

table.Columns.Add(
    new DataColumn() 
    { 
     DataType = Type.GetType("System.String"), 
     ColumnName = "String" 
    }); 

DataRow row; 

foreach (string aString in strings) 
{ 
    row = table.NewRow(); 
    row["String"] = aString; 
    table.Rows.Add(row); 
} 
2

肯尼的建議是什麼,我一直在尋找。這是實際的實現,減去正常的命令初始化。

DataTable dt = new DataTable(); 
dt.Columns.Add(new DataColumn() 
{ DataType = Type.GetType("System.String"), ColumnName = "colname" }); 

DataRow row; 

stringArray.ToList().ForEach(s => 
{ 
    row = dt.NewRow(); 
    row["colname"] = s; 
    dt.Rows.Add(row); 
}); 

cmd.Parameters.Add(new SqlParameter("@colname", SqlDbType.Structured) 
{ 
    Direction = ParameterDirection.Input, 
    Value = dt, 
}); 
相關問題