Comment puis-je exécuter cette instruction SQL avec .NET et Dapper.NET?

.net c# dapper

Question

J'ai la requête SQL suivante:

BEGIN TRAN;

UPDATE [dbo].[Foo] SET StatusType = 2 WHERE FooId = xxx;
INSERT INTO [dbo].[FooNotes] (FooId, Note) VALUES ('blah....', xxx);

ROLLBACK TRAN;

et c'est pour une liste d'id. par exemple.

var fooIds = new [] { 1, 2, 3, 4, 5, 6 };

alors j'attends ça ..

BEGIN TRAN;

UPDATE [dbo].[Foo] SET StatusType = 2 WHERE FooId = 1;
INSERT INTO [dbo].[FooNotes] (FooId, Note) VALUES ('blah....', 1);

UPDATE [dbo].[Foo] SET StatusType = 2 WHERE FooId = 2;
INSERT INTO [dbo].[FooNotes] (FooId, Note) VALUES ('blah....', 2);

UPDATE [dbo].[Foo] SET StatusType = 2 WHERE FooId = 3;
INSERT INTO [dbo].[FooNotes] (FooId, Note) VALUES ('blah....', 3);

ROLLBACK TRAN;

Est-ce que cela peut être fait avec Dapper ?

NOTE: Si le TRAN rend cela difficile, je peux le laisser tomber.

Réponse acceptée

Dapper ne prend que très peu en charge la modification interne des requêtes (il prend en charge l’extension de liste pour IN , l’injection littérale et certains réglages OPTION / UNKNOWN . Vous avez deux options ici:

  1. utilisez StringBuilder pour créer une seule opération importante que vous pouvez exécuter (cela peut être paramétré via un dictionnaire)
  2. déplacer la transaction vers ADO.NET plutôt que TSQL

Pour ce dernier, peut-être quelque chose comme:

using(var tran = conn.BeginTransaction())
{
    try
    {
        conn.Execute(@"
UPDATE [dbo].[Foo] SET StatusType = 2 WHERE FooId = @id;
INSERT INTO [dbo].[FooNotes] (FooId, Note) VALUES ('blah....', @id);",
            fooIds.Select(id => new { id }), transaction: tran);
    }
    finally // in this example, we always want to rollback
    {
        tran.Rollback();
    }
}

Réponse populaire

vous pouvez faire quelque chose comme ça:

using (var connection = new SqlConnection(yourConnectionString))
{
    connection.Open();
    using (var tx = connection.BeginTransaction())
    {
        foreach (var fooId in fooIds)
        {
            connection.Execute("UPDATE [dbo].[Foo] SET StatusType = 2 WHERE FooId = @id; INSERT INTO [dbo].[FooNotes] (FooId, Note) VALUES ('blah....', @id);", new {id = fooId}, tx);
        }

        tx.Rollback();
    }
}


Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi