【问题标题】:Bool & Bit Data Type, Exception Error When Updating & Saving Changes Into the Database布尔和位数据类型,更新和保存更改到数据库时出现异常错误
【发布时间】:2021-11-18 05:39:02
【问题描述】:

我有一个使用 Entity Framework Core 5.0 的 C#/WPF 项目。我在检索和保存更改具有布尔属性的记录时遇到问题。这些布尔值在 SQL Server 中保存为“位”数据类型。见下文:

    Order orderItem = new Order();                        
    orderItem.IsVATIncluded = true;
    orderItem.IsBubbleWrapUsed = false;
    
    using(var db = new MyAppDbContext())
    {
         db.Orders.Add(orderItem);
         db.SaveChanges();
    }

Order类的模型定义如下:

   public class Order
   {
        [Key]
        public int Id { get; set; }
        public bool IsVATIncluded { get; set; }
        public bool IsBubbleWrapUsed { get; set; }
   }

订单记录从数据库中读取到相应的数据网格,然后订单记录弹出到对话框中。

    private void ViewRecordButton_Click(object sender, RoutedEventArgs e)
    {
        Order orderRecord = (Order)OrderDataGrid.SelectedItem;
        OrderEntry dialog = new OrderEntry(_dbContext, orderRecord);
    }

这是 OrderEntry 的 XAML 代码:

    <CheckBox Content="Use Bubble Wrap" IsChecked="{Binding Path=OrderItem.IsBubbleWrapUsed}" />
    <CheckBox Content="VAT Included" IsChecked="{Binding Path=OrderItem.IsVATIncluded}" />

当单击 OrderEntry 对话框的 OK 按钮时,Order 记录中的更改将被持久化到数据库中。但是调用 SaveChanges() 时会弹出异常错误。

    private void btnOK_Click(object sender, RoutedEventArgs e)
    {
        _dbContext.Orders.Update(OrderItem);
        _dbContext.SaveChanges();
    }

异常错误信息如下:

传入的表格数据流 (TDS) 远程过程调用 (RPC) 协议流不正确。参数 4 ("@p0"):提供的值不是浮点数据类型的有效实例。检查源数据中的无效值。一个无效值的例子是小数位数大于精度的数值类型数据。

当订单记录的布尔属性未手动输入时,不会发生异常。也就是说,当用户通过对话框窗口的复选框更新这些布尔值时,当稍后检索记录、更新更改并保存到数据库中时,不会发生此类异常错误。但是,当像上面那样手动输入这些 bool 值时,就会弹出异常错误。

有什么问题?

【问题讨论】:

  • 它必须与 Add 操作相关,并且该属性中有 false 值。您是否为其配置了默认值(例如HasDefaultValueHasDefaultValueSql)?因为没有为创建命令发送此类属性(数字为零,布尔值为 false 等 - CLR 类型的默认值)存在一个已知问题。在启用敏感数据选项的情况下打开 EF Core 日志记录,并查看 EF Core 发出的INSERT 命令及其参数/值。

标签: c# sql-server entity-framework-core


【解决方案1】:

您的错误表明数据库需要一个浮点值,而不是布尔值。根据微软的布尔值应该被序列化为一个位值。

https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql-server-data-type-mappings

我建议您的基础数据库因此是错误的,您需要重建它,并将您的浮点列更改为“位”类型。

【讨论】:

    猜你喜欢
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-20
    • 1970-01-01
    • 2017-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多