Dapper是否支持SQL 2008 Table-Valued参数?

有谁知道是否有可能将表值参数数据传递给存储过程与Dapper?

现在(n Dapper 1.26和更高版本)直接支持表格参数烘焙成短小精悍。 在存储过程的情况下,由于数据types内置在sproc API中,所以您只需提供一个DataTable

 var data = connection.Query<SomeType>(..., new { id=123, name="abc", values = someTable }, ...); 

对于直接的命令文本,你有两个select:

  • 使用一个辅助方法来告诉它的自定义数据types:

     var data = connection.Query<SomeType>(..., new { id=123, name="abc", values = someTable.AsTableValuedParameter("mytype") }, ...); 
  • 告诉数据表本身使用什么自定义数据types:

     someTable.SetTypeName("mytype"); var data = connection.Query<SomeType>(..., new { id=123, name="abc", values = someTable }, ...); 

任何这些应该工作正常。

是的,我们支持他们,但你需要编写你自己的帮手。

例如:

 class IntDynamicParam : Dapper.SqlMapper.IDynamicParameters { IEnumerable<int> numbers; public IntDynamicParam(IEnumerable<int> numbers) { this.numbers = numbers; } public void AddParameters(IDbCommand command) { var sqlCommand = (SqlCommand)command; sqlCommand.CommandType = CommandType.StoredProcedure; List<Microsoft.SqlServer.Server.SqlDataRecord> number_list = new List<Microsoft.SqlServer.Server.SqlDataRecord>(); // Create an SqlMetaData object that describes our table type. Microsoft.SqlServer.Server.SqlMetaData[] tvp_definition = { new Microsoft.SqlServer.Server.SqlMetaData("n", SqlDbType.Int) }; foreach (int n in numbers) { // Create a new record, using the metadata array above. Microsoft.SqlServer.Server.SqlDataRecord rec = new Microsoft.SqlServer.Server.SqlDataRecord(tvp_definition); rec.SetInt32(0, n); // Set the value. number_list.Add(rec); // Add it to the list. } // Add the table parameter. var p = sqlCommand.Parameters.Add("@ints", SqlDbType.Structured); p.Direction = ParameterDirection.Input; p.TypeName = "int_list_type"; p.Value = number_list; } } // SQL Server specific test to demonstrate TVP public void TestTVP() { try { connection.Execute("CREATE TYPE int_list_type AS TABLE (n int NOT NULL PRIMARY KEY)"); connection.Execute("CREATE PROC get_ints @ints int_list_type READONLY AS select * from @ints"); var nums = connection.Query<int>("get_ints", new IntDynamicParam(new int[] { 1, 2, 3 })).ToList(); nums[0].IsEqualTo(1); nums[1].IsEqualTo(2); nums[2].IsEqualTo(3); nums.Count.IsEqualTo(3); connection.Execute("DROP PROC get_ints"); connection.Execute("DROP TYPE int_list_type"); } } 

确保你正确地testing表值params的性能。 当我testing这个传递int列表时,它显着慢于传递多个参数。

我完全不反对在contrib项目中使用一些SQL Server特定的辅助工具,但是核心工具可以避免在可能的情况下添加供应商特定的技巧。

我知道这张票是旧的,很旧,但是想让你知道我已经发布了Dapper.Microsoft.Sql包,它支持通用TVP。

https://www.nuget.org/packages/Dapper.Microsoft.Sql/

样品使用:

 List<char> nums = this.connection.Query<char>( "get_ints", new TableValuedParameter<char>( "@ints", "int_list_Type", new[] { 'A', 'B', 'C' })).ToList(); 

它基于来自Dappertesting项目的原始类。

请享用!

今天不是。 我们实际上调查了我们厚颜无耻的“in”实现( where col in @values )的table-valed-parameters,但是对性能没有什么印象。 但是,在SPROC的背景下是有道理的。

你最好的select就是把这个作为一个问题logging在项目网站上,这样我们可以跟踪/排列它的优先顺序。 这听起来像是可行的,但可能类似于DbString或DynamicParameters选项。

但今天? 没有。