【问题标题】:Tinyint mapped with boolean fields in C#Tinyint 在 C# 中用布尔字段映射
【发布时间】:2016-03-30 08:28:03
【问题描述】:

我正在尝试将 'tinyint' 映射到 'boolean' 字段,但它给了我以下问题。此问题仅与本地数据库一起出现,实时数据库工作正常。我不明白问题出在哪里,可能是它的地区问题。我正在使用 dapper 进行映射。 如果您有任何想法,请帮助我,以下是复制的异常。

发生“System.Data.DataException”类型的第一次机会异常 在 DAL.dll 中附加信息:解析第 15 列时出错(IsBold=1 - 字节)。

【问题讨论】:

  • 你能提供一些代码吗?
  • 我不了解 dapper,但您可能想在这里查看最后一个答案:TreatTinyAsBoolean:stackoverflow.com/questions/9728994/…
  • Boolean 映射到 C# 中的 Bit 类型和 Tiny Int 到 Byte,为什么不使用正确的映射,它会轻而易举,没有灰色区域
  • 嗯...查看代码,在这种情况下应该使用OpCodes.Conv_Ovf_I4 转换。让我检查一下这是否有效......
  • 我也尝试过 Bit 使用布尔值进行映射,但它不起作用。 @MrinalKamboj

标签: c# mysql dapper


【解决方案1】:

嗯,这听起来像一个错误。我们处理许多类似的转化。

原始IL(使用OpCodes.Conv_Ovf_I4)在本地测试中运行良好;我在这里有点受阻,因为我在本地没有 mysql,而我 拥有 的所有服务器:只有 unsigned tinyint。这里有任何内部异常,还是我可以使用的其他东西?但是:这可能是github issues list 的问题。

【讨论】:

  • 我在下面的语句中使用了 (OpCodes.Conv_Ovf_I4) 但没有工作,抛出异常“公共语言运行时检测到无效程序” il.BeginCatchBlock(typeof(Exception)); il.Emit(OpCodes.Ldloc_0); il.Emit(OpCodes.Ldarg_0); il.EmitCall(OpCodes.Call, typeof(SqlMapper).GetMethod("ThrowDataException"), null); il.Emit(OpCodes.Ldnull); il.Emit(OpCodes.Stloc_1); il.Emit(OpCodes.Conv_Ovf_I4); il.EndExceptionBlock();
【解决方案2】:

您可以像这样对数据类型 tinyint 进行快速扩展:

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

然后您可以在代码中的任何位置使用它:

IsBold == 1.AsBool()

【讨论】:

  • 感谢您的快速响应,但当 dapper 尝试使用类属性映射表字段时,问题就来了。
【解决方案3】:

我已经安装了 MySql 社区版(@@version 报告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。如果这不能解决问题,请帮助我重现失败的测试。

【讨论】:

  • 我什至尝试过使用IsBold tinyint signed not null - 它仍然可以正常工作
  • 你是对的 Marc Gravell,我也改变了数据类型,它工作正常。
  • @GurpreetSingh 所以......还有其他问题吗?还是它只是自行修复?还是 1.50-beta9 修复了它?
  • 什么都没有。问题已修复。
  • 当使用“select *”与“select Id, IsBold”时,我看到了不同的行为 - 枚举列(就像在复杂连接中一样)似乎会导致 SByte 异常。
猜你喜欢
  • 2011-12-23
  • 1970-01-01
  • 2019-11-13
  • 2011-04-30
  • 2010-09-19
  • 2019-01-12
  • 1970-01-01
  • 2020-04-21
  • 1970-01-01
相关资源
最近更新 更多