Как сделать резервную копию базы данных в C # через код? - PullRequest
1 голос
/ 13 марта 2011

Например, я удалил запись в таблице в базе данных, и моя база данных - MS Aaccess.Какие-либо механизмы резервного копирования, к которым я могу обратиться?Так что, когда мне понадобится откат базы данных, я просто быстро восстановлю ее из кода.

Ответы [ 3 ]

2 голосов
/ 13 марта 2011

MS Access - это файловая база данных, верно?в моем понимании это означает, что когда соединение закрыто, а файл не используется, вы можете скопировать этот файл в другое место.

Здесь я предполагаю, что приложение имеет такие привилегии в файловой системе.

Кроме того, я согласен с ответом Мортена Мартнера: если тип базы данных - MS SQL Server, то вам определенно потребуется использование библиотеки SMO.

0 голосов
/ 16 марта 2011

Если вы являетесь пользователем вашей базы данных, вам просто нужно закрыть соединение и скопировать его в файловую систему.

Если есть несколько пользователей, вам следует использовать другой метод. Если у вас действительно есть доступ, есть недокументированная команда, которая сделает резервную копию таблиц в файле Jet / ACE:

  Application.SaveAsText 6, vbNullString, strTargetMDB 

Теперь, поскольку это можно сделать только с открытой базой данных в пользовательском интерфейсе Access, требуется автоматизировать Access и работать с CurrentDB. Вот реализация, которая работает в Access:

  Public Function CreateBackup(strMDBName As String, strBackupPath As String, _
    Optional bolCompact As Boolean = False) As Boolean
  On Error GoTo errHandler
    Dim objAccess As Object
    Dim strBackupMDB As String
    Dim strCompactMDB As String

    If Len(Dir(strBackupPath & "\*.*")) = 0 Then ' alternative: use File System Object for this
       MkDir strBackupPath
    End If

    Set objAccess = New Access.Application
    objAccess.Application.OpenCurrentDatabase strMDBName
    strBackupMDB = "Backup" & Format(Now(), "YYYYMMDDhhnnss") & ".mdb"
    Debug.Print strBackupPath & "\" & strBackupMDB
    objAccess.Application.SaveAsText 6, vbNullString, strBackupPath & "\" & strBackupMDB
    objAccess.Application.Quit
    Set objAccess = Nothing

    If bolCompact Then
       strCompactMDB = strBackupPath & "\" & "c_" & strBackupMDB
       Name strBackupPath & "\" & strBackupMDB As strCompactMDB
       DBEngine.CompactDatabase strCompactMDB, strBackupPath & "\" & strBackupMDB
       Kill strCompactMDB
    End If

    CreateBackup = (Len(Dir(strBackupPath & "\" & strBackupMDB)) > 0)

  exitRoutine:
    If Not (objAccess Is Nothing) Then
       On Error Resume Next
       objAccess.Application.Quit
       On Error GoTo 0
       Set objAccess = Nothing
    End If
    Exit Function

  errHandler:
    Select Case Err.Number
      Case 75 ' Path/File access error -- tried to MkDir a folder that already exists
        Resume Next
      Case Else
        MsgBox Err.Number & ": " & Err.Description, vbExclamation, "Error in CreateBackup()"
        Resume exitRoutine
    End Select
  End Function

Чтобы запустить это из C #, вам нужно автоматизировать Access, и вам, вероятно, не нужна зависимость от Access.

Поскольку я работаю исключительно в Access, я использую этот метод, поэтому я никогда не программировал более сложные методы.

Если у вас есть эксклюзивный доступ к базе данных, вы можете использовать команду JRO CompactDatabase для сжатия к новому имени файла, но если у вас есть эксклюзивный доступ, вы также можете использовать файловую систему.

Итак, в основном, у вас есть выбор, как экспортировать таблицы данных в резервную базу данных. Вы можете использовать DoCmd.TransferDatabase для копирования всех таблиц данных, а затем скопировать отношения, или вы можете создать пустую базу данных шаблонов и добавить данные из каждой таблицы по очереди в копию шаблона (в порядке, который не будет нарушать РИ, конечно).

Ни то, ни другое не звучит для меня беспорядочно, и поэтому я использую метод SaveAsText! Но если бы я не запустил Access, две другие альтернативы стоили бы сделать.

0 голосов
/ 13 марта 2011

Я использую следующий код для резервного копирования баз данных SQL-сервера:

using System;
using System.Collections.Generic;
using System.Data;
using System.Collections;
using Microsoft.SqlServer.Management.Common;
using Microsoft.SqlServer.Management.Smo;
using System.Text;

namespace Codeworks.SqlServer.BackupDatabase
{
    public class BackupCore
    {
        public static void Execute( string instance, string database, string outputFile )
        {
            BackupDeviceItem bdi = new BackupDeviceItem( outputFile, DeviceType.File );
            Backup bu = new Backup();
            bu.Database = database;
            bu.Devices.Add( bdi );
            bu.Initialize = true;

            // add percent complete and complete event handlers
            bu.PercentComplete += new PercentCompleteEventHandler(Backup_PercentComplete);
            bu.Complete +=new ServerMessageEventHandler(Backup_Complete);

            Server server = new Server( instance );
            bu.SqlBackup( server );
        }

        protected static void Backup_PercentComplete( object sender, PercentCompleteEventArgs e )
        {
            // Console.WriteLine( e.Percent + "% processed." );
        }

        protected static void Backup_Complete( object sender, ServerMessageEventArgs e )
        {
            Console.WriteLine( e.ToString() );
        }
    }
}

Вам потребуются библиотеки управления от MS для правильной версии SQL-сервера, но они доступны для загрузки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...