PDA

View Full Version : بررسی به منظور عدم ثبت رکورد تکراری به کمک BindingSource



shima2006
جمعه 19 شهریور 1389, 10:09 صبح
سلام دوستان

من میخوام قبل از اینکه کاربر اطلاعاتش رو در DB ذخیره کنه ، تکراری نبودنه رکورد فعلی رو بررسی کنم و در صورتی که قبلا این رکورد در دیتابیس ثبت نشده باشه ، به کاربر اجازه ی ثبت رکورد رو بدم
چطوری می تونم از طریق کنترل BindingSource این کار رو انجام بدم؟

mmd2009
جمعه 19 شهریور 1389, 11:03 صبح
با سلام. اگر بانکتون کلید اصلی داره که مشکلی نیست دیگه. با try و catch میتونید این کارو بکنید

shima2006
جمعه 19 شهریور 1389, 11:06 صبح
میدونم مشکلی نیست ، خب بهم بگو چطوری این کارو بکنم:افسرده:

mmd2009
جمعه 19 شهریور 1389, 11:11 صبح
try
{
// کد درج
}
catch()

{
// message error
}

shima2006
جمعه 19 شهریور 1389, 11:22 صبح
try
{
// کد درج
}
catch()

{
// message error
}



http://www.barnamenevis.org/forum/images/statusicon/user_online.gif http://www.barnamenevis.org/forum/images/buttons/report.gif (http://www.barnamenevis.org/forum/report.php?p=1093892)



:لبخند: این چیه آخه؟؟؟:لبخند:
دوست من این کد الان با کمک BindingSource بود؟؟؟

من اصلا به ترای کش کار ندارم ، من میخوام مقادیر داخل تکست باکس رو با فیلدهای داخل دیتابیس مقایسه کنم و ببینم قبلا رکورد مورد نظر در دیتابیس ثبت شده یا نه ....
یعنی من اولین نفری هستم که میخوام جلویه ثبت رکورد تکراری رو بگیرم؟:گیج:

amir11205
جمعه 19 شهریور 1389, 11:26 صبح
فکر کنم نیازی به استفاده از Binding source نباشه
روش دوستمون در صورتی جواب می دهد که کلید اصلی توسط کاربر داده بشه
اما اگر کد برنامه کلید اصلی را طوری طراحی کن که تکراری نباشه این روش جواب نمی ده
اگر فیلد های خاصی از رکورد نباید برابر باشه با جستجو تو بانک فک کنم کار بهتر صورت بگیره

shima2006
جمعه 19 شهریور 1389, 11:30 صبح
خب منم میخوام به کمک BindingDource تویه بانک جستجو کنم
راستی کلید اصلی من Identity تعریف شده ، چیزی که من میخوام اینه که مثلا اطلاعات یک مشتری دو بار ثبت نشه . همین!!!

محسن شامحمدی
جمعه 19 شهریور 1389, 11:31 صبح
خب کاری نداره
اگر فیلدت primary key باشه.در صورتی که سعی کنی مقدار تکراری بدی دات نت exception می ده و اگر primary نیست می تونی از روش

select count(*) from users where username='HASAN'
استفاده کنی

shima2006
جمعه 19 شهریور 1389, 11:35 صبح
خب کاری نداره
اگر فیلدت primary key باشه.در صورتی که سعی کنی مقدار تکراری بدی دات نت exception می ده و اگر primary نیست می تونی از روش

select count(*) from users where username='HASAN'
استفاده کنی

آخه من نمیخوام از دستور Select تو برنامه ام استفاده کنم !
من میخوام با کمک کنترل BindingSource یا TableAdapter این کار رو انجام بدم:ناراحت:

mmd2009
جمعه 19 شهریور 1389, 11:46 صبح
روش دوستمون در صورتی جواب می دهد که کلید اصلی توسط کاربر داده بشه



:متعجب:

کاربر دیگه این وسط چیکارست؟؟؟؟؟؟ :متفکر:

shima2006
جمعه 19 شهریور 1389, 11:48 صبح
عجب !!!

یهویی میگفتی بریم یک نمونه برنامه برات بزنیم و تقدیمتون کنیم شاید اینطوری مشکلتون حل شد :لبخند:



از کمکتون ممنونم
ولی آخه MMD2009 جان ، این کد اصلا به سوال من ربطی نداشت
من میخوام با استفاده از خصوصیات BindingSource این کار رو بکنم اونوقت شما ساختار کلی دستور ترای کش رو به من میگین!
در هر صورت من بازم به خاطر وقتی که گذاشتین متشکرم.

