2017-02-16 11 views
0

私は入力としていくつかの検索パラメータ(OrderIDLineNumber)を持つMS AccessデータベースにリンクされているWebアプリケーションでOleDB接続を持っています。これは最後の年にうまくいった。OleDbcommand:パラメータ付きのIn節の使い方?

複数のLineNumbers(たとえば、2,3,8)の検索を有効にするよう依頼されました。 私はこれをハードコードした場合、それは当然のことながら作品:

and ([Position] in ('2','3','8') or @LINENUM ='') 

どのように私は、カンマ区切りの文字列として指定された入力フォーマットを使用して動的にこれを達成することができますか?

LineNumbersの文字列をC#でOleDBコマンド文字列の外に作成してからパラメータを渡そうとしましたが、動作しません。

and ([Position] in @LineNumbers or @LINENUM ='') 

私はまた、同様のOleDbCommand内部LineNumbersでテーブルを作成しようとしていた。

DECLARE @LineNumber TABLE (Value INT) 
INSERT INTO @LineNumber VALUES (2) 
INSERT INTO @LineNumber VALUES (3) 
INSERT INTO @LineNumber VALUES (8) 

and ([Position] IN (SELECT Value FROM @LineNumber)) 

が、その後エラー

「無効なSQL文;予想は、 '削除'、 'INSERT'、 'PROCEDURE'、 'SELECT'、または 'UPDATE' "

ぶつかる。

どうすればいいですか?


これは以下のように私のコードが見えるものです:C#でこのような何かに

and ([Position] in @LineNumbers or @LINENUM ='') 

:私はあなたがこの行を変更する必要があると思う

string SelectOleDb = @"SELECT SalesID, CertificationID, CalibrationDate, Path 
         FROM Zeugnis WHERE (SalesID = @SALESID or @SALESID = '') 
           and ([Position] = @LINENUM or @LINENUM ='') 

         UNION ALL 

         SELECT SalesID, CertificationID, CalibrationDate, Path 
         FROM Zeugnis_2016 WHERE (SalesID = @SALESID or @SALESID = '') 
           and ([Position] = @LINENUM or @LINENUM ='') 

         UNION ALL 

         SELECT SalesID, CertificationID, CalibrationDate, Path 
         FROM Zeugnis_2015 WHERE (SalesID = @SALESID or @SALESID = '') 
           and ([Position] = @LINENUM or @LINENUM ='') 
         ORDER BY CalibrationDate, CertificationID"; 

OleDbConnection con = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\\XXXXXXXX"); 
OleDbCommand cmd = new OleDbCommand(); 
OleDbDataAdapter da = new OleDbDataAdapter(); 
cmd = new OleDbCommand(SelectOleDb, con); 
cmd.CommandType = CommandType.Text; 
cmd.Parameters.AddWithValue("SALESID", SALESID.Text); 
cmd.Parameters.AddWithValue("LINENUM", LINENUM.Text); 

答えて

1

string LineNumber = "('2','3','8')"; // build this string dynamically 

string sqlCondition = " and ([Position] in " + LineNumbers + " or @LINENUM ='')"; 

次に、を連結します。 0文字列をメインのSELECT文字列に変換します。

完全な例が必要な場合は、OleDBを介してSQLクエリを実行する完全なコードスニペットを投稿してください。

+0

[位置]は選択文字列内の列なので、sqlCondition文字列では静的に使用できません。あるいは、クエリを動的に構築して実行するようなものを提案していますか?私はこれがOdeDbではうまくいかないと思います。 – Barnabeck

+0

@Barnabeckはい、この 'string SelectOleDb'文字列を動的に構築し、このパラメータを使用しないことを提案します' cmd.Parameters.AddWithValue( "LINENUM"、LINENUM.Text); 'IN句に可能な値のリストを渡す。 – andrews

+0

今すぐ手に入れました!ありがとうございました。あなたのヒントがDynamicSQLを指していると思っていたので、私は混乱しました。 – Barnabeck