2 votes

Ne peut pas mettre à jour une ligne en utilisant LINQPad 4

Je peux interroger les lignes d'une base de données Oracle avec l'interface directe d'IQ, mais j'ai des problèmes avec une simple mise à jour. J'aimerais savoir si je fais quelque chose de mal, ou si IQ ne peut pas gérer ma table Oracle particulière.

Ma table a une clé primaire de NUMBER(22), ce qui se traduit par Int64 pour l'entité. La requête a deux colonnes numériques, et la colonne que je mets à jour est de type CHAR, qui est une chaîne de caractères dans l'entité.

Voici ma mise à jour...

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

Quand je lance cela dans LINQPad, cela échoue à SubmitChange(). Il y a une TargetInvocationException (à _InvokeMethodFast). Et l'exception interne est...

InvalidOperationException - L'opérateur binaire Eq ual n'est pas défini pour les types 'System.Int64' et '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()

3voto

Walter Leinert Points 46

J'ai eu le même problème pour la suppression des lignes. J'ai trouvé une solution en définissant toutes les longues champs nullables avec la valeur null sur une valeur non nulle (par exemple 0L).

Pour simplifier cela, j'ai écrit une courte méthode d'extension PatchForDelete (voir ci-dessous) et l'ai utilisée ainsi :

var testUsers = Users.Where (a => a.login.StartsWith("test")); 
testUsers.Dump();

foreach (var user in testUsers) {
    MyExtensions.PatchForDelete(user);  
    AsdBenutzers.DeleteOnSubmit(user);  
}
SubmitChanges();

Cordialement, Walter

//
// Patch pour Bug dans IQ-Driver
//
// Si chaque champ long nullable qui est null est défini sur 0L
// Le DeleteOnSubmit() fonctionne !!
//
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);
            }
        }
    }
}

1voto

mkowalik Points 123

Je viens de rencontrer une erreur similaire. D'après tout ce que j'ai pu trouver, il semble s'agir d'une erreur dans le pilote IQ concernant les clés étrangères nulles.

Plus de détails : http://forum.linqpad.net/discussion/225/nullable-foreign-key-bug-in-iq-driver

Malheureusement, je n'ai aucune idée de comment contourner cette erreur, à part abandonner la solution LinqPad.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X