Dapper : 프로 시저 또는 함수에 인수가 너무 많습니다.

.net dapper sql sql-server

문제

Dapper를 사용하여 저장 프로 시저를 호출하는 동안 다음 오류가 발생합니다.

Procedure or function has too many arguments specified

DynamicParameters를 사용하여 간단한 매개 변수 목록을 쿼리에 추가합니다.

매개 변수 코드는 다음과 같습니다.

var parameters = new DynamicParameters();
parameters.Add(p.Name, p.Value, direction: p.Mode);

쿼리 코드는 다음과 같습니다.

var result = _connection.Query<T>(
            string.Format("{0}.{1}", request.SchemaName, request.StoredProcedureName),
            parameters,
            commandType: CommandType.StoredProcedure,
            transaction: _transaction);

프로파일 러에서 실행중인 SQL은 다음과 같이 표시됩니다.

exec dbo.storedProcedureName @ParameterNames1=N'ParameterName',@ParameterNames2=N'ParameterName',@RemoveUnused=1

@ ParameterNames1은 매개 변수가 호출되는 방식과 전혀 다릅니다. 실제로 이름은 값 (N'ParameterName ')으로 전달됩니다. @RemoveUnused 매개 변수는 호출 코드에서 전혀 나타나지 않기 때문에 완전히 무작위로 보입니다.

이에 대한 전체 코드는 GitHub 프로젝트 의 61 행과 228 행에 있습니다.

편집 : 다른 결과 집합을 두 번 같은 프로 시저를 호출하여 문제가 발생한 것으로 나타났습니다. 그래서 Query로 처음으로 Query를 호출했을 때, Query와 두 번째입니다. Dapper가이 시나리오에 문제가있는 이유는 여전히 수수께끼입니다.

전문가 답변

나는 이것을 단순히 재현 할 수 없다 :

public void SO25069578_DynamicParams_Procs()
{
    var parameters = new DynamicParameters();
    parameters.Add("foo", "bar");
    try { connection.Execute("drop proc SO25069578"); } catch { }
    connection.Execute("create proc SO25069578 @foo nvarchar(max) as select @foo as [X]");
    var tran = connection.BeginTransaction(); // gist used transaction; behaves the same either way, though
    var row = connection.Query<HazX>("SO25069578", parameters,
        commandType: CommandType.StoredProcedure, transaction: tran).Single();
    tran.Rollback();
    row.X.IsEqualTo("bar");
}
public class HazX
{
    public string X { get; set; }
}

잘 작동합니다. 있다 RemoveUnused 에 속성 DynamicParameters 비트는 : 동적 파라미터를 사용하는 경우, 그 첨가되지 않아야한다. 심지어 템플릿 기반 생성자를 사용하여 시도했다 :

parameters = new DynamicParameters(parameters);

그러나 다시 : 이것은 잘 작동합니다. 정말로 오래된 버전의 dapper를 사용하고있을 가능성이 있습니까? 어떤 버전을 사용하고 있습니까?


인기 답변

나는 최근에이 문제를 보았고 이것은 다음에 의해 야기 된 것 같습니다 :

  • 저장 프로시 저는 여러 데이터 세트를 반환 할 수 있습니다 (어쩌면 조건 매개 변수를 기반으로 함).
  • QueryMultiple() 대신 Query<T>() 를 사용하여 저장 프로 시저를 호출 한 다음 Read<T> 를 통해 데이터 집합을 매핑합니다.

최근 테이블 변수 매개 변수를 지원하기 위해 Dapper의 이전 버전을 v1.4로 업그레이드했으며 업그레이드의 직접적인 결과로이 동작을 경험하기 시작했습니다.

해결책:

Query<T> 기반 코드를 QueryMultiple 구현으로 변환하십시오.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.