【问题标题】:LINQ to SQL with Extra Nullable Columns具有额外可空列的 LINQ to SQL
【发布时间】:2016-08-03 21:59:47
【问题描述】:

我们有一个名为 Data Grid 的数据绑定数据网格,用于显示产品的使用量。

顾名思义,它有一个额外的列来指定调整这个数量的数量。

定义绑定源的 LINQ to SQL 是

public BindingList<MeterRead> QryMeterRead
{
    get
    {
        var list = new BindingList<MeterRead>();
        list.AllowNew = false;
        list.AllowRemove = false;
        var records = ExecuteQuery<MeterRead>(
            @"select
                mr.meter_rd_id,
                mr.meter_id,
                mr.read_dt,
                mr.prev_dt,
                mr.reading,
                mr.demand_reading,
                mr.usage,
                mr.orig_usage,
                mr.prev_usage,
                mr.estimated,
                mr.kvar_reading,
                mr.change_out_from_id,
                mr.multi_mtr_est,
                adjust_dt = convert(datetime, null),
                usage_adjust = convert(integer, null),
                measure_id = convert(integer, null),
                mr.location_id,
                'customer_id' = {0},
                'group_id' = {1}
            from ub_meter_read mr (nolock) 
            where mr.meter_id = {2}
            order by meter_rd_id desc", usageparams.read_customer_id, usageparams.read_group_id, usageparams.read_meter_id);
        if (records != null)
        {
            foreach (MeterRead rec in records)
            {
                list.Add(rec);
            }
        }
        return list;
    }
}

其中adjust_dtusage_adjustmeasure_id 是添加字段。它们不存在于表中,但用于允许数据调整。

在我们表单的数据网格上,可以在单击“保存”按钮时对数据进行更改以进行提交。

对表单进行一些更改,例如更改数字 usage_adjust 值,然后底层 LINQ 数据源会获取这些更改。

一切都好。

如果有人(比如测试部门的人)决定通过删除 usage_adjust 值来移除这些更改,则 LINQ 似乎正在尝试绑定它们 - 为数据网格引发误导性的空引用错误。

我猜其他人已经遇到过这种情况,但我不知道该怎么称呼它或如何搜索这种类型的错误条件。

有人知道解决这类问题的好方法吗?

【问题讨论】:

  • LINQ 查询在哪里?

标签: c# linq


【解决方案1】:

目前,将usage_adjust 默认值设置为0 已停止错误。

const string sqlfrmt = 
    @"select
        mr.meter_rd_id,
        mr.meter_id,
        mr.read_dt,
        mr.prev_dt,
        mr.reading,
        mr.demand_reading,
        mr.usage,
        mr.orig_usage,
        mr.prev_usage,
        mr.estimated,
        mr.kvar_reading,
        mr.change_out_from_id,
        mr.multi_mtr_est,
        adjust_dt = convert(datetime, null),
        usage_adjust = convert(integer, 0),
        measure_id = convert(integer, null),
        mr.location_id,
        'customer_id' = {0},
        'group_id' = {1}
    from ub_meter_read mr (nolock) 
    where mr.meter_id = {2}
    order by meter_rd_id desc";

现在,数据网格不再是空白,而是在其中包含 0,并且我在更新例程中提供了代码以跳过带有 0 调整的字段。

partial void UpdateMeterRead(MeterRead instance)
{
    try
    {
        if (instance.usage_adjust != 0)
        {
            sp_ub_adjust_usage(instance.location_id, instance.meter_id, instance.group_id, instance.adjust_dt, instance.usage_adjust,
                instance.meter_rd_id, instance.measure_id, instance.customer_id, BaseContext.CurrentSpid);
        }
    }
    catch (Exception err)
    {
        Console.WriteLine(err);
    }
}

如果有人在接下来的一两个月内提出解决此问题的解释,我会接受他们的回答。

我以后编辑文件的路径:

Drive:\ICIS_7V04T52\in\Main\in\o\in.o.ub\am\Readings\ua\DataDB\uaDB.cs

【讨论】:

  • 您既没有使用 LINQ 也没有使用参数化查询。您的代码只是从数据中生成一个 SQL 字符串,从而使您面临 SQL 注入攻击、格式化问题(如您所见)等。NOLOCK 提示还意味着您有锁定问题,您(错误地)认为它们会得到解决通过读取脏数据。
  • 实际的 LINQ 查询看起来像 list = myDbContext.MeterReads.Where(x=&gt;x.meter_id = someValue).OrderBy(x=&gt;x.meter_rd_id).Select(...).ToList() 或查询形式 from x in myDbContext.MeterReads where x.meter_id =someValue ... 中的等价物
  • 这不是我写的,@PanagiotisKanavos。我不是数据绑定的忠实粉丝。此代码是 VS 中 LINQ to SQL 类的一部分。由于数据集包含数据表中不存在的列,因此它是在代码隐藏中手动创建的。再说一次,我没有写。参数不是从表单域中提取的。如果有更好的方式来表达我在做什么,请详细说明。
  • 这就是重点 - 这不是 LINQ to SQL 代码,它是普通的旧 ADO.NET 代码,只是碰巧调用 L2S 上下文中的方法来执行,而不是直接使用 SqlCommand。我已经在评论中提供了等效的 LINQ 查询。 L2S 将接受查询并生成参数化 SQL 语句,使 Where x.meter_id = someValue 变为 WHERE x.meter_id = @P1,使用 SqlCommand 执行它并将 ID 作为值传递给 @P1 参数。
  • @PanagiotisKanavos - 如何使用您的查询插入附加列? adjust_dtusage_adjustmeasure_id是数据表中不存在的新增字段。
猜你喜欢
  • 2012-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-01
相关资源
最近更新 更多