2

IQ の Direct Interface を使用して、Oracle データベースから問題なく行をクエリできますが、単純な更新に問題があります。何か間違ったことをしているのか、それとも IQ が特定の Oracle テーブルを処理できないのかを知りたいです。

私のテーブルには NUMBER(22) の主キーがあり、エンティティの Int64 になります。クエリには 2 つの数値列があり、更新する列はエンティティの文字列である 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() で失敗します。(_InvokeMethodFast で) TargetInvocationException があります。内部例外は...

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 のすべての null 許容 long フィールドを 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

同様のエラーが発生しました。私が見つけたすべてのことから、null可能な外部キーに関するIQドライバーのエラーのように見えます。

詳細: http://forum.linqpad.net/discussion/225/nullable-foreign-key-bug-in-iq-driver

残念ながら、linqPad ソリューションを放棄する以外に、このエラーを回避する方法がわかりません。

于 2013-08-27T13:37:26.370 に答える