ExecuteReader () делает программу выхода из класса - PullRequest
1 голос
/ 02 января 2012

У меня возникли некоторые проблемы при заполнении списка в форме окна из таблицы в sqlServer. Таблица представляет собой один столбец строковых значений, и, так как я многократно вызываю этот список значений в своем приложении, я настраиваю его как класс, и в конструкторе по умолчанию я заполняю ArrayList значениями из SQL таблица, следующим образом:

class cCaseType
{
    public ArrayList aValues = new ArrayList();

    public cCaseType()
    {
        string strConnection = BuildConnectionString();
        SqlConnection linkToDB = new SqlConnection(strConnection);
        string sqlText = "SELECT * FROM tblCaseTypes;";
        SqlCommand sqlComm = new SqlCommand(sqlText, linkToDB);
        SqlDataReader sqlReader = sqlComm.ExecuteReader();
        MessageBox.Show("Hi");
        while (sqlReader.Read())
        {
            aValues.Add(sqlReader["CaseType"].ToString());
        }
        sqlReader.Close();
        linkToDB.Close();
    }

    public string BuildConnectionString()
    {
        cConnectionString cCS = new cConnectionString();
        return cCS.strConnect;
    }
}

Теперь я знаю, что соединение с базой данных работает, потому что одно и то же соединение используется во всем приложении. Я знаю, что текст команды SQL является корректным, поскольку, когда я выполняю его в SQL Management Studio, он возвращает все значения в таблице, как и ожидалось. Однако программа просто завершает работу в ExecuteReader (), поэтому ArrayList никогда не заполняется.

Мне было интересно, выходила ли программа из-за того, что цикл while пропускался из-за пустого результата от читателя, но он даже не достиг оператора while. Я доказал это, вставив MessageBox и установив точку останова. Программа никогда не открывает окно сообщения, доказывающее, что оно выходит из класса в операторе ExecuteReader.

Что, черт возьми, я делаю не так!

Как всегда, спасибо за любую помощь.

Ответы [ 3 ]

4 голосов
/ 02 января 2012

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

    SqlConnection linkToDB = new SqlConnection(strConnection);
    linkToDB.Open(); // <-------
    string sqlText = "SELECT * FROM tblCaseTypes;";
    SqlCommand sqlComm = new SqlCommand(sqlText, linkToDB);
    SqlDataReader sqlReader = sqlComm.ExecuteReader();
0 голосов
/ 02 января 2012

Если вы поддерживаете по одному dbConnection везде, то я уверен, что ExecuteReader, возможно, не закрылся должным образом в другом месте.

Я предлагаю вам использовать

MultipleActiveResultSets=True 

в строке подключения.

0 голосов
/ 02 января 2012

Оберните ваш код sqlReader.Read() в блок Try / Catch, и он должен стать очевидным.

По умолчанию - Visual Studio скрывает некоторые исключения.С помощью этого блока try / catch вы сможете пошагово пройти по коду и увидеть исключение, которое обычно говорит само за себя о том, что не так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...