当我的 C# 应用程序是 运行 时无法复制或使用我的 SQL 服务器数据库

Unable to copy or use my SQL Server database while my C# app is running

我是 SQL 服务器的新手,遇到了一些非常基本的问题(看起来如此!)。我正在通过我的 C# 应用程序访问我的本地 SQL 服务器数据库文件。

我想要的是能够随时通过我的 C# 应用程序在 ftp 服务器上创建本地数据库的备份。但是每当我尝试上传数据库文件(甚至使用 windows 资源管理器复制)时,我都会收到错误消息

Action cannot be completed because file is open in SQL Server

每次加载我的应用程序中的表单时,我都会通过调用此函数获取产品列表:

private void populate_products()
{
    SqlConnection con = new SqlConnection();

    con.ConnectionString = @"Data Source=.\SQLEXPRESS;"+
                          "AttachDbFilename=" + AppDomain.CurrentDomain.BaseDirectory + "myDB.mdf;" +
                          "Integrated Security=True;Connect Timeout=30;User Instance=True";
    con.Open();

    try
    {
        SqlCommand cmd;

        string cmd1 = "SELECT Name,Cost FROM Product";

        cmd = new SqlCommand(cmd1, con);            
        SqlDataReader read = cmd.ExecuteReader();

        bool ch = true;

        while (read.Read())
        {
            list_name.Items.Add(read[0].ToString());
            costs.Add(read[1].ToString());
        }

        read.Close();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }

    con.Close();
    con.Dispose();    
}

调用此函数后文件无法复制。由于调用了 con.Close() 我想知道为什么文件仍在使用中。

即使从 SQL Server Management Studio 中分离数据库也不起作用。有人可以帮忙吗?

您需要清除连接池。

尝试添加

SqlConnection.ClearAllPools();

方法结束时。

另一种方法是创建一个备份,然后上传该备份而不是您装载的数据库文件。

您可以使用此 SQL 命令创建备份:

BACKUP DATABASE [DATABASENAME] TO DISK = 'c:\path\backup.bak' WITH FORMAT, INIT, STATS = 25

根据需要更改 DATABASENAMEc:\path\backup.bak。然后您可以选择 bak 文件,并从那里上传。