【问题标题】:Getting the second record where the sql query is satisfied获取满足sql查询的第二条记录
【发布时间】:2015-04-25 00:09:07
【问题描述】:

我正在尝试使用数据库中的任务名称填充我的列表框,其中优先级等于我的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;
                }
            }
        }
    }
}

【问题讨论】:

  • 这是您使用的确切查询吗?我觉得你正在使用的查询是罪魁祸首。
  • @PaulFrancis 是的,我是,为什么有什么问题?
  • 根据您的问题,我只是认为查询可能会返回超出您预期的内容。但是,如果您使用的是完全相同的查询,那么您可能需要进行一些调试,看看哪里出了问题。
  • @PaulFrancis 在这种情况下,sql 很好,我已经调试过了,它出错的唯一原因是我的数据库中有两个值满足查询但我想要一次显示一个,因为没有中断;如果它们都循环,它会循环显示它们两次,并带有中断;它只显示第一条记录两次,而我希望它显示第一条记录然后显示第二条记录

标签: c# sql ms-access oledb


【解决方案1】:

我通过在 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

        }
  }

【讨论】:

    【解决方案2】:

    如果您想避免两次返回相同的名称,可以将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]); 
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-26
      • 1970-01-01
      • 1970-01-01
      • 2016-05-19
      • 2018-07-27
      • 1970-01-01
      • 2018-06-12
      • 2020-07-02
      相关资源
      最近更新 更多