mmd2009
جمعه 19 شهریور 1389, 12:06 عصر
خب ببینید قبول کنید که سوالتون خیلی واضح نبود. شما باید دقیق تر میگفتید چی می خواهید.

اتفاقا اگر کلید اصلیتون رو یه چیز تعریف میکردید که واقعا میشد کلید اصلی باشه هیچ مشکلی نداره این روش و دیگر هم نیازی به کد نویسی اضافه نبود.

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

موفق باشید

hosseinsinohe
جمعه 19 شهریور 1389, 12:25 عصر
سلام دوست عزیز

اگر شما بخواهید تکراری بودن رکورد را به وسیله Bindingsource بررسی کنید این عمل زمانی برای شما جواب می دهد و شما می توانید از Try...Catch استفاده کنید که تمام رکورد های شما در Dataset بارگذاری شده باشند.
با این حال نیاز به کلید اصلی نیز دارید که در زمان وارد شدن مقدار تکراری برای این فیلد خطایی صادر شود.
در غیر این صورت همانطور که دوستان گفتند مجبورید به وسیله دستورات Sql مستقیما مقادیر موجود در بانک اطلاعات را بررسی کنید و از وارد شدن مقدار تکراری مطلع شوید.

amir11205
جمعه 19 شهریور 1389, 12:35 عصر
فک کنم یه چیزی تو این مایه ها کارتونو راه بنازه

this.bindingSourceState.DataSource = dsStates;
this.bindingSourceState.DataMember = "state";

this.bindingSourceCounty.DataSource = this.bindingSourceState;
this.bindingSourceCounty.DataMember = "FK_county_state";
int iIndex = this.bindingSourceCounty.Find("county_id", 999999);
یه شرط بذار که Index رو چک کنه که مساوی صفره یا نه اگه صفر بود تو بانکinsert کن
بازم میگم شاید این خوب باشه
اصلا این لینکشه
برین ببینید شاید بهتر بفهمین چی میشه کرد.
http://www.windowsdevelop.com/windows-forms-data-controls-databinding/bindingsourcefind-throws-exception-on-empty-dataset-45784.shtml

shima2006
جمعه 19 شهریور 1389, 12:37 عصر
شما بخواهید تکراری بودن رکورد را به وسیله Bindingsource بررسی کنید این عمل زمانی برای شما جواب می دهد و شما می توانید از Try...Catch استفاده کنید که تمام رکورد های شما در Dataset بارگذاری شده باشند.
با این حال نیاز به کلید اصلی نیز دارید که در زمان وارد شدن مقدار تکراری برای این فیلد خطایی صادر شود.
در غیر این صورت همانطور که دوستان گفتند مجبورید به وسیله دستورات Sql مستقیما مقادیر موجود در بانک اطلاعات را بررسی کنید و از وارد شدن مقدار تکراری مطلع شوید.

من تمام اطلاعات مورد نیازم رو تویه DataSet دارم
فقط میخوام بدون استفاده از دستور Select بگم که اگر قبلا مشتری با این نام و نام خانوادگی در دیتابیس ثبت شده ، دیگه دوباره ثبت نشه و به کاربر پیغام بدم آقا جان قبلا مشخصات این بابارو ثبت کردی!!!

اَرژنگ
جمعه 19 شهریور 1389, 13:40 عصر
من تمام اطلاعات مورد نیازم رو تویه DataSet دارم
فقط میخوام بدون استفاده از دستور Select بگم که اگر قبلا مشتری با این نام و نام خانوادگی در دیتابیس ثبت شده ، دیگه دوباره ثبت نشه و به کاربر پیغام بدم آقا جان قبلا مشخصات این بابارو ثبت کردی!!!
این روشی که استفاده میکنید درست نیست.
با اینکه میشه از باینیدینگ سورس برایه اینکار استفاده کرد، بعد از یک مدتی که تعداد مشتریها زیاد میشه روش استفاده از داتاست یواش میشه.
ولی اگر از این روش بخواهید استفاده کنید، داتابایندینگ و یا داتاسورس آخرش شما را به داتاست و تیبل مورد نظر باید برگردید.
استفاده از معماری ۳ لایه توصیه میش.

در ضمن بنا بر چی یک مشتری را میشناسید؟ اسم و فامیل کافی نیست. بالاخره باید یک جوری وجود یک نوع مشتری را تشخیص داد.
در بانک از فیلدهایه کلیدی استفاده میشه،
در معماری ۳ لایه اینکه چجوری یک مشتری با مشتری دیگر حتماً باید فرق داشته باشد بیان میشه.
تو روشهایه پیش پا افتاده با سلکت در سطح فرم تعداد رکوردهایی که ممکنه همین مشتری که الان میخواهد وارد بشه شمرده میشه.

