PDA

View Full Version : سوال: سوال کردن قبل از اضافه کردن در پایگاه داده



vahidth
دوشنبه 06 آذر 1391, 13:26 عصر
سلام
چطوری میتونم وقتی که میخوام یه رکورد جدید به دیتا گرید اضافه کنم تو داده های پایگاه بگرده و اگه رکوردی از قبل اضافه شده بود پیغام بده که مثلا این اطلاعات در پایگاه موجود است و ذخیره نشه
مثلا من در این پروژه id رو کلید اصلی قرار دادم
95609

sgh_programer
دوشنبه 06 آذر 1391, 13:35 عصر
سلام دوست عزیز

همونجوری که خودتون گفتید باید یه کلید اصلی تعریف کنیم چون کلید اصلی نمیتونه تکراری باشه

حالا از کد های زیر استفاده کن

try
{

// اینجا دستورات افزودن به بانک اطلاعاتی رو بنویس
}
catch (SqlException ex)
{
if (ex.Number == 2627)//درصورتی که کد کالا تکراری بود
{
FarsiMessegeBox.Show(" این کالا قبلا ثبت شده ", "ثبت اطلاعات", FMessegeBoxButtons.YesNo, FMessegeBoxIcons.Question);
}
}

ex.Number == 2627 اگه id تکراری باشه

موفق باشی

veniz2008
دوشنبه 06 آذر 1391, 13:38 عصر
سلام. شما قبل از اینکه داده رو درج کنید باید یه select بزنید که شرطش باید کلید جدولتون باشه. نتیجه select رو در یه دیتاتیبل بریزید و تعداد سطرهای دیتاتیبل رو چک کنید. اگر تعداد سطرها 0 بود یعنی رکورد قبلا ثبت نشده و دستور درج رو اجرا می کنید،در غیر این صورت اگر تعداد رکوردها بیشتر از 0 بود یه پیغام میدید که این رکورد قبلا ثبت شده.
موفق باشید

vahidth
دوشنبه 06 آذر 1391, 13:42 عصر
میشه با کد توضیح بدین

sgh_programer
دوشنبه 06 آذر 1391, 13:55 عصر
سلام. شما قبل از اینکه داده رو درج کنید باید یه select بزنید که شرطش باید کلید جدولتون باشه. نتیجه select رو در یه دیتاتیبل بریزید و تعداد سطرهای دیتاتیبل رو چک کنید. اگر تعداد سطرها 0 بود یعنی رکورد قبلا ثبت نشده و دستور درج رو اجرا می کنید،در غیر این صورت اگر تعداد رکوردها بیشتر از 0 بود یه پیغام میدید که این رکورد قبلا ثبت شده.
موفق باشید


دوست عزیز اگه قرار باشه که جدول 10000 رکورد داشته باشه هنگام درج باید این 10000 رکورد را با رکورد جدید چک کنه که این هم سرعت را پایین میاره و هم زیاد جالب نیست

اگه اون چیزی که من گفتم را استفاده کنی دیکه نیازی به این کارا نیست چون در صورتی که id تکراری باشه شماره خطای 2627 را میده که با یه شرط میتونی مدیریتش کنی

