Соединение закрыто, исключение - PullRequest
0 голосов
/ 25 марта 2012

Я новичок в 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 ]

3 голосов
/ 25 марта 2012

Большинство вероятно объект соединения не может открыть соединение, но, когда вы его перехватываете, вы не можете обнаружить ошибку.Чтобы было ясно:

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

Надеюсь, это поможет.

3 голосов
/ 25 марта 2012

Вы обнаруживаете любые исключения при открытии соединения.Скорее всего, соединение не открывается и выдает ошибку.Удалите try / catch при открытии соединения, и вы, вероятно, увидите, почему соединение не открыто

2 голосов
/ 25 марта 2012

Вы не закрываете соединение и считыватель, когда возникло исключение, для этого вам нужно использовать 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. Если соединение не может быть открыто, оно не может быть использовано. Затем вы должны записать это и выдать исключение, но не действовать так, как будто ничего не произошло.

1 голос
/ 25 марта 2012

вы отлаживаете код? в противном случае вы не сможете увидеть исключение, потому что у вас ничего нет на вашем улове

Также я предлагаю этот подход использовать в вашем сценарии:

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]));
    }
}
1 голос
/ 25 марта 2012

Попробуйте обернуть все в один блок 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...