连接已关闭异常

时间:2012-03-25 12:49:34

标签: c# .net exception

我是C#的新手并尝试建立C#db连接。但我得到了一个例外。

  

ExecuteReader需要一个开放且可用的连接。连接的当前状态已关闭。

以下是代码

public void executeCommand()
{
    SqlConnection con = new SqlConnection(connectionString);

    try
    {
        con.Open();
    }
    catch (Exception ex)
    {
    }

    SqlDataReader rdr = null;
    SqlCommand cmd = new SqlCommand("SELECT * FROM Employees", con);

    try
    {
        rdr = cmd.ExecuteReader();
    }
    catch (Exception)
    {
        throw;
    }

    rdr.Close();
   // rdr.Close();
}

这是我的连接字符串

public static string connectionString = 
    "Data Source=(local);Initial Catalog=service;User Id='mayooresan';Password='password';";

感谢您的提前时间。

5 个答案:

答案 0 :(得分:3)

打开连接时,您将捕获任何异常。很可能连接没有打开并且引发错误。删除连接开口处的try / catch,您可能会看到连接未打开的原因

答案 1 :(得分:3)

大多数概率连接对象无法打开连接,但是当您捕获它时,您无法找出错误。要明确:

try
{
   con.Open();
}
catch (Exception ex)
{
   MessageBox.Show(ex.ToString()); //ADD THIS STRING FOR DEBUGGING, TO SEE IF THERE IS AN EXCEPTION.
}

希望这有帮助。

答案 2 :(得分:2)

当引发异常时,你不会关闭连接和阅读器,因此你需要使用try {catch的finally - 块或者隐含关闭的using-statement

using (SqlConnection connection = new SqlConnection(connectionString))
{
    using(SqlCommand command = new SqlCommand(queryString, connection)
    {
        connection.Open();
        using(SqlDataReader reader = command.ExecuteReader())
        {
            while (reader.Read())
            {
                // do something with it
            }
        }
    }
}

除此之外,你不应该使用空的catch块。如果无法打开连接,则无法使用。然后你应该记录并抛出异常,但不要表现得好像什么也没发生过。

答案 3 :(得分:1)

尝试将所有内容包装在一个try-catch块中。就像现在一样,如果在尝试打开连接时抛出异常,它将无声地失败。请尝试使用此代码:

try
{
    SqlConnection con = new SqlConnection(connectionString);
    SqlDataReader rdr = null;
    SqlCommand cmd = new SqlCommand("SELECT * FROM Employees", con);
    rdr = cmd.ExecuteReader();
}
catch(Exception)
{
    throw;
}

答案 4 :(得分:1)

你正在调试代码吗? 如果没有,你将无法看到异常,因为你的捕获物上没有任何东西

此外,我建议在您的方案中使用此方法:

using (SqlConnection connection = new SqlConnection(connectionString))
{
    connection.Open();

    SqlCommand command = new SqlCommand(queryString, connection);
    SqlDataReader reader = command.ExecuteReader();
    while (reader.Read())
    {
        Console.WriteLine(String.Format("{0}", reader[0]));
    }
}