检索上一条记录并存储到文本框

时间:2018-01-16 07:17:22

标签: c# sql visual-studio

我正在使用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])
)

并打算检索上一条记录,并将前一条记录的ParameterAParameterB放入其各自的文本框中。有关表格目前有三行。

使用上面的链接问题,我尝试复制它并在按钮点击时运行我的代码。我根据答案尝试了两个查询字符串:

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构造或语句。

像我一样初学者,我不知道如何解决它。我错过了什么或者我该怎么做才能纠正这个问题?

2 个答案:

答案 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