如何以编程方式备份 SQL Server 2014 Express Localdb (.mdf) 文件
How to backup a SQL Server 2014 Express Localdb (.mdf) file programmatically
我有一个简单的 Windows 应用程序,它使用 SQL Server 2014 LocalDB(.mdf
文件)。
而且我希望每当用户单击退出按钮时,我的应用程序会自动将其 localdb 文件 (.mdf
) 备份到用户同一台计算机上的另一个文件夹中。
我写了下面的简单代码,但出现了 SQL异常语法错误:
Incorrect syntax near`'C:\greendb_angelheart.mdf'
(DATABASE ""{0}""
语法似乎没问题)
而且我担心使用正常的SqlConnection
代码连接到特定的localdb
文件是否正确。
我的简单代码是:
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
if (MessageBox.Show("Really want to exit? Thank you !", MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.No)
{
e.Cancel = true;
}
else
{
string backuppath_basic = @"c:\Green_Backup";
if (!System.IO.Directory.Exists("backuppath_basic"))
{
System.IO.Directory.CreateDirectory(backuppath_basic);
}
var greendbfileName = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), string.Format("greendb_{0}.mdf", personID));
var copied_greendbfileName = string.Format(@"C:\greendb_{0}.mdf", personID);
string localConnectionString = string.Format(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename= " + Environment.GetEnvironmentVariable("APPDATA") + @"\greendb_{0}.mdf;Integrated Security=True;Connect Timeout=30;", personID);
SqlConnection backupConn = new SqlConnection();
backupConn.ConnectionString = localConnectionString;
backupConn.Open();
SqlCommand backupcomm = backupConn.CreateCommand();
string backupdb = @"BACKUP DATABASE ""{0}"" TO DISK '{1}'";
backupdb = string.Format(backupdb, greendbfileName, copied_greendbfileName);
SqlCommand backupcreatecomm = new SqlCommand(backupdb, backupConn);
backupcreatecomm.ExecuteNonQuery();
backupConn.Close();
Environment.Exit(0);
}
}
我经过多次试验和分析终于解决了。对于正在寻找解决方案的人,我分享如下。
与其他数据库相比,使用 MS SQL Localdb 进行开发的人似乎更少。
数据库名称不必包含扩展名,如 .mdf,等号= 必须在一起,如 DISK=
string backupdb = string.Format(@"BACKUP DATABASE greendb_{0} TO DISK='c:\Green_Backup\greendb_{0}.bak'", personID);
它可能会对某人有所帮助。
备份
try
{
var dlg = new System.Windows.Forms.FolderBrowserDialog();
var result = dlg.ShowDialog(this.GetIWin32Window());
if (result.ToString() == "OK")
{
var dbfileName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "LibraryManger.mdf");
var backupConn = new SqlConnection { ConnectionString = eb.GetConnectionString() };
backupConn.Open();
var backupcomm = backupConn.CreateCommand();
var backupdb = $@"BACKUP DATABASE ""{dbfileName}"" TO DISK='{Path.Combine(dlg.SelectedPath,"LibraryManagement.bak")}'";
var backupcreatecomm = new SqlCommand(backupdb, backupConn);
backupcreatecomm.ExecuteNonQuery();
backupConn.Close();
MessageBox.Show($"Database backup has successfully stored in {Path.Combine(dlg.SelectedPath, "LibraryManagement.bak")}", "Confirmation");
}
}
catch (Exception ex)
{
if(ex.Message.Contains("Operating system error"))
{
MessageBox.Show("Please chose a public folder.", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
}
else
MessageBox.Show(ex.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
}
恢复
您必须在恢复之前关闭现有连接
try
{
if (eb != null)
{
eb.DisposeConnection();
eb = null;
}
var dlg = new OpenFileDialog();
dlg.InitialDirectory = "C:\";
dlg.Filter = "Database file (*.bak)|*.bak";
dlg.RestoreDirectory = true;
if (Equals(dlg.ShowDialog(), true))
{
using (var con = new SqlConnection())
{
con.ConnectionString = @"Data Source=(LocalDB)\MSSQLLocalDB;Database=Master;Integrated Security=True;Connect Timeout=30;";
con.Open();
var dbfileName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "LibraryManger.mdf");
using (var cmd = new SqlCommand())
{
cmd.Connection = con;
cmd.CommandText = $@"RESTORE DATABASE ""{dbfileName}"" FROM DISK='{dlg.FileName}'";
cmd.ExecuteNonQuery();
}
con.Close();
}
MessageBox.Show($"Database backup has successfully restored.", "Confirmation");
eb = new EntityBroker.EntityBroker();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
}
我有一个简单的 Windows 应用程序,它使用 SQL Server 2014 LocalDB(.mdf
文件)。
而且我希望每当用户单击退出按钮时,我的应用程序会自动将其 localdb 文件 (.mdf
) 备份到用户同一台计算机上的另一个文件夹中。
我写了下面的简单代码,但出现了 SQL异常语法错误:
Incorrect syntax near`'C:\greendb_angelheart.mdf'
(DATABASE ""{0}""
语法似乎没问题)
而且我担心使用正常的SqlConnection
代码连接到特定的localdb
文件是否正确。
我的简单代码是:
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
if (MessageBox.Show("Really want to exit? Thank you !", MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.No)
{
e.Cancel = true;
}
else
{
string backuppath_basic = @"c:\Green_Backup";
if (!System.IO.Directory.Exists("backuppath_basic"))
{
System.IO.Directory.CreateDirectory(backuppath_basic);
}
var greendbfileName = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), string.Format("greendb_{0}.mdf", personID));
var copied_greendbfileName = string.Format(@"C:\greendb_{0}.mdf", personID);
string localConnectionString = string.Format(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename= " + Environment.GetEnvironmentVariable("APPDATA") + @"\greendb_{0}.mdf;Integrated Security=True;Connect Timeout=30;", personID);
SqlConnection backupConn = new SqlConnection();
backupConn.ConnectionString = localConnectionString;
backupConn.Open();
SqlCommand backupcomm = backupConn.CreateCommand();
string backupdb = @"BACKUP DATABASE ""{0}"" TO DISK '{1}'";
backupdb = string.Format(backupdb, greendbfileName, copied_greendbfileName);
SqlCommand backupcreatecomm = new SqlCommand(backupdb, backupConn);
backupcreatecomm.ExecuteNonQuery();
backupConn.Close();
Environment.Exit(0);
}
}
我经过多次试验和分析终于解决了。对于正在寻找解决方案的人,我分享如下。
与其他数据库相比,使用 MS SQL Localdb 进行开发的人似乎更少。
数据库名称不必包含扩展名,如 .mdf,等号= 必须在一起,如 DISK=
string backupdb = string.Format(@"BACKUP DATABASE greendb_{0} TO DISK='c:\Green_Backup\greendb_{0}.bak'", personID);
它可能会对某人有所帮助。
备份
try
{
var dlg = new System.Windows.Forms.FolderBrowserDialog();
var result = dlg.ShowDialog(this.GetIWin32Window());
if (result.ToString() == "OK")
{
var dbfileName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "LibraryManger.mdf");
var backupConn = new SqlConnection { ConnectionString = eb.GetConnectionString() };
backupConn.Open();
var backupcomm = backupConn.CreateCommand();
var backupdb = $@"BACKUP DATABASE ""{dbfileName}"" TO DISK='{Path.Combine(dlg.SelectedPath,"LibraryManagement.bak")}'";
var backupcreatecomm = new SqlCommand(backupdb, backupConn);
backupcreatecomm.ExecuteNonQuery();
backupConn.Close();
MessageBox.Show($"Database backup has successfully stored in {Path.Combine(dlg.SelectedPath, "LibraryManagement.bak")}", "Confirmation");
}
}
catch (Exception ex)
{
if(ex.Message.Contains("Operating system error"))
{
MessageBox.Show("Please chose a public folder.", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
}
else
MessageBox.Show(ex.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
}
恢复
您必须在恢复之前关闭现有连接
try
{
if (eb != null)
{
eb.DisposeConnection();
eb = null;
}
var dlg = new OpenFileDialog();
dlg.InitialDirectory = "C:\";
dlg.Filter = "Database file (*.bak)|*.bak";
dlg.RestoreDirectory = true;
if (Equals(dlg.ShowDialog(), true))
{
using (var con = new SqlConnection())
{
con.ConnectionString = @"Data Source=(LocalDB)\MSSQLLocalDB;Database=Master;Integrated Security=True;Connect Timeout=30;";
con.Open();
var dbfileName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "LibraryManger.mdf");
using (var cmd = new SqlCommand())
{
cmd.Connection = con;
cmd.CommandText = $@"RESTORE DATABASE ""{dbfileName}"" FROM DISK='{dlg.FileName}'";
cmd.ExecuteNonQuery();
}
con.Close();
}
MessageBox.Show($"Database backup has successfully restored.", "Confirmation");
eb = new EntityBroker.EntityBroker();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
}