我正在使用 C# 在 Visual Studio 2017 中开发一个项目,它显示和保存测试结果并比较当前和以前的记录,尽管我创建了一个试用解决方案文件来简化表格。
其中一个功能类似于this question除了我的基于服务的数据库 dtbTrial
中有这张表:
CREATE TABLE [dbo].[tblTest1]
(
[TestNumber] NUMERIC(8) NOT NULL PRIMARY KEY,
[ParameterA] REAL NULL,
[ParameterB] REAL NULL,
CONSTRAINT [FK_tblTest1_tblTestMain] FOREIGN KEY ([TestNumber]) REFERENCES [tblTestMain]([TestNumber])
)
并打算取回上一条记录,将上一条记录的ParameterA
和ParameterB
分别放入各自的文本框。相关表格目前有三行。
使用上面的链接问题,我尝试复制它并在单击按钮时运行我的代码。我根据答案尝试了两个查询字符串:
WITH dbo AS
(SELECT *, ROW_NUMBER() OVER (PARTITION BY TestNumber ORDER BY TestNumber) row_num FROM tblTest1)
SELECT a.TestNumber,
a.ParameterA, (SELECT MAX(b.ParameterA) FROM dbo b WHERE b.TestNumber = a.TestNumber AND b.row_num < a.row_num) AS PrevParameterA,
a.ParameterB, (SELECT MAX (b.ParameterB) FROM dbo b WHERE b.TestNumber = a.TestNumber AND b.row_num < a.row_num) AS PrevParameterB
FROM dbo a WHERE TestNumber = @testnumber"
和
SELECT TestNumber, ParameterA, LAG(ParameterA) OVER (PARTITION BY TestNumber ORDER BY TestNumber) PrevParameterA, ParameterB, LAG(ParameterB) OVER (PARTITION BY TestNumber ORDER BY TestNumber) PrevParameterB FROM tblTest1 WHERE TestNumber = @testnumber
然后运行以下代码:
using (SqlConnection con = new SqlConnection(constring))
{
using(SqlCommand cmd = new SqlCommand(query, con))
{
cmd.Parameters.AddWithValue("@testnumber", testNumberTextBox.Text);
con.Open();
SqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
textBox2.Text = (dr["PrevParameterA"].ToString());
textBox1.Text = (dr["PrevParameterB"].ToString());
}
con.Close();
}
}
预期的输出没有启动,即文本框保持为空或没有值。我也尝试同时运行到数据库的数据集并出现以下错误:
The OVER SQL construct or statement is not supported.
像我这样的初学者,我不知道如何修复它。我错过了什么或者我应该怎么做才能纠正这个问题?
最佳答案
根据您的表定义和代码,您希望获取给定测试编号的先前记录。然后您不需要使用 over
或其他任何复杂的查询。
这个查询对你来说足够了
SELECT TOP 1 * FROM [tblTest1] WHERE TestNumber < @testnumber ORDER BY TestNumber DESC
关于c# - 检索以前的记录并存储到文本框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48275852/