基于服务的数据库未关闭

时间:2014-08-21 15:16:15

标签: c# database

当我连接到基于服务的数据库到mdf文件时,我遇到了问题 打开连接后我无法关闭它。

这是我的代码: 创建2个按钮和1个OpenDialogFile

private void button1_Click(object sender, EventArgs e)
{
SqlConnection conn = new SqlConnection(connectionString(db.mdf));
conn.Open();
conn.Close();
}


private void button2_Click(object sender, EventArgs e)        {
openFileDialog1.Filter = "Database File|*.mdf|All files |*.*";
openFileDialog1.DefaultExt = "mdf";
openFileDialog1.FileName = "db.mdf";
if (openFileDialog1.ShowDialog() == DialogResult.Cancel)
{
return;
}
textbox1.Text = openFileDialog1.FileName;
}

单击第一个按钮后使用的文件,不能执行第二个按钮

我的问题: 我有连接字符串我可以连接DataBased; 但在我这样做之后:Conn.Open(); 不管我做什么 Conn.close(); 或其他任何文件,DB.MDF文件使用,直到我关闭整个项目... 这意味着如果我想 打开它并关闭它我需要打开并关闭项目......

编辑: 试试这个:

 using (SqlConnection connection = new SqlConnection(ConnectString))
            {
                connection.Open();
            }

仍未奏效

3 个答案:

答案 0 :(得分:1)

从不直接使用*.mdf文件。相反,会发生什么是Sql Server已经在后台某处运行,并告诉Sql Server为您附加到该文件。然后你与Sql Server交谈并打开与Sql Server刚刚附加的数据库的连接。

当您关闭连接时,您不再连接到数据库,但是 Sql Server仍在运行并且仍在使用该文件。当您稍后尝试打开该文件时,它&# 39; s仍然被锁定使用,因此您可以从问题中看到错误。现在你问,"我如何告诉Sql Server发布文件?"有方法,但这确实是错误的问题。

相反,您需要询问您所做的事情是否适合Sql Server的工作方式。您看,Sql Server不能用作桌面应用程序的本地数据存储。这真的不是。 Sql Server旨在生活在某个专用服务器上,提供对许多人连接并同时进行更改的数据库的访问。它的连接和操作方法反映了这一点,因此它不是一个很好的选择,作为用于桌面应用程序的简单本地数据存储。

我喜欢Sql Server,但如果您只想打开一个文件并从本地应用程序读取或保存本地计算机上的一些记录,那么有更好的选择:Sql Server Compact(不是Express)版,Sqlite甚至MS Access都是更好的选择。

虽然我在这里,但永远不要自己致电.Close().Dispose()。你看,Sql Server支持有限数量的连接。如果您的代码调用.Close().Dispose()来手动终止这些连接,那么在到达该函数调用之前,您很可能会在方法中发生异常,并且连接永远不会是关闭。做到这一点,突然之间你已经把自己锁在了数据库服务器之外。关闭连接的最佳方法是自己调用这些方法,而是让框架通过using机制为您执行此操作:

using (var cn = new SqlConnection("connection string here"))
{
    cn.Open();
    //do stuff with cn

}  // cn WILL be closed at the end of this brace, **even if an exception is thrown**
// At no point did I ever use cn.Close(); or cn.Dispose(); the framework made sure it happened for me

答案 1 :(得分:1)

尝试清除连接池:

using(var conn = new SqlConnection(connectionString(db.mdf))
{
    conn.Open();
    conn.Close();
}
SqlConnection.ClearAllPools();

答案 2 :(得分:0)

谢谢大家的帮助 使用后

SqlConnection.ClearAllPools();

要使用的文件停止,我可以在我的完整项目中的其他项目/表单中使用它 所以我不需要关闭整个项目