进程sqlservr.exe在C#中的Connection.Close()之后继续运行

时间:2014-01-09 07:20:43

标签: c# sql

我创建了与SQL数据库的连接,但是当我关闭它时,进程sqlservr.exe即使在关闭应用程序后也会继续运行。我也试过使用Dispose,但遇到了同样的问题。 sqlservr.exe意味着继续运行(它不是在启动应用程序之前)?有没有办法杀死它?

namespace WindowsFormsApplication3
{
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        string conexao = "Data Source=(LocalDB)\\v11.0;AttachDbFilename=C:\\Users\\SMITH\\Documents\\C#\\WindowsFormsApplication3\\WindowsFormsApplication3\\Database1.mdf;Integrated Security=True";
        SqlConnection conn = new SqlConnection(conexao);
        SqlCommand comando = new SqlCommand("SELECT COUNT(*) FROM Usuarios WHERE NomeUser = @user and SenhaUser = @senha", conn);

        comando.Parameters.Add("@user", SqlDbType.VarChar).Value = textBox1.Text;
        comando.Parameters.Add("@senha", SqlDbType.VarChar).Value = textBox2.Text;


        conn.Open();
        int i = (int)comando.ExecuteScalar();

        string a = i.ToString();

        textBox3.Text = a;

        if(i>0){
            MessageBox.Show("Existe");
        }else{
            MessageBox.Show("Nem existe");

            conn.Dispose();

        }
    }
}   

}

2 个答案:

答案 0 :(得分:1)

你可能认为自己正在做的事情不是你真正做的事情。

您希望通过嵌入式SQL服务器可以本地访问本地数据库。不是这种情况。实际上,您只是启动完全成熟的MS SQL Server服务(sqlservr.exe),它完全不依赖于您的应用程序 - 除了由您的进程启动之外,它就像您将其配置为运行时一样启动Windows等。

这不一定是坏事,但如果您希望您的应用程序与嵌入式服务器一起使用,则可能会遇到问题。也就是说,SQL服务器是在计算机上配置的,而不是通过你的应用程序配置,它必须(单独)安装,如果有另一台服务器正在运行,你附加到那台服务器 - 你不一定拥有权限等

如果您只将它用于内部工具,请不要因为更改任何内容而烦恼,让SQL Server进程运行正常,您可以通过服务将其关闭。如果这是分布式应用程序的一部分,请考虑使用不同的SQL服务器,例如SQL Server Anywhere(SQL Server CE),或者甚至是完全不同的东西,例如MS Access(在每台Windows PC上免费提供,而不仅仅是Office )或FireBird。

答案 1 :(得分:1)

由于您的连接字符串表明您正在使用LocalDB,来自Introducing LocalDB, an improved SQL Express

  

LocalDB不会创建任何数据库服务; LocalDB进程在需要时自动启动和停止。应用程序只是连接到“Data Source =(localdb)\ v11.0”,LocalDB进程作为应用程序的子进程启动。 关闭此流程的最后一次连接几分钟后,该流程将关闭。 (重点已添加)

我已经在我自己的环境中确认了“几分钟后”行为。但请确保您没有任何进程在任何地方保持连接。