IT Share you

저장 프로 시저 (.net)의 테이블 값 매개 변수에 빈 목록 또는 null 값 바인딩

shareyou 2020. 12. 8. 20:26
반응형

저장 프로 시저 (.net)의 테이블 값 매개 변수에 빈 목록 또는 null 값 바인딩


int 유형의 단일 열이있는 테이블 인 테이블 값 매개 변수를 사용하는 저장 프로 시저를 만들었습니다. 아이디어는 단순히 ID 목록을 스토어 프로 시저에 전달하고 sp가 데이터를 처리하도록 허용하는 것입니다. 그러나 전달할 데이터가없는 경우 문제가 발생합니다 (데이터가 있으면 제대로 작동합니다). List를 IEnumerable로 변환하고 sp에 대한 테이블 값 매개 변수에 바인딩합니다. 빈 목록을 바인딩하려고 시도하여 오류가 발생했습니다.

System.ArgumentException : SqlDataRecord 열거 형에 레코드가 없습니다. 행이없는 테이블 반환 매개 변수를 보내려면 값에 대해 null 참조를 대신 사용하십시오.

그런 다음 null 값을 바인딩하려고 시도했지만 (위의 메시지가 얻는 것이라고 생각했습니다) 다른 오류 메시지 만 발생했습니다.

System.NotSupportedException : '@MainItemIdList'매개 변수에 대한 DBNull 값이 지원되지 않습니다. 테이블 반환 매개 변수는 DBNull 일 수 없습니다.

sp 선언에서 테이블 값 매개 변수를 nullable로 선언 할 수없는 것 같습니다. 빈 목록을 테이블 값 매개 변수에 바인딩하는 올바른 방법은 무엇입니까?


트릭은 매개 변수를 전혀 전달하지 않는 것 입니다. 테이블 반환 매개 변수의 기본값은 빈 테이블입니다.

예외 메시지가 그렇게 도움이되지 않는 것은 유감입니다.


값을 전달 하지 않으면 작동하지만 프로 시저에 전달할 여러 테이블 값 매개 변수가있는 경우 에는 작동하지 않습니다. 해결 방법은 DEFAULT쿼리 문자열에 값을 지정하는 것이 었습니다 . 예를 들면

string sqlQuery = "[dbo].[GetOrderData] @QueueId";

if (OrderIdList.Any())
{
    sqlQuery = sqlQuery + ", @OrderIdList";
}
else
{
    sqlQuery = sqlQuery + ", DEFAULT";
}

if (RegionIdList.Any())
{
    sqlQuery = sqlQuery + ", @RegionIdList";
}
else
{
    sqlQuery = sqlQuery + ", DEFAULT";
}

했네 http://www.sommarskog.se/arrays-in-sql-2008.html#Invoking 나는 이것에 대한 해결책을 발견했다.


'매개 변수를 전달하지 않음'문이 의미하는 바에 대해 약간 혼란 스러웠습니다. Entity Framework ExecuteSqlCommandAsync ()에서 작동하는 것은 다음과 같습니다.

  new SqlParameter("yourParameterName", SqlDbType.Structured)
  {
      Direction = ParameterDirection.Input,
      TypeName = "yourUdtType",
      Value = null
  };

이것은 매개 변수를 '기본값'으로 전달합니다.


빈을 전달할 때 오류가 발생 IEnumerable<int>하지만 List<int>대신 빈을 전달하면 제대로 작동합니다 .

참고 URL : https://stackoverflow.com/questions/3630632/binding-empty-list-or-null-value-to-table-valued-parameter-on-a-stored-procedure

반응형