PDA

View Full Version : عدم نمایش پیغام خطا برای درج رکورد تکراری در sql توسط index کردن فیلد



mehdiba3
جمعه 20 تیر 1393, 02:20 صبح
میخوام مانع درج رکورد تکراری در جدول بشم . برای همین بر روی فیلد کد ملی ایندکس تعریف کردم و اون رو یونیک کردم و الان مشلم حل شده و رکورد تکراری درج نمیشه ولی مشکل اینجاست که من وقتی توسط c# پارامتر ها رو به SP درون sql ارسال می کنم هیچ پیغام خطایی در برنامه c# نشون داده نمیشه و رکورد تکراری هم درج نمیشه.

چیکار کنم که وقتی رکورد تکراری وارد شد به کاربر پیغام خطا بده؟

نکته اینکه من از برنامه نویسی 3 لایه استفاده کردم و کد لایه سوم رو اینجا قرار می دم تا شما بیشتر راهنماییم کنید که آیا باید در محیط sql server کاری کنم که c# خطا رو نشون بده یا در محیط c# باید این مدیریت انجام بشه.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;
using System.Data;

namespace amoozeshgah
{
class DAL
{
public SqlConnection Con = new SqlConnection();
public SqlCommand Cmd;
public SqlDataAdapter Da;

// public void connect()
// {
// Con.ConnectionString = "Data Source=.;Initial Catalog=amoozeshgah;Integrated Security=True";
// Con.Open();
//Cmd = Con.CreateCommand();
//Cmd.CommandType = System.Data.CommandType.StoredProcedure;


//}
private void connect()
{
Con.ConnectionString = "Data Source=.;Initial Catalog=amoozeshgah;Integrated Security=True";
Con.Open();
Cmd = Con.CreateCommand();
Cmd.CommandType = System.Data.CommandType.StoredProcedure;

}



public void disconnect()
{
Con.Close();
Con.Dispose();
Cmd.Dispose();
}
public bool insretstudents(string Sname, string Sfamily, string Sfather, string Scodmeli, string Sage,string Ssex, string Saddress, string Sphone, string Sdate)
{
bool result = false;
try
{
connect();
Cmd.CommandText = "insretstudents";
Cmd.Parameters.AddWithValue("Sname", Sname);
Cmd.Parameters.AddWithValue("Sfamily", Sfamily);
Cmd.Parameters.AddWithValue("Sfather", Sfather);
Cmd.Parameters.AddWithValue("Scodmeli", Scodmeli);
Cmd.Parameters.AddWithValue("Sage", Sage);
Cmd.Parameters.AddWithValue("Ssex", Ssex);
Cmd.Parameters.AddWithValue("Saddress", Saddress);
Cmd.Parameters.AddWithValue("Sphone", Sphone);
Cmd.Parameters.AddWithValue("Sdate", Sdate);
Cmd.ExecuteNonQuery();
result = true;


}

catch (Exception )
{
throw;
}
finally
{
disconnect();
}


return result;
}











}
}





سوال دیگه هم داشتم. در کلاس لایه سوم که مشاهده می کنید به هیچ وقت نمیشه messagebox ایجاد کرد و غیر فعاله. آیا نمیشه در هیچ کلاسی پیغام ایجاد کنیم؟ پس چطور مشکلات یا پیغام هایی که در کلاس ها به وجود میاد رو نمایش بدیم به کاربر؟
ممنون

systam
جمعه 20 تیر 1393, 02:36 صبح
سلام
نمیدونم شدنی هست در برنامه نویسی3 لایه
میتونی کلاسی برای این کار تعریف کنی که زمانی کاربر اطلاعات رودر تکس مورد نظر وارد کرد بلافاصله بعد فوکوس از تکس خارج شد
مقدار اطلاعات بانک چک کنی اگر تکراری بود backgrand تکس تغییر کنه یه همچین چیزی که توی asp کاربرد زیادی داره


یا علی

sadegh.javan
جمعه 20 تیر 1393, 04:18 صبح
در مورد سوال دوم ، توی کلاس ها هر جا مشکلی پیش اومد یک استثنا بفرست :
throw new Exception("")
بعد هر جا از کد استفاده کردی تو بلاک catch خطا رو کنترل کن .

در مورد مشکل اصلی ایده ای ندارم ، چون باید استثنا تولید کنه! ، شاید یه چیز ساده رو فراموش کردی ؟! مثلا وقتی کد رو فرا خوانی میکنی بلاک catch رو درست ننوشتی!
catch (Exception ex)
{
messagebox.show(ex.message);
}

