PDA

View Full Version : جلوگیری از تکرار اطلاعات



qasemi.endless
سه شنبه 25 بهمن 1390, 15:32 عصر
سلام .
من یه کد می خوام که اجازه نده (مثلا یه دانشجو بتونه درسی رو که پاس کرده دوباره برداره , و مثلا استاد نتواند در یه روز 2تا کلاس در یک ساعت بگیرد)
لطفا کمکم منید لنگ این قسمت پروژه ام هستم :ناراحت:

m2_farzan
سه شنبه 25 بهمن 1390, 15:52 عصر
سوالتون واضح نیست.

داخل چی میخواید داده تکراری وارد نشه؟ یک پایگاه داده یا یه آرایه ای چیزی؟

در مجموع باید با یه حلقه ی For تک تک رکورد ها رو چک کنید.

qasemi.endless
سه شنبه 25 بهمن 1390, 16:14 عصر
آره راست میگی - ببخشید.
من با سی شارپ یه پروژه دارم که سیستم ثبت نام دانشگاه هست با بانک اکسس.
حالا می خوام کدی بنویسم که به کاربر اجازه نده که بتواند یه استاد رو در کلاس یکسان و در ساعت همزمان ثبت کند.
ممنون میشم شبه کدش رو برام بنویسی .

sadaf_
سه شنبه 25 بهمن 1390, 16:19 عصر
می تونین در دیتابیس به صورت محدودیت ها فیلتر کنین و اوها را به کاربر نمایش بدید
و قطعا کاربر همونی رو انتخاب می کنه که براش محدود شده

qasemi.endless
سه شنبه 25 بهمن 1390, 16:30 عصر
من برنامه نویسیم کلا خوب نیست , میشه کد مربوطه رو برام بنویسید , اگه مقدوره مرسی .

sadaf_
سه شنبه 25 بهمن 1390, 16:40 عصر
select * from TableName Where NameField = Value

این دستور در دیتابیس کاربرد داره در view یا sp
اگر مشکلت زیاده باید جزئیات بیشتری رو مطرح کنی تا دوستان کمکت کنند
از table ها بگو ارتباط بین اینها
یا دیتابیس رو بگذار یا هم ازشون عکس بگذار و یه توضیح هم بده

Hybrid
سه شنبه 25 بهمن 1390, 17:58 عصر
سلام ،

بهتره از Count و Where استفاده کنی به مثال زیر دقت کن :


SqlCommand cmd = new SqlCommand();
cmd.CommandType = CommandType.Text;
cmd.CommandText = "Select count(*) from table1 where dars=@param";
cmd.Parameters.AddWithValue("@param", textBox1.Text.Trim());

int a = 0;
a = Convert.ToInt32(cmd.ExecuteScalar());

if (a > 0)
{
MessageBox.Show("این درس قبلا توسط استاد گرفته شده");
}
else
{
//Do somrthing
}

موفق باشید./

mehdi.mousavi
چهارشنبه 26 بهمن 1390, 00:43 صبح
سلام ، بهتره از Count و Where استفاده کنی

سلام.
بهتر اینه که از EXISTS استفاده کنید (یا در هنگام استفاده از LINQ، از Any استفاده کنید).
به بیان دیگه، SQL Statement شما باید یه Bool (یا از دید بانک، یه BIT) برگردونه:

IF EXISTS (SELECT * FROM ...) RETURN 1
RETURN 0

موفق باشید.

vahdani_d
دوشنبه 08 اسفند 1390, 00:58 صبح
سلام.
بهتر اینه که از EXISTS استفاده کنید (یا در هنگام استفاده از LINQ، از Any استفاده کنید).
به بیان دیگه، SQL Statement شما باید یه Bool (یا از دید بانک، یه BIT) برگردونه:

IF EXISTS (SELECT * FROM ...) RETURN 1

RETURN 0

موفق باشید.

میشه لطفا بیشتر توضیح بدید ؟
برای جلو گیری ازداده تکراری چه کاری باید کرد ؟

vahdani_d
دوشنبه 08 اسفند 1390, 10:36 صبح
من فرض کردم فیلدی که میخوای چک کنی id است


SqlConnection Con = new SqlConnection("Connection String");
SqlCommand Cmd = new SqlCommand();
Cmd.CommandText = "Insert into TableName ( id, ...) values (@id, ...)";
Cmd.Parameters.AddWithValue("@id", textBox1.Text);
//Add Other Parameters
Cmd.Connection = Con;
Con.Open();
try
{
Cmd.ExecuteNonQuery();
MessageBox.Show("Your Command Accept");
}
catch
{
MessageBox.Show("This ID is existing");
}
finally
{
Con.Close();
}


این راه هم هست برای جلو گیری از داده تکراری اما کد تاپیک قبلی رو میشه توضیح بدید ؟

