Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用循环更新SQL Server表的每个现有行_C#_Asp.net_Sql Server - Fatal编程技术网

C# 使用循环更新SQL Server表的每个现有行

C# 使用循环更新SQL Server表的每个现有行,c#,asp.net,sql-server,C#,Asp.net,Sql Server,我正在尝试使用ASP.NET、C#更新SQL Server表中每一行的特定列 执行此代码时,我希望列中第一行的OrderNo为=1。从那时起,我希望表中其他现有行的OrderNo增加1 目前,我可以更新一行的OrderNo,但是我不能得到一个循环来正确地读取所有的行&我想要的增量 这是我桌子的结构 下面是我的简历: 以下是我需要更新订单号的原因: protected void Timer1_Tick(object sender, EventArgs e) { int i = (in

我正在尝试使用ASP.NET、C#更新SQL Server表中每一行的特定列

执行此代码时,我希望列中第一行的OrderNo为=1。从那时起,我希望表中其他现有行的OrderNo增加1

目前,我可以更新一行的OrderNo,但是我不能得到一个循环来正确地读取所有的行&我想要的增量

这是我桌子的结构

下面是我的简历:

以下是我需要更新订单号的原因:

  protected void Timer1_Tick(object sender, EventArgs e)
{
    int i = (int)ViewState["ImageDisplayed"];
    i = i + 1;
    ViewState["ImageDisplayed"] = i;
    DataRow imageDataRow = ((DataSet)ViewState["ImageData"]).Tables["image"].Select().FirstOrDefault(x => x["order"].ToString() == i.ToString());
    if (imageDataRow != null)
    {
        Image1.ImageUrl = "~/MyImages/" + imageDataRow["name"].ToString();
        lblImageName.Text = imageDataRow["name"].ToString();
        lblImageOrder.Text = imageDataRow["order"].ToString();
        lblImageDesc.Text = imageDataRow["Desc"].ToString();
    }
    else
    {
        SetImageUrl();
    }
}

private void SetImageUrl()
{
    DataSet ds = new DataSet();//Creating a dataset
    SqlDataAdapter da = new SqlDataAdapter("SELECT Name, [Order], [Desc] FROM tblImages", con);
    da.Fill(ds, "image");

    ViewState["ImageData"] = ds;//storing the dataset in a ViewState variable
    ViewState["ImageDisplayed"] = 1;//storing order number of the image currently displayed

    DataRow imageDataRow = ds.Tables["image"].Select().FirstOrDefault(x => x["order"].ToString() == "1");
    Image1.ImageUrl = "~/MyImages/" + imageDataRow["name"].ToString();
    lblImageName.Text = imageDataRow["name"].ToString();
    lblImageOrder.Text = imageDataRow["order"].ToString();
    lblImageDesc.Text = imageDataRow["Desc"].ToString();
}

我同意@jamice的观点,这似乎是个坏主意,但如果你真的想做的话,你不需要循环。下面是一个使用CTE和窗口函数的示例

示例

WITH T AS
    (   SELECT  
            *,
            ROW_NUMBER() OVER (ORDER BY ID) as RN
        FROM    YourTable
    )

/* this shows you the results of the CTE, 
   specifically the ROW_NUMBER() 
   which will replace the OrderNo in the code below */

SELECT * FROM T 
WITH T AS
(   SELECT  
        *,
        ROW_NUMBER() OVER (ORDER BY ID) as RN
    FROM    YourTable
)
UPDATE T
SET OrderNo = RN
运行此操作将更新您的表

WITH T AS
    (   SELECT  
            *,
            ROW_NUMBER() OVER (ORDER BY ID) as RN
        FROM    YourTable
    )

/* this shows you the results of the CTE, 
   specifically the ROW_NUMBER() 
   which will replace the OrderNo in the code below */

SELECT * FROM T 
WITH T AS
(   SELECT  
        *,
        ROW_NUMBER() OVER (ORDER BY ID) as RN
    FROM    YourTable
)
UPDATE T
SET OrderNo = RN

在处理SQL时,您几乎不想编写循环

尝试将您的命令更改为此

; with cte as
(
    select *, row_number() over (order by ID) as rn 
    from tblImages
) 
update tblImages
set OrderNo = rn
from cte

为什么会出现OrderNo=2的情况?这将把操作限制在OrderNo=2(可能只有一个)的行上。重新排序订单号似乎是一件奇怪的、可能具有破坏性的事情。您能提供一些上下文说明为什么要这样做吗?当您可以使用instance@Steve你好这只是为了检查我的SQL是否正在更新任何row@Jamiec我在上面添加了其他代码来帮助解释。我有一个幻灯片显示这些图像。它们的显示顺序基于OrderNo值。幻灯片从1开始,然后递增以显示更多图像。问题是,如果在表中间删除一个图像(即OrthNoO=3),定时器在2之后停止工作,因为它找不到3。更新此列的原因是,当我删除OrderNo 3时,OrderNo 4将更新为3,因此幻灯片将显示所有图像只要您有
CTE
,就不需要对表进行
内部连接
,您可以按照@scsimon的回答进行更新是的,但这本质上是@scsimon的回答;)