在asp.net中查询多个可能的ID

时间:2013-06-17 18:21:59

标签: c# asp.net visual-studio-2010 sql-server-2008

我正在使用asp.net编写一个网站,我的任务是提供存储在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%的图表上(用于查看趋势,例如“我们总共产生的数量不是很多)在五月“)这只是一个查询:

SELECT * FROM Mode_History

有时我们只想查看一台机器的历史记录,这也很简单:

SELECT * FROM Mode_History WHERE (Machine_ID = ?)

但是,我的目标是允许最终用户选择多台计算机,并在过去几天内查看所有计算机的数据。如果我只是编写查询,它基本上是:

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

但是,我不知道如何在asp.net中实现类似的功能。

我尝试创建数据绑定列表框控件,然后启用多个选择,然后将它们的值用作查询中的参数,但这只返回选定的第一个项目。我也试过Google-ing来回答这个问题,但我不太清楚如何说出这个问题。

所以,我的问题是:在asp.net中实现这一目标的最佳方法是什么?我主要在C#工作,所以我非常感谢C#中的答案。我很了解VB,但它可以转换它。

3 个答案:

答案 0 :(得分:0)

常规方法是根据您的场景变化在后面的代码中组装所需的SQL查询。

答案 1 :(得分:0)

最好的方法之一将是以下

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

答案 2 :(得分:0)

如果您不介意没有参数化查询(对于int安全),则有一种可能性:

SELECT * FROM Mode_History WHERE Machine_ID IN (100, 102)

这里," 100,102"可以作为变量附加到查询字符串。

或者,如果您需要参数,请使用字符串变量:

SELECT * FROM Mode_History WHERE ',100,102,' LIKE '%,' + Machine_ID + ',%'
-- SELECT * FROM Mode_History WHERE @ParamString LIKE '%,' + Machine_ID + ',%'

这里,单个字符串',100,102,'可以用参数替换。它仍然将多个参数组合成一个字符串对象,但它应该提供一定程度的安全性来防止注入攻击。