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
然后跳过函数的其余部分。
我的钱花在调用堆栈中更高级别的一个方法上,该方法正在吞噬异常,因为该方法本应抛出一个异常,因为连接尚未打开。这是你最大的问题。
您遇到的下一个问题是,您的连接与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"做什么?我看到你在增加它,但没有对它做任何事情。