2017-01-04 6 views
1

ASP.NET、C#を使用して、SQL Serverテーブルの各行の特定の列を更新しようとしています。ループを使用してSQL Serverテーブルの各行を更新する

このコードを実行すると、列の最初の行のOrderNoを1にします。その後、テーブルの他の既存の行に対してOrderNoを1ずつ増やします。

現時点では、1行のOrderNoを更新できますが、すべての行を正しく読み取るループを得ることはできません。&のインクリメントが必要です。ここで

は私のテーブル

Here

、以下の構造が、私のC#である:ここでは

con.Open(); 
SqlCommand cmdUpdateOrderNo; 
cmdUpdateOrderNo = new SqlCommand("UPDATE tblImages SET [OrderNo][email protected] WHERE [OrderNo] = 2;", con); 
cmdUpdateOrderNo.Parameters.AddWithValue("@O", 4); 
cmdUpdateOrderNo.ExecuteNonQuery(); 

は私がある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(); 
} 
+1

なぜ条件あるOrderNo = 2へのあなたのコマンドを変更してみてください?これにより、OrderNo = 2(たぶん1つ)の行に制限されます – Steve

+2

注文番号を並べ替えることは、奇妙で、損害を与える可能性があるようです。なぜこれをやりたいのですか? – Jamiec

+2

例: – Lamak

答えて

3

これについて@Jamiecと同意するのは悪い考えですが、あなたはそうではありませんもしあなたが本当にやりたいことなら、ループが必要です。次に、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 

あなたがループを書くことにしたいことはほとんどないSQLを扱う場合は、

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

あなたのテーブルを更新しますruningて。

この

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

'CTE'を実行すると、テーブルでINNER JOINを実行する必要はありません。@ scsimonの回答 – Lamak

+0

のように更新できます。 –

+2

ええ、これは本質的に@ scsimonの答えです – Lamak

関連する問題