shima2006
جمعه 19 شهریور 1389, 14:01 عصر
من با اسم و فامیلی و شماره پلاک ماشین مشتریها رو می شناسم و چیزی هم راجع به معماری 3 لایه نمی دونم:افسرده:

اَرژنگ
جمعه 19 شهریور 1389, 14:16 عصر
من با اسم و فامیلی و شماره پلاک ماشین مشتریها رو می شناسم و چیزی هم راجع به معماری 3 لایه نمی دونم:افسرده:
۱.برایه اینکه فقط کارتان برایه الان راه بیافته از سلکت استفاده کنید، که به تعداد مشتریهایی که با اسم و فامیل و شماره پلاک به این مشتریی که روش کار میکنید پی ببرید. روش ساده این است که قبل از اینکه مشخصات دیگری از کاربر گرفته بشه با گرفتن همان ۳ تا مشخصات به کاربر اطلاع بدید که این مشتری در داتا بیس وجود دارد، اگر که نه ادامه بدن.
۲. برایه پیشرفت خودتان مطالبی در مورد ۳ لایه مطالعه کنید، من یک مثال ساده در همین تالار فرستاده بودم، اگر تونستید بهش یک نگاه بندازید.

navidkhalilian
جمعه 19 شهریور 1389, 18:01 عصر
دوست عزیز میشه بگی اگر از select نمی خوای استفاده کنی پس از چی می خوای استفاده کنی؟

shima2006
جمعه 19 شهریور 1389, 18:35 عصر
از BindingSource

navidkhalilian
جمعه 19 شهریور 1389, 22:52 عصر
میدونی کار bindingsource چیه؟درمورد ظاهر نه.ببین پشت پرده چی میگزره

raziyehbazargan
یک شنبه 05 شهریور 1391, 09:24 صبح
یکی از فیلدهایی که نمیخواستم کاربر تکراری وارد کنه ایندکس کردم و در زمان اجرا در صورت تکراری بودن پیغام خطا میده اما چظور میتونم پیغامشو کنترل کنم که از برنامه خارج نشه؟؟؟

91857

tooraj_azizi_1035
یک شنبه 05 شهریور 1391, 12:45 عصر
Oops!
دوست من BindingSource دارای خاصیتی به نام Filter هست که شرط رو به صورت رشته می گیره و بعد از اجرا بر خاصیت Count تاثیر میگذاره:
BindingSource1.Filter="Name='Ali' AND ID=10"
if(BindingSource1.Count>0)
//Already recorded!
البته راه اصولی استفاده از LINQ برای جستجو در خود جدول است کار BindingSource عمل Binding است!


این هم مثالی از MSDN که معادل fفارسی مطلب رو در آینده به farsimsdn اضافه می کنم:

private void PopulateDataViewAndFilter()
{
DataSet set1 = new DataSet();

// Some xml data to populate the DataSet with.
string musicXml =
"<?xml version='1.0' encoding='UTF-8'?>" +
"<music>" +
"<recording><artist>Coldplay</artist><cd>X&amp;Y</cd></recording>" +
"<recording><artist>Dave Matthews</artist><cd>Under the Table and Dreaming</cd></recording>" +
"<recording><artist>Dave Matthews</artist><cd>Live at Red Rocks</cd></recording>" +
"<recording><artist>Natalie Merchant</artist><cd>Tigerlily</cd></recording>" +
"<recording><artist>U2</artist><cd>How to Dismantle an Atomic Bomb</cd></recording>" +
"</music>";

// Read the xml.
StringReader reader = new StringReader(musicXml);
set1.ReadXml(reader);

// Get a DataView of the table contained in the dataset.
DataTableCollection tables = set1.Tables;
DataView view1 = new DataView(tables[0]);

// Create a DataGridView control and add it to the form.
DataGridView datagridview1 = new DataGridView();
datagridview1.AutoGenerateColumns = true;
this.Controls.Add(datagridview1);

// Create a BindingSource and set its DataSource property to
// the DataView.
BindingSource source1 = new BindingSource();
source1.DataSource = view1;

// Set the data source for the DataGridView.
datagridview1.DataSource = source1;

//The Filter string can include Boolean expressions.
source1.Filter = "artist = 'Dave Matthews' OR cd = 'Tigerlily'";
}