2

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

我的表有一个主键 NUMBER(22),这导致实体的 Int64。该查询有两个数字列,我正在更新的列是一个 CHAR,它是实体中的一个字符串。

这是我的更新...

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()
4

2 回答 2

3

我在删除行时遇到了同样的问题。我通过将所有值为 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);
            }
        }
    }
}
于 2013-09-06T10:10:24.013 回答
1

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

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

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

于 2013-08-27T13:37:26.370 回答