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.