Неправильная попытка вызова Read, когда читатель закрыт на службе WCF с приложением windows froms

1

У меня такой код:

public DataTable GetScriptDetails()
{
    DataTable dtScriptDetails = new DataTable();

    SqlConnection con = new SqlConnection("Data Source=sample;Initial Catalog=ScriptManagement;User ID=sa;Password=abcde");
    con.Open();
    SqlCommand cmd = new SqlCommand("select ScriptName,UploadDate from ScriptDetails", con);

    using (SqlDataReader dataReader = cmd.ExecuteReader())
    {
        while (dataReader.Read())
        {
            dtScriptDetails.Load(dataReader);
        }
        dataReader.Close();
    }
    con.Close();
    return dtScriptDetails;
}

но я получил эту ошибку:

Неверная попытка вызова Чтение, когда читатель закрыт.

Я много искал, но не смог решить эту проблему. Любая помощь будет оценена.

  • 1
    Вы проверили строку подключения? Это нормально? Я имею в виду, можете ли вы подключиться к вашей базе данных, используя строку подключения, которую вы SqlConnection для SqlConnection ?
  • 0
    Да. Это работает нормально для другого метода, в котором я вставляю некоторые значения в БД.
Теги:
wcf

2 ответа

1
Лучший ответ

Метод DataTable.Load загружает все данные из считывателя. Вам не нужно прокручивать ни одну из строк в вашем читателе. Таким образом, в вашем коде вы можете удалить цикл и иметь что-то вроде этого:

using (SqlDataReader dataReader = cmd.ExecuteReader())
    {
            dtScriptDetails.Load(dataReader);
     }
  • 0
    Благодарю. Это решило мою проблему, но теперь при получении данных я получаю сообщение об ошибке: Произошла ошибка при получении HTTP-ответа на localhost: 62476 / DeploymentMangerService.svc . Это может быть связано с тем, что привязка конечной точки службы не использует протокол HTTP. Это также может быть связано с тем, что сервер прерывает контекст HTTP-запроса (возможно, из-за закрытия службы). Смотрите журналы сервера для более подробной информации.
  • 0
    Мой код выглядит так: DeploymentMangerServiceClient objDeploymentMangerClient = new DeploymentMangerServiceClient (); DataTable dtScriptdetails = objDeploymentMangerClient.GetScriptDetails ();
1

Я не уверен, исправляет ли это проблему, но использует if+ HasRows вместо цикла + Read:

using (SqlDataReader dataReader = cmd.ExecuteReader())
{
    if (dataReader.HasRows)
    {
        dtScriptDetails.Load(dataReader);
    } // no need to close it if you use using
}

Однако я бы использовал SqlDataAdapter для заполнения таблицы:

SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(dtScriptDetails);
  • 0
    Это также работает в моем случае. Большое спасибо @Tim.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню