Dapper QueryMultiple () 메서드는 postgreSQL에서 null을 반환합니다.

c# dapper

문제

그래서 Dapper micro-ORM 사용하여 웹 응용 프로그램에서 pl/pgSQL 함수를 실행하려고합니다. QueryMultiple 메서드에서 매개 변수로 전달하는 값과 관계없이 항상 null 값을 가져 QueryMultiple . 데이터베이스에서는 함수가 적절한 결과를 제공합니다.

DAL 방법 :

public List<JSONData> ExecutePostgres(string spName, List<QueryParam> Params)
    {
        List<JSONData> students = new List<JSONData>();

        using (var dbInstance = new NpgsqlConnection(postgreConnectionString))
        {
            using (var reader = dbInstance.QueryMultiple(spName, new { std_id = Params[0].value }, commandType: CommandType.StoredProcedure))
            {
                students = reader.Read<JSONData>().ToList();
            }
        }

        return students;
    }

구현 방법 :

public List<string> ExecuteProcedure(string spName, List<QueryParam> Params)
    {
        var list = objDLOperation.ExecutePostgres(spName, Params);
        var strList = new List<string>();

        list.ForEach(x => strList.Add(x.JSONResult));

        return strList;

    }

strList 는 항상 null 값 목록입니다.

엔티티 클래스 :

    public class JSONData
    {
      public string JSONResult { get; set; }
    }

pl / pgSQL 함수 :

CREATE OR REPLACE FUNCTION public.usp_getstudent(std_id integer)
RETURNS SETOF json 
AS $function$

BEGIN
RETURN QUERY
select row_to_json(result) from (select * from student where id = std_id) as result;
END  

$function$ LANGUAGE 'plpgsql';

수락 된 답변

귀하의 항목 이름이 result 로 표시되거나 익명으로 표시되지만 현지 유형에 JSONResult 라는 속성이 JSONResult . Dapper는 이름에 대해 까다 롭습니다. 이름을 일치 시키면 제대로 작동합니다. 그러나, 솔직히 :

  • <string> 만 사용하면 (이는 또한 이름 지정 문제를 무시합니다. 즉, 단일 열 가져 오기의 이름은 dapper가 신경 쓰지 않습니다)
  • 한 표를 반환하는 경우 QueryMultiple 사용할 필요가 없습니다. 단지 Query<T>

아주 작은 점 : .AsList().ToList() 보다 더 효율적 .ToList() 추가 복사는 없습니다.

개인적으로 "JSON이 아닌 형식의 열 반환"이라고 말하고 싶지만, 그건 당신에게 달려 있습니다.



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