有誰知道是否可以通過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