【问题标题】:Cannot update a row using LINQPad 4无法使用 LINQPad 4 更新行
【发布时间】:2013-03-18 15:39:26
【问题描述】:

我可以使用 IQ 的直接接口从 Oracle 数据库中很好地查询行,但是在进行简单更新时遇到了麻烦。我想知道我是否做错了什么,或者 IQ 是否无法处理我的特定 Oracle 表。

我的表有一个主键 NUMBER(22),这导致实体的 Int64。查询有两个数值列,我更新的列是一个CHAR,是实体中的String。

这是我的更新...

var c = Components.Single (c => c.Componentordernumber == 119137 && c.Componentorderversion == 1);
c.Circuitordernumber = "11043913";
SubmitChanges();
Components.Where (c => c.Componentordernumber == 119137 && c.Componentorderversion == 1).Dump();

当我在 LINQPad 中运行它时,它在 SubmitChange() 处失败。有一个 TargetInvocationException(在 _InvokeMethodFast 处)。而内在的例外是......

InvalidOperationException - The binary operator Equal is not defined for the types 'System.Int64' and 'System.Object'.
TargetSite: Expression.GetEqualityComparisonOperator (ExpressionType binaryType, String opName, Expression left, Expression right, Boolean liftToNull)
Stacke Trace:
  at System.Linq.Expressions.Expression.GetEqualityComparisonOperator(ExpressionType binaryType, String opName, Expression left, Expression right, Boolean liftToNull)
  at System.Linq.Expressions.Expression.Equal(Expression left, Expression right)
  at IQToolkit.Data.EntityRef`1.QueryParent()
  at IQToolkit.Data.EntityRef`1.get_Value()

【问题讨论】:

    标签: c# linq oracle linq-to-sql linqpad


    【解决方案1】:

    我在删除行时遇到了同样的问题。我找到了一个解决方案,将所有值为 null 的可空长字段设置为非空值(例如 0L)。

    为了简化这一点,我编写了一个简短的扩展方法 PatchForDelete(见下文)并使用它:

    var testUsers = Users.Where (a => a.login.StartsWith("test")); 
    testUsers.Dump();
    
    foreach (var user in testUsers) {
        MyExtensions.PatchForDelete(user);  
        AsdBenutzers.DeleteOnSubmit(user);  
    }
    SubmitChanges();
    

    问候, 沃尔特

    //
    // Patch for Bug in IQ-Driver
    //
    // If each nullable long field which is null ist set to 0L
    // DeleteOnSubmit() works!!
    //
    public static void PatchForDelete(object entity) {
        var fields = entity.GetType().GetFields();
    
        foreach (var field in fields) {
            if (field.FieldType == typeof(long?)) {
                var v = field.GetValue(entity);             
                if (v == null) {
                    field.SetValue(entity, 0L);
                }
            }
        }
    }
    

    【讨论】:

    • 这是一种解决方法,但不幸的是,对我来说不是一个完整的解决方法,因为我公司的应用程序(可能还有许多其他应用程序)需要使用 NULL 值作为不同于 0 或 -1 的值。
    • 我能够成功更新一行,尽管我必须使用上面的补丁并将我的所有 null 设置为 long?列为 0。我还不得不使用 OCI 连接模式。另一个选项(“直接”)不起作用,因为它失败并出现以下错误:forum.linqpad.net/discussion/132/…
    【解决方案2】:

    我刚刚遇到了类似的错误。从我能发现的所有情况来看,它看起来像是 IQ 驱动程序中围绕可空外键的错误。

    更多详情:http://forum.linqpad.net/discussion/225/nullable-foreign-key-bug-in-iq-driver

    不幸的是,除了放弃 linqPad 解决方案之外,我不知道如何解决此错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-12
      • 1970-01-01
      • 2013-05-28
      • 2018-12-28
      • 2023-03-14
      • 1970-01-01
      • 2016-03-19
      • 1970-01-01
      相关资源
      最近更新 更多