PDA

View Full Version : سوال: اعلام دلیل خطای دیتابیس در سی شارپ



impera2r
دوشنبه 07 تیر 1389, 10:04 صبح
سوال من در مورد سی شارپ و اسکیوال هست
اگه تویه فرم سی شارپ کاربر مثلا عددی وارد کرد که کلید اصلی رو نقض می کنه چه جوری می تونم علت خطا که نقض شدن کلید اصلی هست رو تو برنامه به کاربر اعلام کنم. در واقع می خوام شماره خطا رو از اسکیوال بگیرم و تو سی شارپ تحلیل کنم. اگه ممکنه به صورت کامل توضیح بدین و حتی المقدور اکثر خطاهای ممکن رو بیان کنین. مثل خطاهای زیر
unique key-check condition-primary key
در ضمن اگه یه پی دی اف خوب فارسی در مورد ارتباط و اتصال سی شارپ به اس کیو ال برای من قرار بدید ممنون می شم
من از ورژن های زیر استفاده می کنم
Visual studio 2008:C#.net 3.5
SQL server 2008

aghayex
دوشنبه 07 تیر 1389, 18:48 عصر
این بحثی که گفتید شامل 2 بخش هست:
1) نحو کد نویسی در sql :



create Procedure Insert


@ErrorCode tinyint output




as
if exists(select * from omoomi where id=@id)
set @ErrorCode=1
else
set @ErrorCode=0
return @ErrorCode
end


شما برای این کار باید یه پارامتر از نوع output داشته باشید و در برنامه نویسی به اون مقدار می دید


2 ) نحوه کد نویسی در سی شارپ :



SqlConnection sqlcon = newSqlConnection();
SqlCommand sqlcom = newSqlCommand();
sqlcom.Connection = sqlcon;
sqlcom.CommandText = "select";
sqlcom.CommandType = CommandType.StoredProcedure;
SqlParameter eror = newSqlParameter("@ErrorCode", SqlDbType.TinyInt);
eror.Direction = ParameterDirection.Output;
sqlcom.Parameters.Add(eror);
sqlcon.Open();
sqlcom.ExecuteNonQuery();
if (Convert.ToInt32(sqlcom.Parameters["@ErrorCode"].Value) == 1)
{
دستورات
}
else
{
دستورات
}


در اینجا هم همراه با پارامترهایی که به sp ارسال می کنیداین پارامتر رو هم ارسال می کنید

Rejnev
دوشنبه 07 تیر 1389, 18:57 عصر
از sqlExeption ای که موقع executeNone اتفاق میفته در قسمت catch استفاده کن. توی تمامی sql ها خطای کد (فیلد) مثلا تکراری، یکسانه.
شما یک بار که عمدا داده تکراری وارد کنید و مقدار errorNumber شی sqlExeption ای رو که ساختی بررسی کنی میفهمی که کد خطای مذکور چنده.



try{
cmd.ExecuteNone();
}
catch(sqlExeption er)
{
if(er.ErrorNumber=x) messagebox.show("code tekrari ast !");
}
catch(exeption er)
{
messagebox(er.message)
}

توی sql هم sys.messages جدول پیغامهای sql هست که در اون کد های خطا به همراه توضیحاتش ذخیره شده.
در کل بهتره قبل از مثلا insert خودت دستی یک کوئری بنویسی که اگه فلان کد وجود نداشت بعد try کن که اینسرت کنی(کار از محکم کاریه). اگه وجود داشت که پیغام بده و یا اگه با خطای مثلا 584 مواجه شدی باز هم همون پیغام کد عدد تکراری رو بده.(یعنی حدالامکان از try catch و کنترل خطا بیخودی استفاده نکن. بلکه پیشگیری کن)