2011-09-25 19 views
3

我寫了一個t-sql sp來獲取表格作爲參數。如何在使用C#IDataReader時將參數中的表格類型發送到T-SQL?

我想從C#調用它,但不知道使用什麼類型:

database.AddInParameter(command, "@ID", DbType.String, id); 
database.AddInParameter(command, "@TemplatesIds", DbType.WhatType??, dt); 

using (IDataReader reader = database.ExecuteReader(command)) 
{ 
    while (reader.Read()) 
    { 
    } 
} 

我應該用什麼?

回答

5

由於您使用的是T-SQL,那麼你可以,如果你使用的是在你的(我猜)一個SqlCommand使用SqlDbType.Structured IDbCommand的

var dt = new DataTable(); 
... set up dt ... 
par = new SqlParameter("@TemplatesIds", SqlDbType.Structured, dt) 

沒有使用此here on the msdn.

+0

是什麼的DbType和SqlDbType之間的區別?還有更多類型嗎? –

+1

SqlDbType是特定於MS SQL Server的 – TheNextman

+2

我不得不做'par = new SqlParameter(「@ TemplatesIds」,SqlDbType.Structured){Value = dt};'。 – Geoff

1

也許不是最好的方法相當的幾個例子,但是工作原理:

-- Create the data type 
CREATE TYPE dbo.PlantList AS TABLE 
(
    plant_code char(1) Not Null Primary Key 
) 
GO 

擴展方法

public static class DatabaseExtensions 
{ 
    public static void AddTableTypeParameter<T>(this Database database, DbCommand command, string name, string sqlType, IEnumerable<T> values) 
    { 
     var table = new DataTable(); 
     PropertyInfo[] members = values.First().GetType().GetProperties(); 
     foreach (var member in members) 
     { 
      table.Columns.Add(member.Name, member.PropertyType); 
     } 

     foreach (var value in values) 
     { 
      var row = table.NewRow(); 
      row.ItemArray = members.Select(m => m.GetValue(value)).ToArray(); 
      table.Rows.Add(row); 
     } 
     var parameter = new SqlParameter(name, SqlDbType.Structured) 
     { 
      TypeName = sqlType, 
      SqlValue = table 
     }; 
     command.Parameters.Add(parameter); 
    } 

} 

,並調用如下:

database.AddTableTypeParameter(command, "@region_filter_plants", "dbo.PlantList", regionFilterPlants.Select(p => new { plant_code = p })); 
相關問題