Dapper의 execute 메소드는 삽입과 삭제에 대해 서로 다른 두 가지 결과를 반환합니다.

c# dapper sql

문제

INSERT 저장 프로 시저에 대해 Dapper의 Execute 메서드를 사용할 때 쿼리가 성공적으로 작동하면 예상대로 1 을 반환하지만 저장 프로 시저를 DELETE 하는 경우 -1 을 반환해도 쿼리가 성공적으로 반환됩니다. 이 경우, DELETE 저장 프로시 듀어에 대한 성공은 "-1"입니까?

 public override int Insert(Language entity)
        {
            var parameters = new DynamicParameters();
            parameters.Add("Id", dbType: DbType.Int32, direction: ParameterDirection.Output);
            parameters.Add("Name", entity.Name, DbType.String);
            parameters.Add("Culture", entity.Culture, DbType.String);
            parameters.Add("Published", entity.Published, DbType.Boolean);
            parameters.Add("DisplayOrder", entity.DisplayOrder, DbType.Int32);
            int numberOfRowsAffected = Connection.Execute("Language_Insert", 
                parameters, commandType: CommandType.StoredProcedure);
            // numberOfRowsAffected = 1
            return parameters.Get<int>("Id");
        }

 public override bool Delete(int primaryKey)
        {
            var parameters = new DynamicParameters();
            parameters.Add("Id", primaryKey, DbType.Int32);
            int numberOfRowsAffected = Connection.Execute("Language_Delete",
                parameters, commandType: CommandType.StoredProcedure);
            // numberOfRowsAffected = -1
            return numberOfRowsAffected > 0;
        }

수락 된 답변

Dapper는 저장 프로 시저 내부를 볼 수 없습니다. 이 두 경우에서 다른 것은 모두 두 명령의 내부에만 해당됩니다. 궁극적으로, dapper는 ExecuteCommand 에서 값을 반환하고 있습니다.

차이를 유발할 수있는 몇 가지 사항이 있습니다.

  • SET NOCOUNT ON
  • TRIGGER ( CASCADE , SET NULL 등 제약 조건 / 외래 키 절 포함)
  • INSERT / DELETE 후 추가 작업

이 유형의 연산에서 신뢰할 수있는 값을 원하면 @@ROWCOUNT 를 통해 설정하는 대신 OUTPUT 또는 RETURN 매개 변수를 사용해야합니다.


인기 답변

이런 식으로 코드를 구조화 할 수 있습니다.

public override bool Delete(int primaryKey)
    {
        var parameters = new DynamicParameters();
        parameters.Add("Id", primaryKey, DbType.Int32);
        parameters.Add("@b", dbType: DbType.Int32, direction: ParameterDirection.Output);
        parameters.Add("@c", dbType: DbType.Int32, direction: ParameterDirection.ReturnValue);
        Connection.Execute("Language_Delete",
            parameters, commandType: CommandType.StoredProcedure);

        int b = parameters.Get<int>("@b");
        // Output
        int c = parameters.Get<int>("@c");
        // ReturnValue



    }


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