PDA

View Full Version : سوال: مشکل در کد بهنگام سازی اطلاعات جدول



pedramfj
چهارشنبه 22 دی 1389, 13:49 عصر
سلام
من برای بهنگام سازی اطلاعات درون بانک از کد های زیر استفاده میکنم.
اول یه کلاس تعریف می کنم.به شکل زیر:


public void upd(Int64 price)

{


SqlCommand com = new SqlCommand("update book set price=@ price ", con);

com.Parameters.Add("@s_price",s_price);

con.Open();
com.ExecuteNonQuery();
con.Close();
}

بعد داخل فرم به صورت زیر کلاس را مقدار دهی می کنم:


private void button1_Click(object sender, EventArgs e)
{
Class obj_class = new Class ();
Int64 price;
price = Convert.ToInt64(0);
obj_class.upd(price);

}



اگر توجه کرده باشید دو کد بالا تمام فیلد های جدول را با مقدار صفر(0) مقداردهی(بهنگام)می کند.


سوال : کد را به چه شکل تغییر دهم که اگر جدول مربوطه 100 ردیف اطلاعات داشت.


برای ردیف اول شماره 1 و یرای ردیف دوم شماره 2 و ... را ثبت (بهنگام )کند؟؟
تشکر...

Reza_Yarahmadi
چهارشنبه 22 دی 1389, 14:34 عصر
دستور SQL رو بصورت زير تغيير بديد
With Tbl as( Select Row_Number() Over(Order by OrderFieldName) as TId, * FROM TableName ) Update Tbl Set Price = TId

pedramfj
چهارشنبه 22 دی 1389, 14:42 عصر
بازم ممنونم ...
از sql2000 استفاده می کنم.

Reza_Yarahmadi
چهارشنبه 22 دی 1389, 14:50 عصر
بابا اين 2000 رو ول كنيد و سراغ لااقل 2005 بيايد!!
Update Tbl Set Price = Tbl.TId FRom (Select Row_Number() Over(Order by OrderFieldName) as TId, * FROM TableName) as Tbl

pedramfj
چهارشنبه 22 دی 1389, 15:43 عصر
ممنون از لطفی که کردید...
ببخشید یه سوال : Tid چی هست؟:متفکر:
اسم جدولم book و اسم فیلد هم price ,تو جایگذاری گیج شدم.:گیج:
از row_number هم خطا میگیره.
بازم ممنون...

Reza_Yarahmadi
چهارشنبه 22 دی 1389, 15:58 عصر
اين دستور ابتدا مياد براي هر سطر يك شماره درست ميكنه (مجازا) اسم ستون شماره سطر TId است. براي درست كردن اين شماره بايد اطلاعات جدول بر اساس يك فيلد مرتب بشه. به جاي TableName اسم جدولتون رو بذاريد به جاي OrderFieldName اسم يكي از فيلدهاتون كه مرتب سازي شماره سطر بر اساس اون انجام بشه. چيز ديگه اي هم نداره.

pedramfj
چهارشنبه 22 دی 1389, 16:50 عصر
ممنون...
شرمنده ام به خدا...:خجالت:
از Row_Number() خطای زیر را میگیره.

'Row_Number' is not a recognized function name;
من از کد به شکل زیر استفاده می کنم.

SqlCommand com = new SqlCommand(" Update Tbl Set price= Tbl.TId FRom (Select Row_Number() Over(Order by id_book) as TId, * FROM book) as Tbl ", con);

Reza_Yarahmadi
چهارشنبه 22 دی 1389, 22:32 عصر
شما ببخشید که فراموش کردم 2000 تابع Row_Number رو نداره.
در صورتی که جدولتون دارای فیلد یونیکی است میتونید بصورت زیر عمل کنید

Update Tbl Set
Price = Tbl.TId
From (
Select
TId = Count(*),
*
FROM
TableName t1, TableName t2
Where
t1.YourUniqField >= t2.YourUniqField
GROUP BY
t1.YourUniqField
) as Tblدر صورتی که فیلد identity توی جدول ندارید میتونید بصورت زیر عمل کنید

Select Identity(int, 1, 1) as TId, * Into Tmp_Book FRom Book
Update Tmp_Book Set Price = TId
Drop Table Book
Exec sp_rename N'dbo.Tmp_Book', N'Book', 'OBJECT'
Alter Table Book Drop Column TIdبا یکی از این 2تا کارتون راه میفته ، دستور خاصی هم توشون نیست که 2000 اونو پشتیبانی نکنه.

Reza_Yarahmadi
پنج شنبه 23 دی 1389, 15:18 عصر
فکر کنم این دیگه کارتون رو راه بندازه. (این یکی بر روی جدولی با ساختاری که فرستادید تست شده و جواب داده)

Update book Set
Price = Tbl.TId
From (
Select
TId = Count(*),
b1.id_book
FROM
book b1, book b2
Where
b1.id_book >= b2.id_book
GROUP BY
b1.id_book) as Tbl
INNER JOIN book b
ON
b.id_book = Tbl.id_book