sourcecode

C#의 Dapper와 Heidi의 Stored Procedure를 사용하면 null 값을 얻습니다.

codebag 2023. 8. 31. 23:52
반응형

C#의 Dapper와 Heidi의 Stored Procedure를 사용하면 null 값을 얻습니다.

저는 이 일에 익숙하지 않아서, 아마도 당신에게는 문제가 꽤 분명할지 모르지만, 저에게는 시간이 많이 걸리는 시도였습니다.저는 C#에 주차 프로그램을 구축하고 있으며, 하이디를 통해 관리하는 마리아DB 데이터베이스를 조회하기 위해 대퍼를 사용하고 있습니다.VS2022, C# v.11, Net 6.0, MariaDB V.1O.11 및 Dapper 2.0을 사용하고 있습니다.

문제는 Dapper의 Dynamic Parameters를 사용하여 데이터베이스에서 클래스로 값을 검색하려고 하면 null을 반환한다는 것입니다.개체를 데이터베이스에 저장할 수는 있지만 검색할 수는 없습니다. 연결이 성공적으로 이루어졌기 때문에 쿼리나 저장 프로시저에 문제가 있는 것 같습니다.

저장 프로시저는 ID와 같은 역할을 하는 문자열("folio")을 수신하고 테이블에서 "folio"와 일치하는 두 개의 값("estatus"는 문자열이고 "horaEntrada"는 날짜 시간)을 반환해야 합니다.즉, "Folio" 열에서 "folio"와 일치하는 값을 찾고 "Estatus" 및 "HoraEntrada" 열 아래에 있는 값을 반환하고 각각 "estatus" 및 "horaEntrada"에 할당해야 합니다.

이것은 제 코드입니다(제 질문과 관련이 없는 모든 코드를 제거했습니다).여기서는 "PorHoraModel"이라는 모델과 "spPorHoraFolio_Get"이라는 저장 프로시저를 사용합니다.변수 "빌더"가 내 연결 문자열입니다.

public static PorHoraModel GetFolio(PorHoraModel modelo)
        {
            var builder = MariaDBConnector();
            using (var connection = new MySqlConnection(builder))
            {
                connection.Open();

                var p = new DynamicParameters();
                p.Add("@folio", modelo.Folio, DbType.String, ParameterDirection.Input);
                p.Add("@estatus", modelo.Status, DbType.String, ParameterDirection.Output);
                p.Add("@horaEntrada", modelo.HoraEntrada, DbType.DateTime, ParameterDirection.Output);

                modelo = connection.QueryFirstOrDefault<PorHoraModel>("spPorHoraFolio_Get", p, commandType: CommandType.StoredProcedure);

                connection.Close();

                return modelo;
            }
        }

이것은 "listadoporhora" 데이터베이스를 사용하여 "Folio" 열(검색 매개 변수), "Estatus" 열(출력 매개 변수) 및 "HoraEntrada" 열(출력 매개 변수)에서 값을 가져오는 저장 프로시저("spPorHoraFolio_Get")입니다.

CREATE DEFINER=`root`@`localhost` PROCEDURE `spPorHoraFolio_Get`(
    IN `folio` VARCHAR(14),
    OUT `estatus` VARCHAR(5),
    OUT `horaEntrada` DATETIME
)
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
BEGIN

SELECT Folio, Estatus, HoraEntrada 
FROM listadoporhora
WHERE (Folio = folio);

END

도움을 주셔서 미리 감사드립니다!

다음을 사용 중입니다.QueryFirstOrDefault단일 행을 반환하도록 설계된 메서드입니다.그러나 저장 프로시저는 의도적으로 하나의 행으로 제한되지 않으므로 다음을 사용해 보십시오.Query()여러 행을 허용하기 때문에 대신 방법을 참조하십시오.

public static PorHoraModel GetFolio(PorHoraModel modelo)
{
    var builder = MariaDBConnector();
    using (var connection = new MySqlConnection(builder))
    {
        connection.Open();

        var p = new DynamicParameters();
        p.Add("@folio", modelo.Folio, DbType.String, ParameterDirection.Input);
        p.Add("@estatus", modelo.Status, DbType.String, ParameterDirection.Output);
        p.Add("@horaEntrada", modelo.HoraEntrada, DbType.DateTime, ParameterDirection.Output);

        var results = connection.Query<PorHoraModel>("spPorHoraFolio_Get", p, commandType: CommandType.StoredProcedure);

        if (results.Count > 0)
        {
            modelo = results.First();
        }

        connection.Close();

        return modelo;
    }
}

저장된 프로시저가 한 행만 반환할 것으로 예상되는 경우에는 해당 SQL을 다시 방문하여 해당 행이 참인지 확인해야 합니다.이 작업이 완료되면 다음을 사용할 수 있습니다.QueryFirstOrDefault방법.

예를 들어, 가장 최근의 데이터를 가져오려면 저장 프로시저를 수정하여 날짜 열을 기준으로 내림차순으로 결과를 정렬합니다.예:

SELECT col1, date_column FROM your_table
ORDER BY date_column DESC
LIMIT 1;

그런 다음 C# 코드에서 First() 대신 FirstOrDefault() 메서드를 사용할 수 있습니다. First() 메서드는 결과 집합이 비어 있으면 첫 번째 행(가장 최근 날짜) 또는 기본값을 반환합니다.

if (results.Count() > 0)
{
    modelo = results.FirstOrDefault();
}

사용해 보십시오.

var results = connection.Query<dynamic>("spPorHoraFolio_Get", p, commandType: CommandType.StoredProcedure);

foreach (var row in results)
{
    var fields = row as IDictionary<string, object>;
    var estatus = fields["estatus"];
    var horaEntrada = fields["horaEntrada"];
    // Process the values as needed
}

참조: Dapper에서 동적 값을 반환하는 방법

언급URL : https://stackoverflow.com/questions/76159520/using-dapper-in-c-sharp-and-heidi%c2%b4s-stored-procedure-i-get-a-null-value

반응형