PDA

View Full Version : مشکل در ثبت اطلاعات در دیتابیس



mokamel
دوشنبه 11 اسفند 1393, 12:14 عصر
سلام
دوستان من با ویژوال 2013 توی برنامم یسری اطلاعات توی دیتابیس ذخیره می کنم ، فقط مشکل اینه که ممکنه این اطلاعات تکراری باشند یعنی قبلا توی دیتا بیس ثبت شده باشند ، چه کار کنم که جلوی ثبت این دست از اطلاعات تکراری و بگیرم ؟
توی اطلاعاتی که ثبت می کنم همواره یک کد هست که یونیک و ماله خودشه که برای فهمیدن اینکه این کد و سایر اطلاعات این کد توی دستابیس ثبت شده اند یا نه می شه استفاده کرد

Mofid.m
دوشنبه 11 اسفند 1393, 14:21 عصر
قبل ثبت چک کن ببین همون اطلاعات رو داری یا نه
اگه داشتی به کاربر بگو اطلاعات تکراریه
اگه نداشتی ثبت کن

البته اگر منظورت همین بود!!!!!!!!!!

ghasem110deh
دوشنبه 11 اسفند 1393, 14:40 عصر
سلام
با اجازه آقای Mofid.m (http://barnamenevis.org/member.php?309366-Mofid-m)
-----------------------
اگه اون کد که گفتین یونیک و بی نظیر (واسه هر سطر) ... اگه کلید اصلی قرارش بدین ، دیگه مقدار تکراری نمیگره !
و ان هم واس تکراری نبودن یه فیلد (اینجا id) :

SqlConnection con2; SqlDataAdapter adapter;
string conString = "Data Source=.;Initial Catalog=AnbarDB;Integrated Security=True";
System.Data.DataTable dy = new System.Data.DataTable();
con2 = new SqlConnection(conString);
string chek = "select Id from TAnbar where Id='" + textBox1.Text + "'";
adapter = new SqlDataAdapter(chek, con2);
dy.Clear();
adapter.Fill(dy);
if (dy.Rows.Count > 0)
{
MessageBox.Show("شماره قبلا ثبت شده است", "هشدار", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
else
{

یا علی !

mokamel
دوشنبه 11 اسفند 1393, 20:59 عصر
آقای Mofid.m خوب راه حل همینه که گفتید اما پیاده سازیشو میخواستم بدونم .
در ضمن این کد منحصر بفرد ی که گفتم و نمی تونم بعنوان primery key جدولم بزارم . کد ID رو واسش گذاشتم . این کدی که گفتم که برای هر سطر منحصر بفرد هستش چیزی شبیه به کد دانشجویی هستش .

Mofid.m
دوشنبه 11 اسفند 1393, 22:19 عصر
بزار یه مثال برات بزنم.
شما فرض کن یه دیتابیس داری به اسم MyDB و توش یه جدول داری به اسم MyTable
فیلد های جدولت :

129026

توی این جدول ما دوتا فیلد منحصر به فرد داریم یکی ID که از نوع Bigint و Identity رو برابر Yes گذاشتم تا یکی یکی خود SQL بهش اضافه کنه.
فیلد Email هم که فیلد کلیده و مسلما منحصر به فرد.

شما فرض کن یه همچین فرم داری که مقادیر نام، شماره تلفن ، ایمیل و توضیحات رو وارد میکنی
txtName
txtPhoneNO
txtEmail
txtDes
و یه باتن داری برای ثبت
btnInsert

بریم سراغ کد نویسی:

اول تو قسمت public partial class یه کانکشن سراسری تعریف میکنیم و بقیه کد ها رو تو رویداد کلیک باتن می نویسیم

public partial class Form1 : Form {
public Form1()
{
InitializeComponent();
}


SqlConnection con = new SqlConnection(@"server=(local);database=MyDB;integrated security=true");


private void btnInsert_Click(object sender, EventArgs e)
{
//اول چک میکنیم که مقتادیر وارد شده از قبل در جدول وجود دارد.
// برای این کار فقط ایمیل را چک میکنیم زیرا میتواند بقیه موارد تکراری باشد
SqlDataAdapter da = new SqlDataAdapter("select * from MyTable where Email=@email", con);
da.SelectCommand.CommandType = CommandType.Text;


//مقدار تکست باکس ایمیل را به عنوان پارامتر ابه دستور اس کیو ال می فرستیم
da.SelectCommand.Parameters.AddWithValue("@email", txtEmail.Text.Trim());


DataTable dt = new DataTable();
da.Fill(dt);


if (dt.Rows.Count > 0) //یعنی مقداری با ایمیل وارد شده از قبل وجود داشت
{
MessageBox.Show("Your Email address has already intered!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
txtEmail.SelectAll();
txtEmail.Focus();
return;
}



SqlCommand com = new SqlCommand("insert into MyTable (Name,PhoneNO,Email,Description) values" +
"(@name,@phone,@email,@des)", con);
com.CommandType = CommandType.Text;
com.Parameters.AddWithValue("@name", txtName.Text.Trim());
com.Parameters.AddWithValue("@phone", txtPhoneNO.Text.Trim());
com.Parameters.AddWithValue("@email", txtEmail.Text.Trim());
com.Parameters.AddWithValue("@des", txtDes.Text.Trim());


con.Open();
com.ExecuteNonQuery();
con.Close();


MessageBox.Show("Your information was successfully registered", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);




}





}

Mofid.m
سه شنبه 12 اسفند 1393, 03:26 صبح
اینم یادم رفت بگم که فیلد ID در واقع کاری انجام نمیده.
شما زمانی که بخوای ایمیل های تکراری هم وارد کنی ، ID رو بزار فیلد کلید.
برای ثبت اطلاعات هم نیازی نیست به این فیلد مقدار بدی.
شما پروژتو ببین، اگه فیلد یکتایی داری همون رو بزار و ID هم نیازی نیست.

ghasem110deh
سه شنبه 12 اسفند 1393, 06:33 صبح
سلام
این از اون روش که من رفتم بهتره ؟

Mofid.m
سه شنبه 12 اسفند 1393, 07:24 صبح
سلام
این از اون روش که من رفتم بهتره ؟

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

SabaSabouhi
سه شنبه 12 اسفند 1393, 09:23 صبح
سلام
چرا از Unique Index تو دیتابیس استفاده نمی‌کنی؟
گره‌ای که با دست باز می‌شه رو که با دندون باز نمی‌کنن.

صباصبوحی

ghasem110deh
سه شنبه 12 اسفند 1393, 12:15 عصر
سلام
اگه از Unique Index استفاده کنیم چطور به کاربر بفهمونیم که کدوم گزینه (تکست باکس) تکراری وارد کرده ؟
من الان دو تا از فیلدهام نباید تکراری باشه یکیش که Cod و اون یکی Barcod ، id رو هم که اتو هستش !
اگه کد و بارکد رو یونیک بزاریم چطور باید نشون بدیم که کدومشون رو تکراری پر کرده !

SabaSabouhi
سه شنبه 12 اسفند 1393, 12:19 عصر
سلام
اگه از Unique Index استفاده کنیم چطور به کاربر بفهمونیم که کدوم گزینه (تکست باکس) تکراری وارد کرده ؟
من الان دو تا از فیلدهام نباید تکراری باشه یکیش که Cod و اون یکی Barcod ، id رو هم که اتو هستش !
اگه کد و بارکد رو یونیک بزاریم چطور باید نشون بدیم که کدومشون رو تکراری پر کرده !

سلام
کد کالا باید یگانه باشه، پس یه اندیس یگانه می‌خواد.
بارکد هم باید یگانه باشه، پس یه اندیس یگانه‌ی دیگه می‌خواد.
دلیل نداره که یه اندیس برای هر دوی اینا درستی کنی. بعضی وقت‌ها دو فیلد در کنار هم یگانه هستن که یک اندیس لازمه.
اما بعضی وقت‌ها هم باید برای تک تک اونا اندیس یگانه بسازی.
وقتی خواستی Save کنی و خطا داد، تو متن خطا نام اندیسی که خطا رو ایجاد کرده به شما می‌ده. مثلاً IX_Goods1 که از روی
اون می‌تونی بفهمی کدوم فیلد شرط اندیس شما رو نقض کرده.

صبا صبوحی

golbafan
سه شنبه 12 اسفند 1393, 12:23 عصر
سلام
اگه از Unique Index استفاده کنیم چطور به کاربر بفهمونیم که کدوم گزینه (تکست باکس) تکراری وارد کرده ؟
من الان دو تا از فیلدهام نباید تکراری باشه یکیش که Cod و اون یکی Barcod ، id رو هم که اتو هستش !
اگه کد و بارکد رو یونیک بزاریم چطور باید نشون بدیم که کدومشون رو تکراری پر کرده !

دیتابیس قبل از ثبت کردن همه uniq ها رو چک میکنه و در صورت ایجاد خطا یک رویداد برای شما میفرسته که میتونید با ترجمه اون بفهمید کدوم فیلد(ها) مد نظر هست...

mokamel
چهارشنبه 13 اسفند 1393, 16:55 عصر
سلام
حالا یه سوال دیگه :
اگر من به دیتابیس دسترسی نداشته باشم و یا حق دخالت یا تغییر در آن را نداشته باشم . چطور ؟
یعنی من فقط می دونم که قبلا توی دیتابیس سه سری اطلاعات هست و من هم یه سری اطلاعات می خوام توش بریزم که همشون دارای کد دانشجویی هستند . حالا تو برنامم چه کار کنم که اجازه ورود اطلاعات تکراری رو ندم . دقت کنید که من فقط می تونم توی برنامم دست ببرم ولاغیر

Mofid.m
چهارشنبه 13 اسفند 1393, 18:25 عصر
زمانی که شما اطلاعاتی داری توی دیتابیس میریزی فیلد کلید نباید تکراری وارد بشه.
پس اگر شما اطلاعات تکراری بدی دیتابیس خطا میده و یه Exeption تو برنامت رخ میده.
به این Sql Exeption میگن و شما با کنترل این Exeption میتونی به کاربر هشدار بدی.

SabaSabouhi
پنج شنبه 14 اسفند 1393, 08:49 صبح
سلام
حالا یه سوال دیگه :
اگر من به دیتابیس دسترسی نداشته باشم و یا حق دخالت یا تغییر در آن را نداشته باشم . چطور ؟
یعنی من فقط می دونم که قبلا توی دیتابیس سه سری اطلاعات هست و من هم یه سری اطلاعات می خوام توش بریزم که همشون دارای کد دانشجویی هستند . حالا تو برنامم چه کار کنم که اجازه ورود اطلاعات تکراری رو ندم . دقت کنید که من فقط می تونم توی برنامم دست ببرم ولاغیر

سلام
یه Transaction باز کن، دیتابیس رو چک کن که هیچ‌کدام از اون فیلد‌های خاص تو دیتابیس وجود نداشته باشه، بعد رکورد رو ثبت کن. بعد هم Transaction رو ببند.

صبا صبوحی