有谁知道是否可以通过Dapper将table-valued parameter数据传递给存储过程?Dapper是否支持SQL 2008 Table-Valued参数?
回答
现在(n Dapper 1.26和更高版本)直接支持表格参数烘焙到短小精悍。在存储过程的情况下,由于数据类型内置存储过程的API,所有你需要做的是提供一个DataTable
:
var data = connection.Query<SomeType>(..., new {
id=123, name="abc", values = someTable
}, ...);
对于直接命令文本您还有其他两个选项:
使用一个辅助的方法来告诉它的自定义数据类型:
var data = connection.Query<SomeType>(..., new { id=123, name="abc", values = someTable.AsTableValuedParameter("mytype") }, ...);
告诉数据表本身有什么自定义数据类型使用方法:
someTable.SetTypeName("mytype"); var data = connection.Query<SomeType>(..., new { id=123, name="abc", values = someTable }, ...);
所有的这些都应该很好地工作。
如果我无法使用Dapper添加TVP,如果我需要非输入参数以及使用Dynamic Parameters,我无法添加TVP,请检查我的问题@ http:// stackoverflow .com/questions/33087629/dapper-dynamic-parameters-with-table-valued -value参数 – 2015-10-15 07:28:06
Bah,没有IEnumerable转换? – Nuzzolilo 2015-10-24 01:40:18
使用'ExecuteReader',我得到“System.Data.DataTable类型的成员事件不能用作参数值”。 – 2018-03-07 19:25:34
今天它不是。我们实际上调查了我们厚颜无耻的“in”实现(where col in @values
)中的table-valed-参数,但对性能非常不感兴趣。然而,在SPROC的情况下,这是有道理的。
你最好打的是log this as an issue on the project site,所以我们可以跟踪/优先化它。这听起来像是可行的,但可能类似于DbString或DynamicParameters选项。
但今天?号码
更正,我们有点支持它......你只需要自己编码:) – 2011-06-06 00:33:32
是的,我们支持他们,但你需要编写你自己的助手。
例如:
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");
}
}
确保正确测试表值PARAMS性能。当我测试这个传递int列表时,它显着比传入多个参数慢。
我完全不反对在contrib项目中使用一些SQL Server特定的辅助工具,但是核心工具可以避免在可能的情况下添加供应商特定的技巧。
事实上,使用TVP比“哪里有@values”慢。如何使用列表支持功能(Dapper允许您传入IEnumerable
这是批处理比sps更快的疯狂边缘情况之一快速清单技术用于列表支持的技术与存储的procs不兼容 – 2011-07-06 21:49:31
你能否更新?我无法弄清楚在较新版本的Dapper中忽略身份参数是否可行。 – Crisfole 2014-07-07 14:17:50
我知道这张票是旧的,很旧,但想让你知道我已经发布了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();
它是在原有基础上,从类小巧玲珑的测试项目。
享受!
- 1. Dapper是否支持枚举?
- 2. EntityFrameWork和TableValued参数
- 3. log4net AdoNetAppender是否支持sql server 2008?
- 4. 是否IBM WebSphere支持SQL Server 2008的
- 5. java是否支持参数?
- 6. VS 2013 SQL Server数据工具是否支持SQL Server 2008 R2?
- 7. sql 2008支持SqlCacheDependency?
- 8. SQLMetal是否支持SQL-Server 2008数据类型?
- 9. SSRS 2008是否支持SQL查询中的XML数据类型?
- 10. Azure SQL是否支持Kerberos?
- 11. Windows Server 2008是否支持.net 1.1
- 12. 支持SQL Server 2005和2008
- 13. Oracle SQL是否支持系统函数中的输出参数?
- 14. mysqli是否支持ms sql?
- 15. XAMPP是否支持SQL Server?
- 16. ORMLITE是否支持SQL EXISTS?
- 17. Slapper&Dapper字典支持
- 18. Visual Studio 2008 Express是否支持t4?
- 19. Windows Server 2008是否支持MSDE?
- 20. GWT链接器是否支持参数?
- 21. Swagger 2.0是否支持矩阵参数?
- 22. MATLAB是否支持命名参数?
- 23. Coldfusion是否支持动态参数?
- 24. C#是否支持inout参数?
- 25. Java是否支持默认参数值?
- 26. SQL Server是否支持分片?
- 27. SQL Server 2008标准版是否支持嵌套事务?
- 28. SQL 2008 Express是否支持更改追踪
- 29. SQL Server 2008是否支持CREATE ASSERTION语法?
- 30. jOOQ是否支持链接的SQL Server?
或者,你可以使用bulkinsert到临时表http://stackoverflow.com/a/9947259/37055 – 2015-02-26 17:10:54