Dapper에서 TVP와 un-tabled 매개 변수가있는 Exe sproc?

.net-core asp.net-core c# dapper

문제

sproc (우리는 usp_SaveQuestionAnswer 라고 부름 )을 가지고 있는데, 응용 프로그램의 주어진 질문에 신청자의 대답을 삽입 / 업데이트합니다. 다음과 비슷한 매개 변수가 필요합니다.

@answeredQuestionGuid UNIQUEIDENTIFIER,
@questionGuid UNIQUEIDENTIFIER,
@applicationId INT,
@applicantID INT,
@answerData tvp_AnswerData READONLY

그리고 tvp_AnswerData는 다음과 같이 정의됩니다 :

answerGuid UNIQUEIDENTIFIER,
answerTypeId INT,
answerValue VARCHAR(300),
answerBoolValue BIT

sproc은 매개 변수를 취하고 문자열 형식으로 오류를 반환하거나 데이터가 유효하지 않은 형식 (잘못된 형식, null이 아닌 등)을 반환하거나 전혀 반환하지 않습니다.

(에 따라이 수행하는 방법에 대한 분명한 답 DynamicParameters가 tvp_AnswerData에 대한 객체를 구축 한 다음 두 번째 DynamicParameters 전체 목록 (dynamicParamsObject라고 함) 객체 - 닷넷 코어 DataTables를 지원하지 않기 때문에), DynamicParameters 것 매개 변수를 가져 와서 tvp_AnswerData DynamicParameters 객체를 전달한 다음 sproc을 다음과 같이 실행합니다.

var result = _db.Query
(
    "usp_SaveQuestionAnswer",
    dynamicParamsObject,
    commandType: CommandType.StoredProcedure
);

불행히도, DynamicParameters는 내가 알 수있는 한 DynamicParameters 유형의 매개 변수를 처리하는 방법을 알지 못합니다.

내가 잘못 했니? Dapper가 TVP를 다른 매개 변수와 함께 sproc과 함께 처리 할 수있는 방법이 있습니까? 아니면 sql 명령을 그대로 쓰거나 DB 재 작성 또는 Dapper 이외의 다른 방법 (SqlCommand 같은)을 사용하는 옵션이 있습니까?

인기 답변

그것은 꽤 아니지만 가능합니다. 아래는 내가 가지고있는 임의 발췌 문장의 예입니다.

CREATE TYPE [dbo].[DeptType] AS TABLE(
    [DeptId] [int] NULL,
    [DeptName] [varchar](100) NULL
)
GO

CREATE PROCEDURE [dbo].[InsertDepartment]
@InsertDept_TVP DeptType READONLY
AS
INSERT INTO Department(DepartmentID,DepartmentName)
SELECT * FROM @InsertDept_TVP;
GO

[Test]
public void Test()
{
    var conn = new SqlConnection(@"Data Source=.\sqlexpress;Integrated Security=true; Initial Catalog=foo");
    conn.Open();

    var x = new DataTable();
    x.SetTypeName("DeptType");
    x.Columns.Add("DeptId", typeof(int));
    x.Columns.Add("DeptName", typeof(string));

    var row = x.NewRow();
    row["DeptId"] = 1;
    row["DeptName"] = "Foo";
    x.Rows.Add(row);

    var row2 = x.NewRow();
    row2["DeptId"] = 2;
    row2["DeptName"] = "Bar";
    x.Rows.Add(row2);

    conn.Execute("InsertDepartment", new { InsertDept_TVP = x.AsTableValuedParameter("DeptType") }, commandType: CommandType.StoredProcedure);
}


아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow