跳过SqlDataReader.ExecuteReader后的所有代码

时间:2011-10-25 15:36:09

标签: c# visual-studio-2010 ado.net sqldatareader

我有以下功能:

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 个答案:

答案 0 :(得分:1)

我很惊讶它没有抛出异常,但你需要在执行阅读器之前打开连接。

答案 1 :(得分:1)

我的钱是在调用堆栈中吃掉异常的一个方法,因为这应该抛出一个因为没有打开连接。那是你最大的问题。

您遇到的下一个问题是您的连接与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)。

答案 2 :(得分:0)

您必须在尝试使用之前打开连接。在您的command.ExecuteReader()调用上方移动connection.Open()。

答案 3 :(得分:0)

您需要在调用ExecuteReader之前打开连接。

此外,您不会将连接分配给SqlCommand。你需要这样做:

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

     // rest of your code.
   }
}

答案 4 :(得分:0)

我只能猜测你需要在执行阅读器之前打开你的连接,并且因为正在抛出异常而正在跳过它。

答案 5 :(得分:0)

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'做了什么?我看到你正在增加它,但没有做任何事情。