Весь код после SqlDataReader.ExecuteReader пропущен - PullRequest
1 голос
/ 25 октября 2011

У меня есть следующая функция:

private void populate()
    {
        String connectionString = Properties.Settings.Default.Database;

        String selectString = "select artikelnummer, omschrijving from Artikels";

        SqlDataReader reader = null;

        SqlConnection connection = new SqlConnection(connectionString);
        SqlCommand command = new SqlCommand(selectString);

        reader = command.ExecuteReader();
        connection.Open();
        int x = 0;
        while (reader.Read())
        {
            String item = String.Empty;
            item = Convert.ToString(reader["Artikelnummer"]) + "\t" + Convert.ToString(reader["Omschrijving"]);
            x++;
            listboxGeselecteerd.Items.Add(item);
        }            
    }

Все, что следует после reader = command.ExecuteReader();, пропускается.

Есть ли что-то, что я сделал неправильно?

ОБНОВЛЕНИЕ: Перемещено connection.Open(); в нужное место.Теперь, когда я достигаю этой строки, мой вывод показывает Step into: Stepping over non-user code 'System.Data.SqlClient.SqlConnection.Open

, а затем пропускает оставшуюся часть функции.

Ответы [ 6 ]

1 голос
/ 25 октября 2011

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

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

Наконец, connection.Open();должно быть до ExecuteReader.

Кроме того, вам действительно следует использовать using блоки.

{
    String connectionString = Properties.Settings.Default.Database;

    String selectString = "select artikelnummer, omschrijving from Artikels";

    SqlDataReader reader = null;

    using (SqlConnection connection = new SqlConnection(connectionString))
    /* you also need to associate the connection with the command */
    using (SqlCommand command = new SqlCommand(selectString, connection))
    {
        connection.Open();
        reader = command.ExecuteReader();
        int x = 0;
        while (reader.Read())
        {
            String item = String.Empty;
            item = Convert.ToString(reader["Artikelnummer"]) + "\t" + Convert.ToString(reader["Omschrijving"]);
            x++;
            listboxGeselecteerd.Items.Add(item);
        }            
    }
}

Как насчет простой отладки в стиле "printf" и публикациивы получаете исключение?

try
{
   connection.Open();
   ... 
}
//catch (Exception e)
catch (SqlException e)
{
    // at least one of these..
    Console.WriteLine(e);
    MessageBox.Show(e);
    Debug.WriteLine(e);

    var inner = e.InnerException;
    while (inner != null)
    {
         //display / log / view
         inner = inner.InnerException;
    }
}

Учитывая, что текст исключения из комментариев (A first chance exception of type 'System.Data.SqlClient.SqlException' occurred in System.Data.dll) больше похож на сообщение, которое вы получили непосредственно перед тем, как появилось реальное сообщение, я бы поймал исключение SqlException и проверилInnerException (s).

1 голос
/ 25 октября 2011

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

0 голосов
/ 25 октября 2011
private void populate(){
    String connectionString = Properties.Settings.Default.Database;
    String commandString = "SELECT artikelnummer, omschrijving FROM Artikels";
    using (SqlConnection cn = new SqlConnection(connectionString)){
        using (SqlCommand cm = new SqlCommand(commandString, cn)){
            cn.Open();
            SqlDataReader dr = cm.ExecuteReader();
            int x = 0;
            while (dr.Read()){
                String item = String.Empty;
                item = Convert.ToString(dr["Artikelnummer"]) + "\t" + Convert.ToString(dr["Omschrijving"]);
                x++;
                listboxGeselecteerd.Items.Add(item);
            }
        }
    }
}

Кстати, что вы делаете с int x? Я вижу, что вы увеличиваете его, но ничего не делаете с ним.

0 голосов
/ 25 октября 2011

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

0 голосов
/ 25 октября 2011

Вам необходимо открыть соединение перед вызовом ExecuteReader.

Кроме того, вы не назначаете свое соединение SqlCommand.Вам нужно сделать это так:

 using(qlConnection connection = new SqlConnection(connectionString))
 {
  using(SqlCommand command = new SqlCommand(selectString,connection))
  {
     connection.Open();
     reader = command.ExecuteReader(); 

     // rest of your code.
   }
}
0 голосов
/ 25 октября 2011

Вы должны открыть соединение, прежде чем пытаться его использовать.Переместите connection.Open () над вашей командой. Вызов ExecuteReader ().

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