我目前正在使用C#编写项目并使用MySql作为数据库。我目前在创建要在报告中显示的自定义DataTable时遇到问题。 额外信息:测试可以没有任何细胞和组合的组合。阀门进行测试 但是对于一次测试,它使用Vales的设定范围,并且在每次测试之前预定单元格。
结果表(样本)
TestID | CellID | ValveID | OutputValue1| OutputValue2 |
1 | 1 | 1 | 2.5 | 0.12 |
1 | 1 | 1 | 2.5 | 0.12 |
1 | 1 | 2 | 2.8 | 0.13 |
1 | 2 | 1 | 3.2 | 0.12 |
1 | 2 | 2 | 3.5 | 0.12 |
1 | 2 | 4 | 4.1 | 0.14 |
因此,举例来说,Valve 3未在此特定示例中进行测试。但如果需要可以使用。 基本上我的表行是根据此结果表动态生成的。
Test ID = 1
Valves
| 1 | 2 | 4 |
CellID |Out1 | Out2| Out1| Out2|Out1 | Out2|
1 | 2.5 | 0.12| 2.8 | 0.13| 2.9 | 0.12|
2 | 3.2 | 0.12| 3.5 | 0.12| 4.1 | 0.14|
Out1 = OutputValue1 Out2 = OutputValue2 任何人都可以通过指导我如何获得这种动态数据表的良好链接或解释来帮助我
答案 0 :(得分:0)
我根本没有对此进行测试,但我认为在Sql中为您提供的数据做这样的事情。
Select s.CellId,
(select s1.OutputValue1 From Sample s1 Where s1.CellId=s.CellId and s1.ValveId=1 and s1.TestId=s.TestId) as Valve1_Out1,
(select s1.OutputValue2 From Sample s1 Where s1.CellId=s.CellId and s1.ValveId=1 and s1.TestId=s.TestId) as Valve1_Out2,
(select s1.OutputValue1 From Sample s1 Where s1.CellId=s.CellId and s1.ValveId=2 and s1.TestId=s.TestId) as Valve2_Out1,
(select s1.OutputValue2 From Sample s1 Where s1.CellId=s.CellId and s1.ValveId=2 and s1.TestId=s.TestId) as Valve2_Out2,
(select s1.OutputValue1 From Sample s1 Where s1.CellId=s.CellId and s1.ValveId=4 and s1.TestId=s.TestId) as Valve4_Out1,
(select s1.OutputValue2 From Sample s1 Where s1.CellId=s.CellId and s1.ValveId=4 and s1.TestId=s.TestId) as Valve4_Out2
From Sample s
Where s.TestId=1
Group By s.CellId, s.TestId
Order By s.CellId
一旦加载到DataTable中,也可以在C#中操作服务器上的数据。有一个类似here(快速谷歌)的例子,它展示了如何在代码中创建DataTables。显然,你的要求不仅仅是一个直接的支点,而是原则相同。
答案 1 :(得分:0)
试试这个sql代码。我重新创建了一个类似于原始表的虚拟表。还需要创建一个UDF。剩下的代码可以作为存储过程的一部分进入。
set xact_abort on
begin tran
CREATE TABLE TestTable
(
TestId int not null,
CellId int not null,
valveid int not null,
op1 numeric(5,2) not null,
op2 numeric (5,2) not null
)
go
CREATE FUNCTION GetOutputString
(
@TestId INT,
@CellId INT
)
RETURNS VARCHAR(1000)
AS
BEGIN
DECLARE @output VARCHAR(1000)
SELECT @output = ISNULL(@output + ';','')
+
CAST(valveid AS VARCHAR(5)) + '#'
+
CAST(op1 as VARCHAR(10))+ ','
+
CAST(op2 as VARCHAR(10))
FROM TestTable
WHERE TestId = @testid
AND cellid = @cellid
RETURN @output
END
go
-- insert dummy data
INSERT INTO TestTable
SELECT 1, 1, 1, 2.5, .12
UNION
SELECT 1, 1, 2, 2.8, .13
UNION
SELECT 1, 2, 1, 3.2, .12
UNION
SELECT 1, 2, 2, 3.5, .12
UNION
SELECT 1, 2, 4, 4.5, .13
-- create temp table/table variable depending on the size of the actual table.
DECLARE @tmp TABLE (
TestId int not null,
CellId int not null,
OutputString VARCHAR(1000) null
)
INSERT INTO @tmp (TestId, CellId)
SELECT TestId, CellId
FROM TestTable
GROUP BY TestId,CellId
UPDATE @tmp
SET OutputString = dbo.GetOutputString(TestId, CellId)
SELECT * FROM @tmp
rollback
它的作用是为每个valveid返回以分号分隔的输出值值。 当然在前端,你必须编写将valveid标识为分号(;)和散列(#)之间的数字的代码。 以下是上面SQL生成的输出:
1 1 1#2.50,0.12;2#2.80,0.13
1 2 1#3.20,0.12;2#3.50,0.12;4#4.50,0.13