PDA

View Full Version : مبتدی: آپدیت یک جدول اس کیو ال در سی شارپ بر اساس جدول دیگر با چند شناسه تکراری



hamidtmu
پنج شنبه 01 تیر 1402, 01:31 صبح
با سلام. من کد زیر را دارم
con.Open();

string updateQuery2 = @"
UPDATE c3
SET c3.mm = c2.m



FROM SHEM4 c3
INNER JOIN SHEM2 c2 ON c3.kodM = c2.kodM;
";

using (SqlCommand command = new SqlCommand(updateQuery2, con))
{
command.ExecuteNonQuery();
}

con.Close();


در این کد من قصد دارم جدول SHEM4 را بر اساس جدول SHEM آپدیت شود. حالا مشکلم اینکه که از جدول دوم فقط یک ردیف را در نظر می گیرد. در شکل زیر چیزی که هست و چیزی که می خواهم را آوردم. اگر کسی عنایت کند بگه که چجوری کد نوشته باید بشه که هر ردیف پیمایش بشه (تا صرفا یک ردیف تکراری آورده نشود)و در صورتی که ردیف تمام شد از اول جدول دوباره پیمایش بشه( در صورتی که نبود تکرار شود)

پرستو پارسایی
پنج شنبه 01 تیر 1402, 09:02 صبح
به نظر من برای پیمایش تمام ردیف‌های جدول SHEM2 و اعمال تغییرات متناظر در جدول SHEM4، می‌توانید از یک حلقه foreach استفاده کنید. همچنین برای جلوگیری از تکرار ردیف‌ها می‌توانید از یک شناسه یکتا برای هر ردیف استفاده کنید و با استفاده از یک شرط در دستور UPDATE، تنها ردیف‌هایی را انتخاب کنید که شناسه آن‌ها با ردیف قبلی تفاوت داشته باشد. ابن کد درک من از سوال شما هست

con.Open();

string updateQuery2 = @"
UPDATE c3
SET c3.mm = c2.m
FROM SHEM4 c3
INNER JOIN SHEM2 c2 ON c3.kodM = c2.kodM
WHERE c2.id > @lastProcessedId OR @lastProcessedId IS NULL;
";


// متغیر آخرین شناسه‌ی ردیف پردازش شده در جدول SHEM2
int? lastProcessedId = null;


// حلقه‌ی while برای پردازش تمام ردیف‌های جدول SHEM2
while (true)
{
// اجرای دستور UPDATE برای پردازش ردیف‌های جدید
using (SqlCommand command = new SqlCommand(updateQuery2, con))
{
// افزودن پارامتر lastProcessedId به دستور UPDATE
if (lastProcessedId != null)
{
command.Parameters.AddWithValue("@lastProcessedId", lastProcessedId);
}
else
{
command.Parameters.AddWithValue("@lastProcessedId", DBNull.Value);
}


// اجرای دستور UPDATE و بررسی تعداد ردیف‌های تحت تأثیر
int rowsAffected = command.ExecuteNonQuery();


// بررسی آیا هیچ ردیفی پردازش نشده است
if (rowsAffected == 0)
{
// اگر هیچ ردیفی پردازش نشده باشد، از ابتدا شروع کن
lastProcessedId = null;
}
else
{
// در غیر این صورت، آخرین شناسه‌ی ردیف پردازش شده را به‌روز کن
using (SqlCommand getMaxIdCommand = new SqlCommand("SELECT MAX(id) FROM SHEM2", con))
{
lastProcessedId = (int)getMaxIdCommand.ExecuteScalar();
}
}
}


// اگر هیچ ردیفی پردازش نشده باشد، خارج شو از حلقه
if (lastProcessedId == null)
{
break;
}
}


con.Close();


اگر نیاز به توضیحات بیشتر نیاز دارید بفرمائید

hamidtmu
پنج شنبه 01 تیر 1402, 12:07 عصر
با سلام و سپاس . من یک کد مشترک بین دو جدول دارم که در چند ردیف ممکن است در دو جدول تکرار شده باشد. حالا قصد من این است که تا حدامکان بتوان فرایند آپدیت را انجام داد.نمونه تصویر مورد نظر برایتان ارسال می شود. اپ دیت های معمولی بر اساس معمولا اخرین ردیف یافت شده هست و کاری به دیگر ردیف ها ندارد. کدی هم که شما دوست عزیز دادید نتیجه به صورت پیوسته که خالی داده بهم و جوابگو نبود.

پرستو پارسایی
پنج شنبه 01 تیر 1402, 20:11 عصر
با توجه به کد ارائه شده، پیغام null ممکن است به دلیل این باشد که در جدول SHEM2 هیچ ردیفی با شناسه‌ی بزرگتر از مقدار آخرین شناسه‌ی پردازش شده وجود نداشته باشد. در این صورت، با اجرای دستور UPDATE، هیچ ردیفی تحت تأثیر قرار نمی‌گیرد و تعداد ردیف‌های تحت تأثیر برابر با صفر است. در نتیجه، مقدار lastProcessedId به null تنظیم می‌شود و حلقه while متوقف می‌شود.


برای رفع این مشکل و جلوگیری از پیغام null، می‌توانید یک ردیف جدید با شناسه‌ی بزرگتر از آخرین شناسه‌ی پردازش شده در جدول SHEM2 اضافه کنید تا تضمین شود که همیشه حداقل یک ردیف برای پردازش وجود دارد. به عنوان مثال، می‌توانید به صورت زیر عمل کنید:

// دریافت آخرین شناسه‌ی ردیف پردازش شده
int? lastProcessedId = null;
using (SqlCommand getMaxIdCommand = new SqlCommand("SELECT MAX(id) FROM SHEM2", con))
{
lastProcessedId = (int?)getMaxIdCommand.ExecuteScalar();
}


// اضافه کردن یک ردیف جدید با شناسه‌ی بزرگتر از آخرین شناسه‌ی پردازش شده به جدول SHEM2
if (lastProcessedId == null)
{
lastProcessedId = 0;
}
int newId = (int)lastProcessedId + 1;
using (SqlCommand insertCommand = new SqlCommand("INSERT INTO SHEM2 (id) VALUES (@id)", con))
{
insertCommand.Parameters.AddWithValue("@id", newId);
insertCommand.ExecuteNonQuery();
}
lastProcessedId = newId;


// حلقه‌ی while برای پردازش تمام ردیف‌های جدول SHEM2
while (true)
{
// ...
}

در این کد، پس از دریافت آخرین شناسه‌ی ردیف پردازش شده، یک ردیف جدید با شناسه‌ی بزرگتر از آن اضافه می‌شود. سپس مقدار lastProcessedId به شناسه‌ی ردیف جدید تنظیم می‌شود. با این کار، تضمین می‌شود که همیشه حداقل یک ردیف برای پردازش وجود دارد و پیغام null نمایش داده نمی‌شود.