0

私は asp.net を使用して Web サイトを作成しており、SQL サーバーに格納されているデータのヒストグラムを提供する任務を負っています。

必要な情報は、次のようなテーブルに格納されます。

Date | Value | Machine_ID
--------------------------
04   | 102   | 1
05   | 105   | 1
06   | 106   | 1
04   | 103   | 2
05   | 103   | 2
06   | 185   | 2
04   | 100   | 3
05   | 99    | 3
06   | 182   | 3

私が直面している問題はこれです - すべてのマシンの値を表示したい場合があり、通常は 100% に正規化されたグラフで表示されます (傾向を表示するために使用されます。 of May") は、次のような単なるクエリです。

SELECT * FROM Mode_History

また、1 台のマシンだけの履歴を表示したい場合もありますが、これも簡単です。

SELECT * FROM Mode_History WHERE (Machine_ID = ?)

しかし、私の目標は、エンド ユーザーが複数のマシンを選択し、過去数日間に結合されたすべてのマシンのデータを表示できるようにすることです。クエリを書いているだけなら、基本的には次のようになります。

SELECT * FROM Mode_History WHERE (Machine_ID = 100) OR (Machine_ID = 102)

しかし、asp.netで同様のことを達成する方法がわかりません。

データ バインドされたリスト ボックス コントロールを作成し、複数選択を有効にしてから、それらの値をクエリのパラメーターとして使用しようとしましたが、最初に選択された項目のみが返されます。答えを得るために Google も試しましたが、質問の言い回しがよくわかりません。

だから、私の質問は: asp.net でこれを達成するための最良の方法は何ですか? 私は主にC#で作業しているので、C#での回答をいただければ幸いです。ただし、VBを変換するのに十分理解しています。

4

3 に答える 3

0

最良のアプローチの1つは次のとおりです

1)SQLサーバーのパラメーターとして、ユーザー選択をカンマ区切りで送信する必要があります。(例: "100,200")

2) 次のストアド プロシージャを作成する必要があります。

DECLARE @input VARCHAR(500) = '100,200'
DECLARE @UINPUT AS TABLE
(
    value INT
)

INSERT INTO @UINPUT 
SELECT PART FROM dbo.Split(@input,',')

-- GET THE RESULT
SELECT * 
FROM Mode_History AS MH
JOIN @UINPUT AS UN
ON   MH.Machine_ID = UN.value

3) ユーザー定義の分割関数は次のとおりです。

CREATE FUNCTION [dbo].[Split]
(
   @sString nvarchar(2048),
   @cDelimiter nchar(1)
)
RETURNS @tParts TABLE ( part nvarchar(2048) )
AS
BEGIN
IF @sString IS NULL RETURN

DECLARE     @iStart INT,
            @iPos INT
IF SUBSTRING(@sString,1,1) = @cDelimiter 
BEGIN
    SET     @iStart = 2
    INSERT INTO @tParts
    VALUES(NULL)
END
ELSE 
    SET @iStart = 1
WHILE 1=1
BEGIN
    SET @iPos = CHARINDEX(@cDelimiter,@sString,@iStart)
    IF @iPos = 0
        SET @iPos = LEN(@sString)+ 1
    IF @iPos - @iStart > 0                  
        INSERT INTO @tParts
        VALUES(SUBSTRING(@sString,@iStart,@iPos-@iStart))
    ELSE
        INSERT INTO @tParts
        VALUES(NULL)
    SET @iStart = @iPos+1
    IF @iStart > LEN(@sString) 
        BREAK
end
RETURN

END
于 2013-06-17T18:37:54.800 に答える