Я получаю этот SQL A ошибка транспортного уровня, но не все время - PullRequest
1 голос
/ 02 февраля 2012

Я пытаюсь запросить данные из базы данных, и иногда я получаю эту ошибку в своем журнале:

При получении результатов с сервера произошла ошибка транспортного уровня.(провайдер: провайдер TCP, ошибка: 0 - дескриптор недействителен.) Код находится внутри блока try-catch.Что странно, так это то, что я не получаю эту ошибку все время.Блок catch действительно выполняется.

Однако, независимо от того, получаю я ошибку или нет, выпадающие списки, которые я пытаюсь заполнить, не заполняются.Похоже, что данные не возвращаются из запроса.

Я устанавливаю соединение с базой данных, там есть данные, я могу открыть соединение и выполнить запросы к базе данных.База данных находится на той же машине, на которой я запускаю код.

Кроме того, код работает, когда я подключаюсь к базе данных на сервере, но я пытаюсь заставить работать локальную базу данных, когда я неиметь подключение к серверу.Мне просто нужно внести изменения в строку подключения, когда я хочу запустить из локальной базы данных.

Вот функция, которая запрашивает базу данных

public static void QueryDB(string query)
    {
        cmd = new SqlCommand();
        cmd.CommandText = query;
        cmd.Connection = MyConn;
        if (dr != null) dr.Dispose();
        dr = cmd.ExecuteReader();
    }

Вот строка подключения кподключиться к базе данных:

MyConn = new SqlConnection("Data Source=tcp:localhost; Database=EscalationManagementSystem; Integrated Security=true;");

Есть ли неправильная настройка или это может быть ошибка в коде.

Заранее спасибо.

Ответы [ 3 ]

3 голосов
/ 02 февраля 2012

Такая ошибка обычно появляется, когда ваше соединение с экземпляром сервера Sql сбрасывается.

Причина может быть связана с сбросом сетевого соединения.

Другая причина может быть:

Вы запрашиваете SQL Server и получаете данные из пула соединений.Теперь что-то плохое происходит с SQL Server (перезапуск службы), и вы делаете обратную передачу для получения данных.

Убедитесь, что ваше соединение не разрывается между последующими запросами.

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

2 голосов
/ 02 февраля 2012

Я думаю, что это ошибка в вашем коде. Я не думаю, что у вас должен быть один SqlDataReader и SqlCommand, который используется всеми вызовами базы данных.

Вместо этого вы должны создавать новые SqlDataReader и SqlCommand для каждого вызова базы данных и располагать (и закрывать) их, когда приложение завершит этот конкретный вызов SQL.

Мое предположение относительно того, что происходит в вашей ситуации, заключается в том, что SqlDataReader или SqlCommand вытаскивается из-под вас другим вызовом базы данных, и что проблема носит прерывистый характер, потому что это состояние гонки.

0 голосов
/ 13 июля 2016

Эта проблема связана с тем, что вы не освободили соединение с базой данных. Просто добавьте оператор Finally в ваш код и добавьте conn.Close() и conn.Dispose(). Я уверен, что это будет работать нормально.

finally 
{
    cmd.Connection.Close();
    cmd.Connection.Dispose();
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...