2017-01-05 24 views
-1

私は前にこのようなことをしたことは一度もありません。それに単一の整数を渡すだけで動作しますが、POSITION_IDに使用する必要があるリストがあります。このリストには例えば1,2,3などがあります。これにより例外The specified object must not be an instance of a generic typeExecuteParameterQueryからスローされます。リストが関わっているときにこれをやる方法がわからない。SQL Selectステートメントwhere = 'List'?

ヘルプの変更点。

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); 
} 

Iエラー私の代わりにresults.addresults = this.ExecuteParameterQuery(query, queryParameters);を使用していないが、私はそれがここに私の問題だとは思わない場合。

それはまだ元のエラーにThe specified object must not be an instance of a generic type

を生成し、これは私がそれを呼び出す方法です。 positionIDのリストを使用する必要がある前にもう一度働いた

私はまだ「new」を提案したものを理解しようとしていますが、それをまだ発見していないだけです。それが今で動作しますが、代わりに私が多くの行番号の結果を与えるLINE2にある何らかの理由

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); 
} 

、それはちょうど私の最後の行番号から結果が得られます。

回線2は、1,2,3を持っているのであれば、私は行番号は行番号はそれはのように私には見えます3.

+0

を試してみてください – STLDeveloper

+0

line2の1行に1回正しく入力してください。 – Lee

+0

SQLを使用する方法については、in節を参照してください。 http://www.w3schools.com/sql/sql_in.asp – Hakunamatata

答えて

0

です代わりに、私はちょうど結果を得る1 2と3であるすべての行からSQLの結果を取得する必要があります問題は、あなたがあなたがあなたがリストでに反復されているだけのアイテムにこれを変更してみなければならないで...

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

パラメータとしての整数の全体のリストを渡ししようとしているです。このように...

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

リスト全体を反復処理する前に戻ってきます(STLDeveloperは質問コメントに記載されています)。その返信文をforeachループから移動したい場合

2

私はあなたが探しているものだと思います。各反復の結果を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; 
} 

の思考のための食品:書かれたように、これは回線2リスト内の各要素に対して1つのデータベースクエリ/ラウンドトリップを実行します。 Line2の各要素を指定するwhere句を使用して、1つのクエリだけを実行することをお勧めします。これははるかに効率的ですが、このルーチンの呼び出し側に返された結果を準備するコードが増えます。あなたはline` `ごとに一度これを実行する

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

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

は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); 
} 

回線2を一覧でSTLから借りて、あなたはまだそれを使用しています`line2`で、右か?あなたのクエリの実行をループ内で動かす必要があります。

+0

ありがとうございました。あなたは正しいです!私はあまりにも長い間休暇を過ごしていたと思います! @Lee - あなたの関数のより正確な実装についてのパパラッチの答えを見てください。 – STLDeveloper

+0

@Paparazzi 'results.add'がどこにあるのか何かで' Error \t CS0165 \t未割り当てのローカル変数 'results''が使用されています。'から変換できません 'System.Collections.Generic.List > 'から' System.Collections.Generic.Dictionary '' – Lee

+0

@あなたはそれを新しくしようとしましたか? – Paparazzi

関連する問題