Tinyint는 C #의 부울 필드와 매핑 됨

c# dapper mysql

문제

나는 'tinyint'를 'boolean'필드와 매핑하려고하는데, 그 아래에 문제가있다. 이 문제는 라이브 데이터베이스가 작동하는 경우에만 로컬 데이터베이스로 전달됩니다. 문제가 어디에 있는지, 지역 문제인지 이해할 수 없습니다. 매핑 목적으로 dapper를 사용하고 있습니다. 당신이 어떤 아이디어가 있다면 저를 도와주세요, 아래 복사 예외입니다.

DAL.dll에서 'System.Data.DataException'형식의 첫 번째 예외가 발생했습니다. 추가 정보 : 열 15 구문 분석 오류 (IsBold = 1 - SByte).

전문가 답변

흠, 그건 버그 같아. 우리는 많은 유사한 전환을 처리합니다.

원시 IL ( OpCodes.Conv_Ovf_I4 사용)은 로컬 테스트에서 잘 작동합니다. 내가 mysql을 로컬로 가지고 있지 않기 때문에 나는 약간 방해를 받는다. 그리고 내가 하는 모든 서버에는 오직 unsigned tinyint 만있다. 여기에 내면의 예외가 있습니까? 아니면 내가 할 수있는 다른 것입니까? 하지만 이것은 github 문제 목록에 대한 질문 일 것입니다.


전문가 답변

MySql 커뮤니티 에디션 ( @@version reports 5.7.11-log )을 설치했습니다. 다음은 1.50-beta9에서 잘 작동합니다.

[FactMySql]
public void SO36303462_Tinyint_Bools()
{
    using (var conn = GetMySqlConnection(true, true, true))
    {
        try { conn.Execute("drop table SO36303462_Test"); } catch { }
        conn.Execute("create table SO36303462_Test (Id int not null, IsBold tinyint not null);");
        conn.Execute("insert SO36303462_Test (Id, IsBold) values (1,1);");
        conn.Execute("insert SO36303462_Test (Id, IsBold) values (2,0);");
        conn.Execute("insert SO36303462_Test (Id, IsBold) values (3,1);");

        var rows = conn.Query<SO36303462>("select * from SO36303462_Test").ToDictionary(x => x.Id);
        rows.Count.IsEqualTo(3);
        rows[1].IsBold.IsTrue();
        rows[2].IsBold.IsFalse();
        rows[3].IsBold.IsTrue();
    }
}
class SO36303462
{
    public int Id { get; set; }
    public bool IsBold { get; set; }
}

1.50-beta9를 사용해보십시오. 그래도 문제가 해결되지 않으면 실패한 테스트를 재현 해주세요.


인기 답변

다음과 같이 tinyint 데이터 유형을 빠르게 확장 할 수 있습니다.

public static class IntExtensions
{
   public static bool AsBool(this int value)
  {
     return value != 0;
  }
}

그런 다음 코드에서 다음과 같이이 코드를 사용할 수 있습니다.

IsBold == 1.AsBool()


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