我正在使用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();
}
}
预期输出未启动,即文本框保持为空或无值。我也尝试将两者都运行到数据库的数据集中,并出现以下错误:
不支持OVER SQL构造或语句。
像我一样初学者,我不知道如何解决它。我错过了什么或者我该怎么做才能纠正这个问题?
答案 0 :(得分:0)
基于this post,包含别名可能会解决您的问题。因此,您的子查询将看起来像这样:
const myArray = [ function alerter() { alert('Hello!'); } ];
myArray[0](); //my expression
答案 1 :(得分:0)
根据您的表定义和代码,您希望获得给定testnumber的先前记录。然后,您不需要使用over
或其他任何复杂的查询。
此查询足够
SELECT TOP 1 * FROM [tblTest1] WHERE TestNumber < @testnumber ORDER BY TestNumber DESC