获取满足 sql 查询的第二条记录
Getting the second record where the sql query is satisfied
我正在尝试用数据库中的任务名称填充我的列表框,其中优先级等于我 List<object>
中的一个项目。
下面的代码填充了列表框,但错误是在我的数据库中我有两条优先级为 1 的记录,因此它只找到第一条记录并将其输出两次。为了修复之前的错误,即它两次显示两条记录,我添加了 break;
现在只显示满足 sql 查询的第一条记录。
我这样做是因为用户可以选择按优先级排序,所以我获取所有优先级值并将它们存储在 List<object>
中,通过冒泡排序实现对它们进行排序,然后执行下面的代码以用户想要的顺序将它们输出回列表框。
所以我的问题是,如何正确输出数据库中的所有记录?
for (int i = 0; i < list.Count; i++)
{
string sql = "SELECT [Task Name] FROM Tasks WHERE Priority = " + Convert.ToInt32(list[i].GetValue(0));
using (OleDbCommand cmd = new OleDbCommand(sql, conn))
{
using (OleDbDataReader dataReader = cmd.ExecuteReader())
{
List<object[]> taskNameList = new List<object[]>();
if (dataReader.HasRows) //if the table isnt empty
{
while (dataReader.Read()) //loop to the end of the database
{
object[] tasks = new object[dataReader.FieldCount]; //object array of same length as the amount of task names in database
taskNameList.Add(tasks);
for (int j = 0; j <= dataReader.FieldCount - 1; j++)
{
tasks[j] = dataReader[j]; //fill object array with task names
}
taskList.Items.AddRange(tasks); //add to list box
break;
}
}
}
}
}
我通过在 while 循环中放置一个 if 语句来解决这个问题,以在我将它添加到列表框之前测试列表框是否已经包含任务名称。下面代码如下:
while (dataReader.Read()) //loop to the end of the database
{
if (taskList.Items.Contains(dataReader[0]) == false) //so that it doesn't duplicate records in the list box that satisfy the priority value
{
object[] tasks = new object[dataReader.FieldCount]; //object array of same length as the amount of task names in database
taskNameList.Add(tasks);
for (int j = 0; j <= dataReader.FieldCount - 1; j++)
{
tasks[j] = dataReader[j]; //fill object array with task names
}
taskList.Items.AddRange(tasks); //add to list box
}
}
如果您想避免两次返回相同的名称,您可以将 Distinct
添加到您的查询中。
此外,因为您只返回一列,所以您应该能够将代码进一步简化为:
for (int i = 0; i < list.Count; i++)
{
string sql = "SELECT Distinct [Task Name] FROM Tasks WHERE Priority = " + Convert.ToInt32(list[i].GetValue(0));
using (OleDbCommand cmd = new OleDbCommand(sql, conn))
using (OleDbDataReader dataReader = cmd.ExecuteReader())
{
while (dataReader.Read())
taskList.Items.Add((string) dataReader[0]);
}
}
我正在尝试用数据库中的任务名称填充我的列表框,其中优先级等于我 List<object>
中的一个项目。
下面的代码填充了列表框,但错误是在我的数据库中我有两条优先级为 1 的记录,因此它只找到第一条记录并将其输出两次。为了修复之前的错误,即它两次显示两条记录,我添加了 break;
现在只显示满足 sql 查询的第一条记录。
我这样做是因为用户可以选择按优先级排序,所以我获取所有优先级值并将它们存储在 List<object>
中,通过冒泡排序实现对它们进行排序,然后执行下面的代码以用户想要的顺序将它们输出回列表框。
所以我的问题是,如何正确输出数据库中的所有记录?
for (int i = 0; i < list.Count; i++)
{
string sql = "SELECT [Task Name] FROM Tasks WHERE Priority = " + Convert.ToInt32(list[i].GetValue(0));
using (OleDbCommand cmd = new OleDbCommand(sql, conn))
{
using (OleDbDataReader dataReader = cmd.ExecuteReader())
{
List<object[]> taskNameList = new List<object[]>();
if (dataReader.HasRows) //if the table isnt empty
{
while (dataReader.Read()) //loop to the end of the database
{
object[] tasks = new object[dataReader.FieldCount]; //object array of same length as the amount of task names in database
taskNameList.Add(tasks);
for (int j = 0; j <= dataReader.FieldCount - 1; j++)
{
tasks[j] = dataReader[j]; //fill object array with task names
}
taskList.Items.AddRange(tasks); //add to list box
break;
}
}
}
}
}
我通过在 while 循环中放置一个 if 语句来解决这个问题,以在我将它添加到列表框之前测试列表框是否已经包含任务名称。下面代码如下:
while (dataReader.Read()) //loop to the end of the database
{
if (taskList.Items.Contains(dataReader[0]) == false) //so that it doesn't duplicate records in the list box that satisfy the priority value
{
object[] tasks = new object[dataReader.FieldCount]; //object array of same length as the amount of task names in database
taskNameList.Add(tasks);
for (int j = 0; j <= dataReader.FieldCount - 1; j++)
{
tasks[j] = dataReader[j]; //fill object array with task names
}
taskList.Items.AddRange(tasks); //add to list box
}
}
如果您想避免两次返回相同的名称,您可以将 Distinct
添加到您的查询中。
此外,因为您只返回一列,所以您应该能够将代码进一步简化为:
for (int i = 0; i < list.Count; i++)
{
string sql = "SELECT Distinct [Task Name] FROM Tasks WHERE Priority = " + Convert.ToInt32(list[i].GetValue(0));
using (OleDbCommand cmd = new OleDbCommand(sql, conn))
using (OleDbDataReader dataReader = cmd.ExecuteReader())
{
while (dataReader.Read())
taskList.Items.Add((string) dataReader[0]);
}
}