C# 使用循环更新SQL Server表的每个现有行
我正在尝试使用ASP.NET、C#更新SQL Server表中每一行的特定列 执行此代码时,我希望列中第一行的OrderNo为=1。从那时起,我希望表中其他现有行的OrderNo增加1 目前,我可以更新一行的OrderNo,但是我不能得到一个循环来正确地读取所有的行&我想要的增量 这是我桌子的结构 下面是我的简历: 以下是我需要更新订单号的原因: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
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的回答;)