Dapper는 SQL 2008 테이블 반환 매개 변수를 지원합니까?
Dapper를 사용하여 테이블 반환 매개 변수 데이터를 저장 프로 시저 에 전달할 수 있는지 아는 사람이 있습니까?
이제 dapper에 구워진 테이블 값 매개 변수에 대한 직접 지원 (Dapper 1.26 이상)이 있습니다. 저장 프로 시저의 경우 데이터 유형이 sproc 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 }, ...);
이들 중 어느 것이 든 잘 작동합니다.
예, 우리는 그들을 지원하지만 여러분은 자신의 도우미를 코딩해야합니다.
예를 들면 :
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");
}
}
Make sure you properly test performance for table valued params. When I tested this for passing int lists it was significantly slower than passing in multiple params.
I am totally not against having some SQL Server specific helpers for dapper in the contrib project, however the core dapper avoids adding vendor specific tricks where possible.
I know this ticket is OLD, very old, but wanted to let you know that I have published Dapper.Microsoft.Sql package, which supports generic TVPs.
https://www.nuget.org/packages/Dapper.Microsoft.Sql/
Sample use:
List<char> nums = this.connection.Query<char>(
"get_ints",
new TableValuedParameter<char>(
"@ints", "int_list_Type", new[] { 'A', 'B', 'C' })).ToList();
It is based on the original classes from Dapper test project.
Enjoy!
today it isn't. We actually investigated table-valed-parameters for our cheeky "in" implementation (where col in @values
), but were very unimpressed by performance. However in the context of a SPROC it makes sense.
Your best bet is to log this as an issue on the project site so we can track/prioritise it. It sounds like something will be doable, though, probably similar to the DbString or DynamicParameters options.
But today? No.
참고URL : https://stackoverflow.com/questions/6232978/does-dapper-support-sql-2008-table-valued-parameters
'developer tip' 카테고리의 다른 글
뒤로 대신 도구 모음의 재질 "닫기"버튼 (0) | 2020.10.19 |
---|---|
SQL Developer에서 저장 프로 시저를 실행 하시겠습니까? (0) | 2020.10.19 |
string :: npos는 무엇을 의미합니까? (0) | 2020.10.18 |
jquery는로드 될 때 iframe 콘텐츠의 높이를 가져옵니다. (0) | 2020.10.18 |
RecyclerView에서 데이터 새로 고침 및 스크롤 위치 유지 (0) | 2020.10.18 |