Bonjour,
Dans l'optique de migrer d'un serveur à un autre nous avons développé un outils pour simplifier le travail de l'administrateur.
Cet outil permet entres autres choses d'attacher les bases de données qui se trouvent dans un répertoire.
La chaine de connexion à toujours la forme ci-dessous et l'utilisateur m'a dit qu'il se connecte avec le compte "sa" :
Server=xxxx;Database=master;User ID=yyyy;Password=zzzz
Le code ci-dessous a été testé sous différents environnements et semblait parfaitement fonctionner jusqu'à présent.
Ce code a été testé sur différentes machines allant d'un Windows Server 2003 avec du SQL Server 2005 jusqu'à du Windows Server 2012 avec SQL Server 2014 et comme je le disais précédemment, il n'y avait eu aucun souci jusqu'à présent.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48 public Boolean AttachDatabases(IEnumerable<DatabaseInformation> databases) { if (databases == null) throw new ArgumentNullException("databases"); FillLog("Attachement des bases de données."); Boolean result = false; using (SqlConnection connection = new SqlConnection(connectionString)) { using (SqlCommand command = new SqlCommand("SP_ATTACH_DB @DBNAME = @DATABASE, @FILENAME1 = @MDFFILE, @FILENAME2 = @LDFFILE", connection)) { connection.Open(); command.CommandTimeout = 0; SqlParameter name = command.Parameters.Add("DATABASE", SqlDbType.VarChar); SqlParameter mdf = command.Parameters.Add("MDFFILE", SqlDbType.VarChar); SqlParameter ldf = command.Parameters.Add("LDFFILE", SqlDbType.VarChar); foreach (DatabaseInformation database in databases) { String message = Environment.NewLine + "Base de données " + database.Name + Environment.NewLine + "Fichier de données : " + database.ModelDataFile + Environment.NewLine + "Fichier journal : " + database.LogDataFile + Environment.NewLine; try { name.Value = database.Name; mdf.Value = database.ModelDataFile; ldf.Value = database.LogDataFile; command.ExecuteNonQuery(); message += "Base attachée avec succès."; result = true; } catch (SqlException ex) { result = false; message += ex.Message; FillErrorsList(ex.Message); } FillLog(message); } } }
On m'a remonté ce message d'erreur sur une machine virtuelle en Windows Server 2008 R2 en 64 bits avec SP1 et SQL Server 2008 R2 :
J'avoue ne pas comprendre pourquoi le message dit que la connexion est fermée alors que le Open() est bien passé !System.InvalidOperationException: ExecuteNonQuery nécessite une Connection ouverte et disponible. La connexion est actuellement fermée.
à System.Data.SqlClient.SqlCommand.ValidateCommand(String method, Boolean async)
à System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite)
à System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
à XXX.YYY.ZZZ.ServerInstanceManager.AttachDatabases(IEnumerable`1 databases)
Si quelqu'un a une idée...
Merci.
Partager