mehdi.mousavi
دوشنبه 08 اسفند 1390, 10:56 صبح
میشه لطفا بیشتر توضیح بدید ؟ برای جلو گیری ازداده تکراری چه کاری باید کرد ؟

سلام.
برای جلوگیری از ورود داده تکراری، باید در Stored Procedure مورد نظر، EXISTS ای بنویسید که ابتدا مطمن بشید رکورد وجود نداره، سپس اقدام به INSERT کردن رکورد کنید:


IF NOT EXISTS(SELECT * FROM Customers WHERE Name=N'Mehdi') BEGIN
INSERT INTO Customers(Name) VALUES('Mehdi')
END

اینجا، من ابتدا مطمئن میشم که در جدول Customer ها مشتری ای با اسم مهدی ندارم، اگر نبود، اونوقت عمل Insert رو انجام میدم. البته، این بدین معنا نیست که نباید Constraint های مربوطه رو روی بانک تعریف کنید...



این راه هم هست برای جلو گیری از داده تکراری اما کد تاپیک قبلی رو میشه توضیح بدید ؟

ببینید. در حالت کلی، وقتی از EXISTS استفاده می کنیم، RDBMS اگر به اولین رکورد مورد نظر ما برسه، میتونه عملیات رو متوقف کنه. چرا؟ چون متوجه میشه حداقل یک رکورد با شرایط مورد نظر ما در بانک وجود داره. اما وقتی از COUNT(*) استفاده می کنید، RDBMS رو مجبور به شمارش کلیه Row هایی که حاوی شرط مورد نظر هستن، می کنید. بسته به شرایط، استفاده از COUNT میتونه صدها برابر (یا حتی بیشتر) کندتر از EXISTS باشه. بنابراین، هرگز نباید برای تست وجود یا عدم وجود یک رکورد، از COUNT استفاده کرد. این مقاله (http://sqlblog.com/blogs/andrew_kelly/archive/2007/12/15/exists-vs-count-the-battle-never-ends.aspx) مقایسه جالبی بین این دو و Performance هر یک انجام داده.

اما کدی که شما بهش اشاره کردید، داره از این واقعیت استفاده می کنه که روی بانک Constraint ای Unique برای اون ستون خاص تعریف کرده، در نتیجه، هنگام درج داده تکراری، Exception ای Throw میشه و ما (به نوعی) متوجه میشیم که داده تکراری هستش. اما این Exception ممکنه بنا به دلائل متفاوتی throw بشه و نمیشه لزوما گفت که به صرف تکراری بودن رکورد بوده که Exception مورد نظر Throw شده. تولید و مدیریت Exception ها در سیستم بسیار هزینه بر هستش، بنابراین هر جا که بشه از اونها پرهیز کرد، باید اینکار رو انجام داد. در کدی که من نوشتم، شما می تونید با Return Value ای متوجه تکراری بودن، یا نبودن رکورد مورد نظر بشید، بدون اینکه سیستم رو مجبور به تولید و مدیریت Exception کنید....

موفق باشید.

javady_joon
جمعه 28 شهریور 1393, 15:34 عصر
سلام
ولی من هرچیزی وارد میکنم میگه تکراریه چرا من این مشکل رو دارم؟

danialafshari
جمعه 28 شهریور 1393, 19:41 عصر
سلام
ولی من هرچیزی وارد میکنم میگه تکراریه چرا من این مشکل رو دارم؟

کد SP رو قرار بدید
یک نمونه sp
USE [dbGlass]
GO
/****** Object: StoredProcedure [dbo].[SP_Test] Script Date: 09/19/2014 20:24:29 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER proc [dbo].[SP_Test]
(
@n nvarchar(30),
@Result bit output
)
AS
BEGIN

if not Exists (SELECT TOP (1) codeContact, n, nf FROM tbl_Contacts WHERE (n = @n))
Begin
set @Result=(0)
-- code for insert
End
Else
Begin
set @Result=(1)
End

END

javady_joon
شنبه 29 شهریور 1393, 01:05 صبح
با سلام این کد من این کدها رو کجاش بذارم؟



SqlConnection conn = new SqlConnection("Data Source=(LocalDB)\\v11.0;AttachDbFilename=C:\\Users \\hajiabad\\documents\\visual studio 2012\\Projects\\bank\\bank\\11.mdf;Integrated Security=True");

SqlCommand cmd = new SqlCommand();

cmd.Connection = conn;
cmd.CommandText = "insert into login ([User] , [password]) Values ('" + textBox1.Text.ToString() + "','" + textBox2.Text + "')";
cmd.Parameters.AddWithValue("[password]", textBox1.Text);
conn.Open();

cmd.ExecuteNonQuery();

conn.Close();