我正在使用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,但它可以转换它。
答案 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,'可以用参数替换。它仍然将多个参数组合成一个字符串对象,但它应该提供一定程度的安全性来防止注入攻击。