매개 변수를 수정해야하는 매개 변수화 된 쿼리 mySQL

asp.net c# dapper mysql sql

문제

자기 참조 테이블에서 빵 부스러기를 만들려고합니다. 쿼리는 MySQL Workbench에서 완벽하게 작동하지만 애플리케이션에서 실행하면 쿼리가 실패합니다.

Unhandled Exception: MySql.Data.MySqlClient.MySqlException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ':= Parent
                    FROM
                            Codebook
                    WHERE
                            id = _id
    ) as ParentId,
' at line 6

내 서버 버전 (Percona Server (GPL), 릴리스 rel30.2, 개정판 38.2)의 올바른 구문을 찾았습니다. GoDaddy에서 DB를 호스팅하고 있습니다. 쿼리는 다음과 같습니다.

var query = @"SELECT T2.* FROM (
SELECT
    @r as _id,
    (
        SELECT 
            @r := Parent
        FROM
            Codebook
        WHERE 
            id = _id
    ) as ParentId,
    @l := @l + 1 as lvl
FROM
    Codebook
WHERE
    @r <> 0
) T1
JOIN Codebook T2
ON T1._id = T2.Id
ORDER BY T1.lvl DESC";
        return Query(query, new
        {
            r = childId,
            l = 0
        });

Where Query(query 웹 사이트의 appsettings에 저장된 연결 문자열을 사용하는 dapper의 래퍼 메소드입니다.

내가 도대체 ​​뭘 잘못하고있는 겁니까? 어쨌든 더 잘할 수 있습니까?

수락 된 답변

Dapper 매개 변수와 MySQL 사용자 변수에 고유 한 이름 사용

당신은 dapper 매개 변수 인 @l@rMySQL 사용자 변수 @l@r 대해서 같은 구문을 사용하고 있습니다. Dapper는 모든 경우의 변수를 해결하여 무의미한 표현을 유발합니다 ...

  • 0 := 0 + 1 as lvl @l 대해 0 := 0 + 1 as lvl
  • childId := Parent @r childId := Parent

... 그리고 따라서 MySQLException.

이 문제를 해결하려면 MySQL 사용자 변수의 이름을이 쿼리의 Dapper 매개 변수와 일치하지 않는 값으로 변경하십시오.

로컬 환경에서이 MySQLException을 재현 할 수 있었고 사용자 변수를 변경하면 문제가 해결되는지 확인할 수있었습니다.

MySQLException을 재현하려면 다음을 수행 하십시오. @l .

    private int givenSameNames_ExpectMySQLException(IDbConnection conn)
    {
        return conn.Query<int>("SELECT @l := @l + 1", new
        {
            l = 1
        }).FirstOrDefault();
    }

좋은 결과를 @test 려면 @l 이름을 @test 와 같이 @test .

    private int givenDifferentNames_ExpectSuccess(IDbConnection conn)
    {
        return conn.Query<int>("SELECT @test := @l + 1", new
        {
            l = 1
        }).FirstOrDefault();
    } 

@l@r 모두에 대해 이렇게하십시오. - dapper 매개 변수와 사용자 변수는 별개의 이름을 필요로합니다.

MySQL 연결 문자열에서 Allow User Variables=True 설정

MySQL 커넥터와 함께 사용중인 MySQL 연결 문자열에 Allow User Variables=True 를 포함시킵니다. 이름 지정 문제를 해결 한 후에 MySQL 사용자 변수를 정의해야한다는 오류가 표시되면이를 확인하십시오. 기본적으로 false이며 사용자 변수가 참이 아닌 경우 쿼리에서 작동하지 않습니다.

더 읽을 거리



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow