【问题标题】:SQL Select statement where = 'List'?SQL Select 语句 where = 'List'?
【发布时间】:2017-01-05 22:14:42
【问题描述】:

我以前从未做过这样的事情,如果我只向它传递一个整数,它就可以工作,但我有一个需要用于 POSITION_ID 的列表。例如,该列表只有 1、2、3..等。这会从ExecuteParameterQuery 引发异常The specified object must not be an instance of a generic type。当涉及到列表时,我不确定是否/如何执行此操作。

通过帮助进行的更改。

public List<Dictionary<string, string>> SelectedLineHistory(string partProgram, string machineId, List<int> Line2, bool orderByDate = false)

{
    List<Dictionary<string, string>> results = new List<Dictionary<string, string>>();

    string query = "SELECT MACHINE_ID, PART_PROGRAM, POSITION_ID, DATE_TIME, SAVE_DATE_TIME,DWELL_STIME, ADJUSTED_AMOUNT, DWELL_OFFSET, EMPL_ID " +
                   "FROM MPCS.WJ_DWELL_OFFSETS_HIST " +
                   "WHERE PART_PROGRAM = ? and MACHINE_ID = ? and POSITION_ID = ? ";
    if (orderByDate)
    {
        query += " order by save_date_time desc, position_id asc";
    }

    List<OleDbParameter> queryParameters = new List<OleDbParameter>();

    foreach (var line in Line2)
    {
        queryParameters.Clear();
        queryParameters.Add(new OleDbParameter("PART_PROGRAM", partProgram));
        queryParameters.Add(new OleDbParameter("MACHINE_ID", machineId));
        queryParameters.Add(new OleDbParameter("POSITION_ID", Line));

        results = this.ExecuteParameterQuery(query, queryParameters);
    }
    return (results);
}

如果我不使用 results = this.ExecuteParameterQuery(query, queryParameters); 而不是 results.add 我会出错,但我认为这不是我的问题。

它仍然会产生原始错误The specified object must not be an instance of a generic type

我就是这样称呼它的。在需要使用 positionID 列表之前再次起作用

我仍在尝试找出我必须按照建议制作“新”的内容,但还没有发现它,但想保持更新。

public void SelectedHistory(bool showMessages = false)
{
    List<Dictionary<string, string>> resultHistory = new List<Dictionary<string, string>>();
    string machineId = cboMachine.Text.Trim().ToUpper();
    string partProg = cboPartPrograms.Text.Trim().ToUpper();

    lvViewHistory.Items.Clear();

    if (!String.IsNullOrEmpty(machineId) && !String.IsNullOrEmpty(partProg))
    {
        resultHistory = oracleConnection.SelectedLineHistory(partProg, machineId, Line2, true);

        if (resultHistory != null && resultHistory.Count > 0)
        {
            foreach (Dictionary<string, string> d in resultHistory)
            {
                ListViewItem lvi = new ListViewItem(d["MACHINE_ID"]);
                lvi.SubItems.Add(d["PART_PROGRAM"]);
                lvi.SubItems.Add(d["POSITION_ID"]);
                lvi.SubItems.Add(d["DATE_TIME"]);
                lvi.SubItems.Add(d["SAVE_DATE_TIME"]);
                lvi.SubItems.Add(d["DWELL_STIME"]);
                lvi.SubItems.Add(d["ADJUSTED_AMOUNT"]);
                lvi.SubItems.Add(d["DWELL_OFFSET"]);
                lvi.SubItems.Add(d["EMPL_ID"]);

                lvViewHistory.Items.Add(lvi);
            }
        }
        else
        {
            MessageBox.Show("No History Found");
        }
    }
    else
    {
        MessageBox.Show("Please select Machine_Id and Part Program");
    }

    lvViewHistory.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);
}

无论出于何种原因,它现在都可以工作,但它并没有给我在 line2 中有多少行号的结果,它只是给我最后一个行号的结果。

因此,如果 Line2 有 1,2,3,我应该从行号为 1 2 和 3 的所有行中获取 sql 结果,而不是仅获取行号为 3 的结果。

【问题讨论】:

  • 您想在line2 中的每个line 执行一次,对吧?您的查询执行需要移到循环内才能发生!
  • 第 2 行中每个行号一次正确的是
  • 阅读有关使用 SQL where in 子句的信息。 w3schools.com/sql/sql_in.asp
  • @STLDeveloper 已编辑,现在正确吗?
  • @Hakunamatata 谢谢你,我会看看这是否对我有帮助。

标签: c# sql oracle list


【解决方案1】:

我认为以下是您正在寻找的内容。请注意,它将每次迭代的结果添加到result 列表中。它还纠正了@omniowner 之前提到的缺陷。

