2 votes

Comment utiliser les transactions dans le ConnectionContext de SMO.Server ?

Exemples suivants 1 , 2 J'ai écrit ce qui suit :

using System;
using System.Data.SqlClient;
using System.IO;
using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Management.Common;

namespace ScriptRunner
{
    class Program
    {
        static void Main(string[] args)
        {
            var script = File.ReadAllText("Test.sql");
            const string sqlConnectionString = @"Data Source=my\ds;
                    Initial Catalog=myic;
                    Connection Timeout=0;
                    Integrated Security=true";
            SqlConnection connection = null;
            Server server = null;
            try
            {
                connection = new SqlConnection(sqlConnectionString);
                server = new Server(new ServerConnection(connection));
                connection.Open();
                server.ConnectionContext.BeginTransaction();
                server.ConnectionContext.ExecuteNonQuery(script);
                server.ConnectionContext.CommitTransaction();
            }
            catch { server.ConnectionContext.RollBackTransaction(); }
            finally { connection?.Dispose(); }
        }
    }
}

Tout fonctionne, sauf les transactions. La commande s'exécute simplement, s'il y a une erreur, tout ce qui précède est déjà dans la base de données. Comment faire pour que les transactions fonctionnent ici ?

[EDIT] Lorsque je modifie le code pour ouvrir la transaction au niveau de la SqlConnection comme ceci ( aquí il est suggéré qu'il ne devrait pas y avoir de différence) :

    SqlTransaction transaction = null;
    try
    {
        connection = new SqlConnection(sqlConnectionString);
        server = new Server(new ServerConnection(connection));
        connection.Open();
        transaction = connection.BeginTransaction();
        server.ConnectionContext.ExecuteNonQuery(script);
        transaction.Commit();
    }

Il lève l'exception InvalidOPexception : "ExecuteNonQuery exige que la commande ait une transaction lorsque la connexion affectée à la commande est dans une transaction locale en attente. La propriété Transaction de la commande n'a pas été initialisée."

Pourtant, je ne vois pas d'endroit où je peux accéder à l'objet de commande.

2voto

Anton Rudoy Points 21

J'ai été confronté au même problème "ExecuteNonQuery requires the command to have a transaction...".
Il semble que si l'on effectue une transaction begin/commit pour ServerConnection et non pour SqlConnection, tout fonctionne.

...
SqlConnection connection = new SqlConnection(sqlConnectionString);
ServerConnection srvCon = new ServerConnection(connection);

try
{
     server = new Server(srvCon);

     srvCon.BeginTransaction();
     server.ConnectionContext.ExecuteNonQuery(script);
     srvCon.CommitTransaction();
}
catch
{
     srvCon.RollBackTransaction();
}
...

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