mehdiba3
جمعه 20 تیر 1393, 10:14 صبح
تونستم با تعریف
using System.Windows.Forms;
پیغام رو در class فعال کنم . یعنی الان در نشون دادن پیغام مشکل ندارم. حالا مشکل اصلی حل نمیشه. یعنی اینکه در محیط سیشارپ که دارم پارامتر ها رو ارسال می کنم به sql server وقتی
رکورد تکراری درج میشه باز هم کد مربوط به قسمت Try اجرا میشه و کنترل به بلاک catch منتقل نمیشه. بنظرتون چیکار کنم؟یکی کمک کنه

مهرداد صفا
جمعه 20 تیر 1393, 11:03 صبح
سلام.
متود ExecuteNonQuery یک int بر می گردونه که شامل تعداد رکوردهایی هست که با اجرای فرمان تحت تاثیر قرار گرفتند. در مورد کد شما، چون insert صورت می گیره حداقل مقدار برگشتی باید 1 باشه که اگر نیست یعنی هیچ رکوردی ثبت نشده.
به این صورت عمل کنید:


if(cmd.ExecuteNonQuery()<=1)
throw new exception....
else
return true;

mehdiba3
شنبه 21 تیر 1393, 12:09 عصر
دوست عزیز شما درست گفتید . ExecuteNonQuery یک مقدار int بر میگردونه. منم با روش زیر تونستم کنترلش کنم. البته با راهنمایی شما. سوالم اینه الان کار try catch در این برنامه چیه؟ عملا هیچی. سوالم اینه دیگه try catch را بردارم و با همین if else اون رو کنترل کنم؟ خودم دوست داشتم عملیات درون try اجرا بشه و اگه رکورد تکراری بود یعنی چیزی درج نمیشد در جدول خطا ایجاد بشه و خطا رو درون catch کنترل کنم ولی متاسفانه به هیچ وجه کنترل از try خارج نمیشه و حتی اگه رکوردی هم تکراری باشه باز هم همون try اجرا میشه. دیگه با همین if else مگه کنترلش کنم.

سپاس از شما




public bool insretstudents(string Sname, string Sfamily, string Sfather, string Scodmeli, string Sage, string Ssex, string Saddress, string Sphone, string Sdate)
{
int r;// ExecuteNonQuery
bool result = false;
try
{
connect();
Cmd.CommandText = "insretstudents";
Cmd.Parameters.AddWithValue("Sname", Sname);
Cmd.Parameters.AddWithValue("Sfamily", Sfamily);
Cmd.Parameters.AddWithValue("Sfather", Sfather);
Cmd.Parameters.AddWithValue("Scodmeli", Scodmeli);
Cmd.Parameters.AddWithValue("Sage", Sage);
Cmd.Parameters.AddWithValue("Ssex", Ssex);
Cmd.Parameters.AddWithValue("Saddress", Saddress);
Cmd.Parameters.AddWithValue("Sphone", Sphone);
Cmd.Parameters.AddWithValue("Sdate", Sdate);
r = Cmd.ExecuteNonQuery();
if (r >= 1)
MessageBox.Show("با موفقیت ثبت شد");
else
MessageBox.Show("کاربر تکراری است");
}
catch (Exception)
{
throw;
}
finally
{
disconnect();
}
return result;
}

}

مهرداد صفا
یک شنبه 22 تیر 1393, 12:38 عصر
سلام.
بله از if به راحتی میشه استفاده کرد.
ولی اگر به صورت چند لایه کار می کنید، پیشنهاد می کنم اول کلاسهایی از نوع Exception با پیغام های خطای فارسی و مناسب ایجاد کنید. در لایه های پایین فقط از یک شرط استفاده کنید و در صورتی که رکوردی ثبت نشد یک exception ایجاد کنید و در لایه UI از try استفاده کنید و در صورت بروز خطا متن آن را در MessageBox نمایش بدید.

mehdiba3
دوشنبه 23 تیر 1393, 09:35 صبح
آقا مهرداد میشه یک مثال از کلاس exeception بزنین؟ من منظ.رتون رو متوجه نمیشم. یعنی یکی کلاس میشه ایجاد کرد که فقط در اون پیام خطا ایجاد کنم؟ بعد تو لایه ها اون رو فراخونی کنم؟ چطور ممکنه؟
exeception مگه فقط تو catch استفاده نمیشه؟ چطور در if else ازش استفاده کنم؟ ببخشید که وقتتون رو میگیرم. ممنون میشم یک مثال کاربردی نشونم بدین. بازم تشکر