SqlDataReader之后的所有代码.已跳过ExecuteReader

本文关键字:ExecuteReader 代码 之后 SqlDataReader | 更新日期: 2023-09-27 18:12:27

我有以下功能:

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

然后跳过函数的其余部分。

SqlDataReader之后的所有代码.已跳过ExecuteReader

我的钱花在调用堆栈中更高级别的一个方法上,该方法正在吞噬异常,因为该方法本应抛出一个异常,因为连接尚未打开。这是你最大的问题。

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

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

您必须先打开连接,然后才能尝试使用它。移动连接。在命令上方打开((。ExecuteReader((调用。

我只能推测,在执行读取器之前,您需要打开连接,并且它正在跳过,因为正在抛出异常。

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

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

 using(qlConnection connection = new SqlConnection(connectionString))
 {
  using(SqlCommand command = new SqlCommand(selectString,connection))
  {
     connection.Open();
     reader = command.ExecuteReader(); 
     // rest of your code.
   }
}
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"做什么?我看到你在增加它,但没有对它做任何事情。