none
Backup d'une BDD SQL à partir d'une application

    Question

  • Bonjour,

    Dans mon application, j'utilise une base SQL, créée avec le serveur intégré à Visual Studio : (localdb)\MSSQLLocalDB
    Je voudrais que l'utilisateur puisse faire un backup à partir de l'application. Pour cela, j'ai repris un exemple trouvé sur MSDN :

                Server srv;
                srv = new Server();

                Backup bkpDBFull = new Backup();
                /* Specify whether you want to back up database or files or log */
                bkpDBFull.Action = BackupActionType.Database;
                /* Specify the name of the database to back up */
                bkpDBFull.Database = "F:\\MICROSOFT SQL SERVER\\MSSQL12.SQLEXPRESS\\MSSQL\\DATA\\CAISSE MAGASIN.MDF";
                bkpDBFull.Devices.AddDevice(@"F:\\MICROSOFT SQL SERVER\\MSSQL12.SQLEXPRESS\\MSSQL\\DATA\\CAISSE MAGASIN.BAK", DeviceType.File);
                bkpDBFull.BackupSetName = "Caisse Magasin Backup";
                bkpDBFull.BackupSetDescription = "Caisse Magasin - Full Backup";
                // pour écraser l'ancienne sauvegarde
                bkpDBFull.Initialize = true;
                //
                // démarrer le backup
                bkpDBFull.SqlBackup(srv);

    Mais ce code me retourne l'erreur suivante :

    'Microsoft.SqlServer.Management.Smo.FailedOperationException' s'est produite dans Microsoft.SqlServer.SmoExtended.dll
     Microsoft.SqlServer.Management.Smo.Failed {"Échec de Sauvegarde pour Serveur « PC-WIN10 ». "}

    PC-WIN10 est la valeur de la variable srv, qui n'est pas le nom du serveur SQL, mais le nom du PC.
    Comment faire pour retrouver et indiquer le nom exact du serveur SQL ?

    Merci de votre aide.

    Pour info, voici le détail de l'exception :
    L'exception Microsoft.SqlServer.Management.Smo.FailedOperationException n'a pas été gérée
      HResult=-2146233088
      HelpLink=http://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&ProdVer=12.0.2000.8+((SQL14_RTM).140220-1752)&EvtSrc=Microsoft.SqlServer.Management.Smo.ExceptionTemplates.FailedOperationExceptionText&EvtID=Sauvegarde+Server&LinkId=20476
      Message=Échec de Sauvegarde pour Serveur « PC-WIN10 ».
      Operation=Sauvegarde
      Source=Microsoft.SqlServer.SmoExtended
      StackTrace:
           à Microsoft.SqlServer.Management.Smo.Backup.SqlBackup(Server srv)
           à Caisse_Magasin_WF.Form1.buttonSauvegarderBDD_Click(Object sender, EventArgs e) dans F:\Users\marceldelhaye\Documents\Visual Studio 2015\Projects\Caisse Magasin WF\Caisse Magasin WF\Form1.cs:ligne 3025
           à System.Windows.Forms.Control.OnClick(EventArgs e)
           à System.Windows.Forms.Button.OnClick(EventArgs e)
           à System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
           à System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
           à System.Windows.Forms.Control.WndProc(Message& m)
           à System.Windows.Forms.ButtonBase.WndProc(Message& m)
           à System.Windows.Forms.Button.WndProc(Message& m)
           à System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
           à System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
           à System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
           à System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
           à System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
           à System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
           à System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
           à System.Windows.Forms.Application.Run(Form mainForm)
           à Caisse_Magasin_WF.Program.Main() dans F:\Users\marceldelhaye\Documents\Visual Studio 2015\Projects\Caisse Magasin WF\Caisse Magasin WF\Program.cs:ligne 19
           à System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
           à System.AppDomain.nExecuteAssembly(RuntimeAssembly assembly, String[] args)
           à System.Runtime.Hosting.ManifestRunner.Run(Boolean checkAptModel)
           à System.Runtime.Hosting.ManifestRunner.ExecuteAsAssembly()
           à System.Runtime.Hosting.ApplicationActivator.CreateInstance(ActivationContext activationContext, String[] activationCustomData)
           à System.Runtime.Hosting.ApplicationActivator.CreateInstance(ActivationContext activationContext)
           à System.Activator.CreateInstance(ActivationContext activationContext)
           à Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssemblyDebugInZone()
           à System.Threading.ThreadHelper.ThreadStart_Context(Object state)
           à System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
           à System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
           à System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
           à System.Threading.ThreadHelper.ThreadStart()
      InnerException:
           HResult=-2146233087
           Message=Échec de la connexion au serveur ..
           Source=Microsoft.SqlServer.ConnectionInfo
           StackTrace:
                à Microsoft.SqlServer.Management.Common.ConnectionManager.Connect()
                à Microsoft.SqlServer.Management.Common.ConnectionManager.PoolConnect()
                à Microsoft.SqlServer.Management.Common.ConnectionManager.get_ServerVersion()
                à Microsoft.SqlServer.Management.Smo.ExecutionManager.GetServerVersion()
                à Microsoft.SqlServer.Management.Smo.SqlSmoObject.get_ServerVersion()
                à Microsoft.SqlServer.Management.Smo.Backup.Script(Server targetServer)
                à Microsoft.SqlServer.Management.Smo.Backup.SqlBackup(Server srv)
           InnerException:
                Class=20
                ErrorCode=-2146232060
                HResult=-2146232060
                LineNumber=0
                Message=Une erreur liée au réseau ou spécifique à l'instance s'est produite lors de l'établissement d'une connexion à SQL Server. Le serveur est introuvable ou n'est pas accessible. Vérifiez que le nom de l'instance est correct et que SQL Server est configuré pour autoriser les connexions distantes. (provider: Named Pipes Provider, error: 40 - Impossible d'ouvrir une connexion à SQL Server)
                Number=2
                Server=""
                Source=.Net SqlClient Data Provider
                State=0
                StackTrace:
                     à System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, SqlCredential credential, Object providerInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString userConnectionOptions, SessionData reconnectSessionData, DbConnectionPool pool, String accessToken, Boolean applyTransientFaultHandling)
                     à System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions)
                     à System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnectionPool pool, DbConnection owningObject, DbConnectionOptions options, DbConnectionPoolKey poolKey, DbConnectionOptions userOptions)
                     à System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection)
                     à System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection)
                     à System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection)
                     à System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection)
                     à System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection)
                     à System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
                     à System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
                     à System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource`1 retry)
                     à System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry)
                     à System.Data.SqlClient.SqlConnection.Open()
                     à Microsoft.SqlServer.Management.Common.ConnectionManager.InternalConnect(WindowsIdentity impersonatedIdentity)
                     à Microsoft.SqlServer.Management.Common.ConnectionManager.Connect()
                InnerException:
                     ErrorCode=-2147467259
                     HResult=-2147467259
                     Message=Le fichier spécifié est introuvable
                     NativeErrorCode=2
                     InnerException:


    • Modifié Mani035 dimanche 22 mai 2016 13:09
    dimanche 22 mai 2016 13:03

Réponses

  • C'est OK, j'ai trouvé la réponse sur Code Project.
    Voici le code modifié :

         ServerConnection con = new ServerConnection(@"(localdb)\MSSQLLocalDB");
                Server server = new Server(con);
                //
                Backup bkpDBFull = new Backup();
                /* Specify whether you want to back up database or files or log */
                bkpDBFull.Action = BackupActionType.Database;
                /* Specify the name of the database to back up */
                bkpDBFull.Database = "F:\\MICROSOFT SQL SERVER\\MSSQL12.SQLEXPRESS\\MSSQL\\DATA\\CAISSE MAGASIN.MDF";
                bkpDBFull.Devices.AddDevice(@"F:\\MICROSOFT SQL SERVER\\MSSQL12.SQLEXPRESS\\MSSQL\\DATA\\CAISSE MAGASIN.BAK", DeviceType.File);
                bkpDBFull.BackupSetName = "Caisse Magasin Backup";
                bkpDBFull.BackupSetDescription = "Caisse Magasin - Full Backup";
                // pour écraser l'ancienne sauvegarde
                bkpDBFull.Initialize = true;
                //
                // démarrer le backup
                bkpDBFull.SqlBackup(server);

    Les 2 premières lignes sont les plus importantes.
    A plus.
    • Marqué comme réponse Mani035 dimanche 22 mai 2016 14:15
    dimanche 22 mai 2016 14:15

Toutes les réponses

  • C'est OK, j'ai trouvé la réponse sur Code Project.
    Voici le code modifié :

         ServerConnection con = new ServerConnection(@"(localdb)\MSSQLLocalDB");
                Server server = new Server(con);
                //
                Backup bkpDBFull = new Backup();
                /* Specify whether you want to back up database or files or log */
                bkpDBFull.Action = BackupActionType.Database;
                /* Specify the name of the database to back up */
                bkpDBFull.Database = "F:\\MICROSOFT SQL SERVER\\MSSQL12.SQLEXPRESS\\MSSQL\\DATA\\CAISSE MAGASIN.MDF";
                bkpDBFull.Devices.AddDevice(@"F:\\MICROSOFT SQL SERVER\\MSSQL12.SQLEXPRESS\\MSSQL\\DATA\\CAISSE MAGASIN.BAK", DeviceType.File);
                bkpDBFull.BackupSetName = "Caisse Magasin Backup";
                bkpDBFull.BackupSetDescription = "Caisse Magasin - Full Backup";
                // pour écraser l'ancienne sauvegarde
                bkpDBFull.Initialize = true;
                //
                // démarrer le backup
                bkpDBFull.SqlBackup(server);

    Les 2 premières lignes sont les plus importantes.
    A plus.
    • Marqué comme réponse Mani035 dimanche 22 mai 2016 14:15
    dimanche 22 mai 2016 14:15
  • Bonjour, Mani035,

    Je vous remercie d'avoir partagé cette solution avec la communauté du forum.
    Bonne journée.

    Cordialement,
    Teodora


    Votez! Appel à la contribution TechNet Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    lundi 23 mai 2016 08:58
    Modérateur