دوستمون(vahidth (http://barnamenevis.org/member.php?232910-vahidth)) فقط کافیه کد هایی را که برای درج نوشته اونجایی که مشخص کردم کپی کنه


try
{

// اینجا دستورات افزودن به بانک اطلاعاتی رو بنویس
}

veniz2008
دوشنبه 06 آذر 1391, 14:02 عصر
دوست عزیز اگه قرار باشه که جدول 10000 رکورد داشته باشه هنگام درج باید این 10000 رکورد را با رکورد جدید چک کنه که این هم سرعت را پایین میاره و هم زیاد جالب نیست
دوست عزیز، با فرض اینکه کدهای شما صحیح باشه ( البته این اولین باریه که می بینم یه نفر چنین کدی رو میزاره) بازم عمل جستجو منتفی نیست. شما فکر میکنی sql چطور تشخیص میده که مثلا اون کد وجود داره یا نه؟. خود sql هم داره یه search داخل جدول میزنه که آیا اون id وجود داره یا نه.
بهرحال زمانیکه قرار باشه در یک دیتابیس بزرگ جستجو کنیم یه سری اعمال دیگه انجام می دهیم تا سرعت جستجو رو افزایش بدیم.

vahidth
دوشنبه 06 آذر 1391, 14:07 عصر
دوست عزیز sgh_programer (http://barnamenevis.org/member.php?260906-sgh_programer)
میشه بگی به کجای کدها این کد شما رو اضافه کنم لطفا بصورت کامل بگو ممنون ازت

sgh_programer
دوشنبه 06 آذر 1391, 16:50 عصر
try
{
.........
تمام کد هایی که عمل درج را انجام میدن را اینجا بنویس
......
}
catch (SqlException ex)
{
if (ex.Number == 2627)//درصورتی که کد کالا تکراری بود
{
MessageBox.Show(" این کالا قبلا ثبت شده ", "ثبت اطلاعات");
}
}


هرچی کد برای insert هست رو جایی که مشخص کردم قرار بده

mandanim
دوشنبه 06 آذر 1391, 16:56 عصر
نیازی به چک کردن نیست
اگر primery باشه موقع درج کافی try و catch بزار و آخر سر بعد از اتمام تمام درج ها فقط و فقط یه message box بیاد و تکراری ها رو به کاربر بگه نه برای هر تکراری یک پیغام

sgh_programer
دوشنبه 06 آذر 1391, 17:10 عصر
من یه برنامه حسابداری نوشته بودم و اونو برای مشتری نصب کردم و مشتری هم همون روز اول 620 رکورد را ثبت کرده بود و بعد از سه روز که کالا هاشونو ثبت کردند عمل درج کردن سرعت پایین اومده بود (تا اون روز حدودا 3000 رکورد ثبت کرده بودن)

جالبه بدونید که من قبل از درج رکورد چک میکردم که آیا کد کالا تکراری هست یا خیر
عمل چک کردن به این شکل بود که یه دستور select نوشته بودم که کد جدید را با تمام کد های ثبت شده مقایسه میکرد و به مرور حجم دیتا بالا میرفت اونم سرعتش پایین میومد تا اینکه صدای مشتری در اومد

و من هم نهایتا دستور select رو حذف کردم و از کد های بالا استفاده کردم و دیگه مشکلی نداشت

حالا داداش گلم mohammaddou (http://barnamenevis.org/member.php?155296-mohammaddou) این حرف رو من بر این اساس زدم وگرنه من قصد جسارت به کسی رو ندارم

چیزهایی که گفتم تنها یه تجربه بود
اگه قرار باشه که جدول 10000 رکورد داشته باشه .........

موفق باشید

vahidth
دوشنبه 06 آذر 1391, 17:53 عصر
داداش من این کد رو به پروژه اضافه کردم وقتی یه فیلد تکراری میدم اول به گرید اضافه میکنه وبعد پیغام میده ولی وقتی از برنامه بیرون میام و دوباره برنامه رو اجرا میکنم اون فیلد تکراری به پایگاه اضافه نشده این عکس رو ببین
اینم از کدها
9563195630

sgh_programer
دوشنبه 06 آذر 1391, 18:20 عصر
من برای insert از این دستورات استفاده میکنم که درست هم کار مینکه
مثلا دستورات زیر برای افزودن به جدول مشتری هست

try
{
DialogResult Result_Save = FarsiMessegeBox.Show("آیا اطلاعات مشتری ثبت شوند؟", "ثبت اطلاعات", FMessegeBoxButtons.YesNo, FMessegeBoxIcons.Question);
if (Result_Save == DialogResult.Yes)
{
SqlConnection cnn = new SqlConnection();
cnn.ConnectionString = Program.connctionstring;
SqlCommand cmm = new SqlCommand();
cmm.Connection = cnn;
cmm.CommandText = "INSERT INTO Tbl_moshtari(id,name,tel,tel_kar,shomare_hesab,ban k,address)VALUES('" +txt_id.text+"','"+ Txt_Name.Text.ToString() + "','" + Txt_Tel.Text.ToString() + "','" + Txt_Tel_Kar.Text.ToString() + "','" + Txt_Hesab.Text.ToString() + "','" + Combo_Bank.Text.ToString() + "','" + Txt_Address.Text.ToString() + "')";
cnn.Open();
cmm.ExecuteNonQuery();
cnn.Close();
FarsiMessegeBox.Show("اطلاعات با موفقیت ثبت شد", "ثبت اطلاعات", FMessegeBoxButtons.Ok, FMessegeBoxIcons.Information);
}
}
catch (SqlException ex)
{
if (ex.Number == 2627)
{
MessageBox.Show(" این اشتراک قبلا ثبت شده ", "ثبت اطلاعات");
}
}


اگه یه نمونه برنامه بذاری بهتر میشه راهنمایی کرد

momimomi
دوشنبه 05 فروردین 1392, 21:47 عصر
من برای insert از این دستورات استفاده میکنم که درست هم کار مینکه
مثلا دستورات زیر برای افزودن به جدول مشتری هست

try
{
DialogResult Result_Save = FarsiMessegeBox.Show("آیا اطلاعات مشتری ثبت شوند؟", "ثبت اطلاعات", FMessegeBoxButtons.YesNo, FMessegeBoxIcons.Question);
if (Result_Save == DialogResult.Yes)
{
SqlConnection cnn = new SqlConnection();
cnn.ConnectionString = Program.connctionstring;
SqlCommand cmm = new SqlCommand();
cmm.Connection = cnn;
cmm.CommandText = "INSERT INTO Tbl_moshtari(id,name,tel,tel_kar,shomare_hesab,ban k,address)VALUES('" +txt_id.text+"','"+ Txt_Name.Text.ToString() + "','" + Txt_Tel.Text.ToString() + "','" + Txt_Tel_Kar.Text.ToString() + "','" + Txt_Hesab.Text.ToString() + "','" + Combo_Bank.Text.ToString() + "','" + Txt_Address.Text.ToString() + "')";
cnn.Open();
cmm.ExecuteNonQuery();
cnn.Close();
FarsiMessegeBox.Show("اطلاعات با موفقیت ثبت شد", "ثبت اطلاعات", FMessegeBoxButtons.Ok, FMessegeBoxIcons.Information);
}
}
catch (SqlException ex)
{
if (ex.Number == 2627)
{
MessageBox.Show(" این اشتراک قبلا ثبت شده ", "ثبت اطلاعات");
}
}


اگه یه نمونه برنامه بذاری بهتر میشه راهنمایی کرد
با سلام
اگه بخوایم چند فیلد رو همزمان چک کنه و اون فیلدها هیچکدام کلید اصلی نباشن چه تغییری باید در کد داد؟
با تشکر