Vous souhaitez utiliser l'identité renvoyée de l'insert dans l'insert ultérieur dans une transaction

StackOverflow https://stackoverflow.com/questions/5411697

  •  29-10-2019
  •  | 
  •  

Question

J'utilise Rob Conery Massif pour l'accès à la base de données. Je veux envelopper une transaction autour de quelques inserts, mais le deuxième insert utilise l'identité renvoyée du premier insert. Il n'est pas évident pour moi de faire cela dans une transaction. Une certaine aide serait appréciée.

var commandList = new List<DbCommand>
    {
        contactTbl.CreateInsertCommand(new
            {
                newContact.Name,
                newContact.Contact,
                newContact.Phone,
                newContact.ForceChargeThreshold,
                newContact.MeterReadingMethodId,
                LastModifiedBy = userId,
                LastModifiedDate = modifiedDate,
            }),
        branchContactTbl.CreateInsertCommand(new
            {
                newContact.BranchId,
                ContactId = ????, <-- how to set Id as identity from previous command
            }),
    };
Était-ce utile?

La solution

Pouvez-vous simplement le faire dans un proc stocké? Vous pouvez utiliser Scope_identity ou mieux pourtant la clause de sortie pour obtenir la ou les valeurs dont vous avez besoin. Et tous les inserts à toutes les tables sont dans une seule transaction qui peut être annulé en cas d'échec.

Autres conseils

Faire une requête entre ces deux inserts, cette méthode de Massive peut être utile:

public object Scalar(string sql, params object[] args) {
    object result = null;
    using (var conn = OpenConnection()) {
        result = CreateCommand(sql, conn, args).ExecuteScalar();
    }
    return result;
} 

Votre SQL sera = "Select Scope_Identity ()"

Mise à jour 2013/02/26

En regardant à nouveau le code massif, il n'y a pas de moyen fiable de récupérer le dernier ID inséré.

Le code ci-dessus ne fonctionnera que lorsque la connexion qui fera "Select Scope_Identity ()" est regroupée. (Ce doit être la même connexion qui a fait l'insert).

Massif table.Insert(..) La méthode renvoie la dynamique qui contient le champ ID, qui est rempli de "SELECT @@ identité". Il obtient la dernière ID insérée de Global Scope, ce qui est un bug évident (apparent dans les scénarios multithreading).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top