public List<Dictionary<string, string>> SelectedLineHistory(string partProgram, string machineId, List<int> Line2, bool orderByDate = false)
{
    List<Dictionary<string, string>> results;
    string query = "";
    List<OleDbParameter> queryParameters = new List<OleDbParameter>();

    foreach (var line in Line2)
    {
        query = "SELECT MACHINE_ID, PART_PROGRAM, POSITION_ID, DATE_TIME, SAVE_DATE_TIME,DWELL_STIME, ADJUSTED_AMOUNT, DWELL_OFFSET, EMPL_ID ";
        query += "FROM MPCS.WJ_DWELL_OFFSETS_HIST ";
        query += "WHERE PART_PROGRAM = ? and MACHINE_ID = ? and POSITION_ID = ?";

        if (orderByDate)
        {
            query += " order by save_date_time desc, position_id asc";
        }

        queryParameters.Add(new OleDbParameter("PART_PROGRAM", partProgram));
        queryParameters.Add(new OleDbParameter("MACHINE_ID", machineId));

        /* in the following parameter, use this iteration's value, line,  *
         * rather than the entire collection, Line2                       */
        queryParameters.Add(new OleDbParameter("POSITION_ID", line));

        /**** this looks sketchy -- check it *****/
        results.Add(this.ExecuteParameterQuery(query, queryParameters));
    }
    return results;
}

深思熟虑:正如所写,这将为 Line2 列表中的每个元素执行一次数据库查询/往返。您可能更喜欢只执行一个查询,使用 where 子句指定 Line2 中的每个元素。这会更有效率,但需要更多的代码来准备返回给该例程调用者的结果。

【讨论】:

    【解决方案2】:

    在我看来,问题是您试图将整个整数列表作为参数传递...

    queryParameters.Add(new OleDbParameter("POSITION_ID", Line2));
    

    您应该尝试将其更改为仅在列表中迭代的项目。像这样……

    queryParameters.Add(new OleDbParameter("POSITION_ID", line));
    

    在完成对整个列表的迭代之前,您也将返回(正如 STLDevoper 在问题 cmets 中提到的那样)。您想将该 return 语句移出 foreach 循环

    【讨论】:

      【解决方案3】:

      借自 STL +1

      public List<Dictionary<string, string>> 
      SelectedLineHistory(string partProgram, string machineId, 
                          List<int> Line2, bool orderByDate = false)
      {
          List<Dictionary<string, string>> results = new List<Dictionary<string, string>>();
      
          string query = "SELECT MACHINE_ID, PART_PROGRAM, POSITION_ID, DATE_TIME, SAVE_DATE_TIME,DWELL_STIME, ADJUSTED_AMOUNT, DWELL_OFFSET, EMPL_ID " +
                         "FROM MPCS.WJ_DWELL_OFFSETS_HIST " +
                         "WHERE PART_PROGRAM = ? and MACHINE_ID = ? and POSITION_ID = ? ";
          if (orderByDate)
          {
              query += " order by save_date_time desc, position_id asc";
          }
      
          List<OleDbParameter> queryParameters = new List<OleDbParameter>();
      
          foreach (var line in Line2)
          {
              //actually should define parameter outside the loop and just assign the value here
              queryParameters.Clear();
              queryParameters.Add(new OleDbParameter("PART_PROGRAM", partProgram));
              queryParameters.Add(new OleDbParameter("MACHINE_ID", machineId));
              queryParameters.Add(new OleDbParameter("POSITION_ID", Line));
      
              results.Add(this.ExecuteParameterQuery(query, queryParameters));        
          }
          return (results);
      }
      

      Line2 是一个 List,你还在使用它

      queryParameters.Add(new OleDbParameter("POSITION_ID", Line2)); 
      

      试试

      queryParameters.Add(new OleDbParameter("POSITION_ID", Line));
      

      【讨论】:

      • 感谢您指出这一点。你是对的!我想我已经放假太久了! @Lee - 请参阅狗仔队的答案以获得更正确的功能实现。
      • @Paparazzi 关于results.add 所在位置的信息产生Error CS0165 Use of unassigned local variable 'results' 然后cannot convert from 'System.Collections.Generic.List&lt;System.Collections.Generic.Dictionary&lt;string, string&gt;&gt;' to 'System.Collections.Generic.Dictionary&lt;string, string&gt;'
      • @Lee 你会尝试更新它吗?
      • 我不确定你所说的更新是什么意思。我还在上面发布了我必须进行的更改,以免在错误列表窗口中出现错误,以便您可以看到该部分。
      • @Paparazzi 对不起,我不知道“新”是什么,因为它似乎不是一个词。我发布了我必须进行的更改以消除我遇到的错误,这甚至阻止了我运行代码。这让我回到了导致我首先发布这个问题的错误。所以我会以我调用所有这些的方式添加到 OP,也许这会有所帮助,但如果我知道在哪里寻找纠正这个错误,我永远不会发布。
      猜你喜欢
      • 1970-01-01
      • 2013-10-10
      • 1970-01-01
      • 1970-01-01
      • 2021-12-23
      • 1970-01-01
      • 2016-11-16
      • 2012-09-03
      • 2013-03-23
      相关资源
      最近更新 更多