0

我正在使用 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 中实现类似的东西。

我尝试创建数据绑定列表框控件,并启用多项选择,然后将它们的值用作查询中的参数,但这仅返回选择的第一个项目。我也试过用谷歌搜索答案,但我不太确定如何表达这个问题。

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

4

3 回答 3

0

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

于 2013-06-17T18:24:54.193 回答
0

最好的方法之一将是以下

1)您需要以逗号分隔的方式将用户选择作为 SQL Server 中的参数发送。(例如:“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 回答
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”。它仍然将多个参数组合到一个字符串对象中,但它应该提供一定程度的安全性以防止注入攻击。

于 2013-06-18T13:28:42.140 回答