连接已关闭异常

本文关键字:异常 连接 | 更新日期: 2023-09-27 18:28:52

我是C#的新手,正在尝试建立C#数据库连接。但我遇到了一个例外。

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';";

感谢您提前抽出时间。

连接已关闭异常

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

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

希望这能有所帮助。

打开连接时捕获任何异常。很可能连接没有打开,并且抛出了一个错误。删除连接打开时的try/catch,您可能会看到为什么连接没有打开

当出现异常时,您不会关闭连接和读取器,因此您需要使用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块。如果无法打开连接,则无法使用该连接。然后你应该记录并抛出异常,但不要表现得好像什么都没发生一样。

尝试将所有内容包装在一个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;
}

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

此外,我建议在您的场景中使用这种方法:

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]));
    }
}