PDA

View Full Version : پاک شدن اطلاعات DB با تولید Exception



Sajjad.Aghapour
جمعه 14 تیر 1387, 12:55 عصر
سلام.......
من یک آیتم دیتابیس به پروژم اضافه کردم و جدول مربوطه رو نیز در اون ایجاد کردم.ولی وقتی با INSERT داده ها رو داخل دیتا بیس ذخیره می کنم ،بار اول مشکلی نیست ولی بار دوم خطا ایجاد میشه.کد و خطای مربوطه رو ببینید....


cmd.CommandText = "insert into detail (name,lastname) values (@name,@lastname)";
cmd.Connection = conn;
.

cmd.Parameters.Add("@name", SqlDbType.NVarChar).Value = textBox1.Text;
cmd.Parameters.Add("@lastname", SqlDbType.NVarChar).Value = textBox2.Text;

.
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();

در بار دوم که دکمه Insert رو می زنم میگه متغیر "names@" قبلا تعریف شده و همه داده های دیتابیس پاک میشه.این هم ارورش...


The variable name '@name' ('@names') has already been declared. Variable names must be unique within a query batch or stored procedure.

رضا عربلو
جمعه 14 تیر 1387, 14:41 عصر
primary key جدولت چیست؟
اگر احتمالاً name است. به دلیل اینکه primary key نمی تواند تکراری باشد اجازه درج رکورد دیگری با همان نام را نمی دهد.

rostamkhani
جمعه 14 تیر 1387, 15:08 عصر
سلام
خطا احتمالا بخاطر اینه که میخواهد دوباره پارامتر name@ رو add کنه و چون موجود است پیغام خطا میده راه ساده اینکه cmd رو داخل متد در بالای این کدا که نوشتی تعریف کنی تا با خارج شدن از متد cmd ازبین بره .



SqlCommand cmd = newSqlCommand();
cmd.CommandText = "insert into detail (name,lastname) values (@name,@lastname)";
cmd.Connection = conn;
.

cmd.Parameters.Add("@name", SqlDbType.NVarChar).Value = textBox1.Text;
cmd.Parameters.Add("@lastname", SqlDbType.NVarChar).Value = textBox2.Text;

.
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();



در صورتی که نمی خوای cmd داخل متد تعریف کنی میتونی از Contains استفاداه کنی و موجودیت پارامتر رو چک کنی مثل کد زیر




if (cmd.Parameters.Contains("@NameJobType") == false && cmd.Parameters.Contains("@CommentJobType") == false)
{
cmd.Parameters.Add("@NameJobType", SqlDbType.NVarChar).Value = textBox1.Text;
cmd.Parameters.Add("@CommentJobType", SqlDbType.Char).Value = textBox2.Text;
}
else
{
cmd.Parameters["@NameJobType"].Value= textBox1.Text;
cmd.Parameters["@CommentJobType"].Value = textBox2.Text;
}

yasercomeng
یک شنبه 16 تیر 1387, 01:36 صبح
اينو امتحان كن:

using (SqlCommand myCommand = new SqlCommand("select * from YourTable where Name=@name and ID=@ID", myConnection))
{
myCommand.Parameters.AddWithValue("@name",name);
myCommand.Parameters.AddWithValue("@id",id);

myConnection.Open();
SqlDataReader myReader = myCommand.ExecuteReader())
...................
}

Sajjad.Aghapour
یک شنبه 16 تیر 1387, 11:19 صبح
ممنون دوست عزیز...
ولی با کد جناب rostamkhani درست شد

jeus
یک شنبه 16 تیر 1387, 12:18 عصر
در اولین پست نوشتی که داده های دیتا بیس پاک میشه ؟
میشه بگی دیتابیست چیه ؟
نباید داده های دیتا بیس پاک بشه اگر هم برای فیلد کلید داده تکراری وارد کنی تنها نباید اجازه ورود داده تکراری را بهت بده

Sajjad.Aghapour
یک شنبه 16 تیر 1387, 15:23 عصر
علتش رو نمی دونم.ولی بازم به یک مطلب بر خوردم که نمی دونم اساس کاره یا باید به عنوان یک مشکل به اون نگاه کنم...
بانک من sqlserver هستش.البته express که اون رو به پروژه ام اضافه کردم وکانکشنم رو به صورت زیر تعریف کردم.


SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDBFilename=|DataDirector y|myDatabase.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True");

یک فیلد دارم که داخلش عکس و یکی دیگه دارم که داخلش فایل های صوتی رو ذخیره می کنم.وقتی برنامه رو دیباگ می کنم و داده هام رو ذخیره می کنم با بستن برنامه و اجرای مجدد اون دیگه داده ای داخل دیتابیس نیست.در حالیکه وقتی exe اصلی رو اجرا می کنم و داده هام رو ذخیره می کنم به طور کامل ذخیره میشن و هیچ مشکلی وجود نداره ؟!!!
حالا به نظر دوستان این از اصول کار با express هست یا یک مشکل ؟!!!

jeus
یک شنبه 16 تیر 1387, 15:31 عصر
دوست من برنامه ات را به جای اینکه دوباره compile کنی از توی فایل های پروژه ات اجرا کن من احتمال میدم چون فایل دیتا بیست attach شده است بعد از compile دوباره دیتا بیستو صفر میکنه