PDA

View Full Version : بررسی وجود یا عدم وجود رکورد، قبل از ثبت در بانک



SHD.NET
پنج شنبه 10 اسفند 1391, 12:13 عصر
سلام .

ما یه بانک اکسس داریم، 3 تا فیلد رو میخوایم در جدولی به نام shdtbl ذخیره کنیم، با ذخیره کردنشون مشکلی ندارم، اما سوال من اینه:
چجوری میشه قبل از ذخیره رکورد ، چک کنه و ببینه اگه همچین اطلاعاتی از قبل وجود داشت، از ثبت اون جلوگیری کنه و عملیات متوقف بشه،

پیشاپیش از راهنماییتون ممنون

ali.bahrami
پنج شنبه 10 اسفند 1391, 12:35 عصر
خوب دوست عزیز اگر یکی از اون فیلدها به عنوان فیلد کلید باشه راحت میشه متوجه شد ... یا قبل از اینکه اطلاعات را insert کنی یه select از جدول بگیر ببین چند تا رکورد با اون اطلاعات توی جدول هست اگر بیش از یکی بود میتونی از ثبت جلوگیری کنی.
کوئری :
SELECT COUNT(*) FROM shdtbl WHERE .......
جای چند نقطه مقادیری را که میخوای ثبت کنی با مقادیر فیلدها مقایسه میکنی.

samadblaj
پنج شنبه 10 اسفند 1391, 12:38 عصر
سلام یه query بگیر اگه مقدار برگشتی null بود ثبت کنه...

ابتدا عذر خواهی میکنم به صورت عکس هستش من بعضی کد ها رو به این شکل آرشیو میکنم تا مجبور به تایپ دوباره باشم...
و احتمالا شما هم از روش EF استفاده نمیکنید ساده هستش...

در کد زیر چک میکنه اگه در ستون Usename جدول فیلد تکراری (textbox1) پیدا شد از درج دوباره جلوگیری کنه شما میتونید مقدار با عمل منطقی || و && روی چند ستوین ایجاد کنید...
دوستان دیگه هم اگه ado کار کردند براتون کد های بهتری قرار میدن ولی روش پیاده از EF به این شکل جواب میده... :چشمک:

Yanehsar
پنج شنبه 10 اسفند 1391, 12:39 عصر
سلام
می تونید هر سه تا فیلد تا یکی از فیلد های مهم رو کلیدی کنید خوده بانک جلوی اضافه کردن رو می گیره یه روش دیگه هم دستور شمارش هستش .همون Select منظورمه تعداد نفراتی که نام ، نام خانوادگی و سنشان برابر با مقدار شما بود بشمار اگر از یک بیشتر بود پس در بانک وجود داره در غیر اینصورت در بانک وجود نداره دیگه!

veniz2008
پنج شنبه 10 اسفند 1391, 12:40 عصر
سلام.
چندین راه وجود داره. یه راه میتونه این باشه اول یه select بزنی و نتیجه select رو بریزی تو یه دیتاتیبل و سطرهاشو چک کنی. اگر صفر بود یعنی رکورد قبلا ثبت نشده و بعدش دستور درج رو مینویسید در غیر اینصورت قبلا وجود داشته و یه پیغام صادر میکنید.
راه دومش اینه که همشو داخل یه sp انجام بدی:
شما یه sp بنویس و یه مقدار برگشتی درونش تعریف کن بصورت زیر :

create proc AddPaye
@fild1 int,
@fild2 int,
@fild3 int,
@result int output
as
if(EXISTS(select * from shdtbl where fild1 = @fild1 and fild2 = @fild2 and fild3 = @fild3))
set @result = 1
else
begin
set @result = 0
insert into shdtbl values(@fild1,@fild2,@fild3)
end
go
درون #C هم به اینصورت بنویسید :

SqlConnection con = new SqlConnection("Data Source = .\\md2008;Initial Catalog = ManageStudent;Integrated Security = True");
SqlCommand cmd = new SqlCommand();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "AddPaye";
cmd.Parameters.AddWithValue("@fild1", TxtFild1.Text);
cmd.Parameters.AddWithValue("@fild2", TxtFild2.Text);
cmd.Parameters.AddWithValue("@fild3", TxtFild3.Text);
cmd.Parameters.Add("@result", SqlDbType.Int);
cmd.Parameters["@result"].Direction = ParameterDirection.Output;
con.Open();
cmd.ExecuteNonQuery();
int res = Convert.ToInt32(cmd.Parameters["@result"].Value.ToString());
con.Close();
if(res == 1)
MessageBox.Show("این مقادیر قبلا ثبت شده است");
else
MessageBox.Show("رکورد مورد نظر با موفقیت ثبت گردید");
البته اینا واسه sql هست خودتون با oledb ست کنید.
موفق باشید.

SHD.NET
پنج شنبه 10 اسفند 1391, 18:10 عصر
سلام . من چون اولین باره دارم اکسس کار می کنم، روش کار رو می دونم اما فقط کدنویسیش رو کمی گیج شدم، من از این کدها برای ثبت استفاده می کنم، اگه آمادشو بزارین خیلی خوب میشه.
(البته کدهایی که الان میزارم vb.net هستش)

Try
Dim com As New OleDbCommand
com.Connection = con
com.CommandText = "insert into shdtbl values('" & TextBox1.Text & "','" & TextBox2.Text & "','" & _
TextBox3.Text & "')"

com.ExecuteNonQuery()



thanX

veniz2008
پنج شنبه 10 اسفند 1391, 21:16 عصر
نمیدونم چرا سمت اکسس رفتی ولی از همون اول ازش بدم میومد (خاک تو سرشون کنن با این محیط طراحی فوق پیشرفتش).
به هر حال این کد کار شما رو راه مینداره.
توجه : من یه دیتابیس با نام db1 و در مسیر ذکر شده در کانکشن استرینگ ساختم. یک جدول با نام TblUser و با سه فیلد UserID از نوع number و UName از نوع Text و UFamily هم از نوع Text ساختم.
موفق باشی دوست من.

OleDbConnection con = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\veniz\Documents\db1.mdb");
OleDbDataAdapter da = new OleDbDataAdapter("select * from TblUser where UserID = @userid and UName = @uname and UFamily = @ufamily",con);
da.SelectCommand.Parameters.AddWithValue("@userid", TxtID.Text);
da.SelectCommand.Parameters.AddWithValue("@uname", TxtName.Text);
da.SelectCommand.Parameters.AddWithValue("@ufamily", TxtFamily.Text);
DataTable dt = new DataTable();
da.Fill(dt);
if (dt.Rows.Count > 0)
{
MessageBox.Show("این کد قبلا ثبت شده است");
}
else
{
OleDbCommand cmd = new OleDbCommand("insert into TblUser values(@userid,@uname,@ufamily)", con);
cmd.Parameters.AddWithValue("@id", TxtID.Text);
cmd.Parameters.AddWithValue("@name", TxtName.Text);
cmd.Parameters.AddWithValue("@family", TxtFamily.Text);
con.Open();
cmd.ExecuteNonQuery();
con.Close();
MessageBox.Show("اطلاعات با موفقیت ثبت گردید");
}

SHD.NET
پنج شنبه 10 اسفند 1391, 21:48 عصر
برای SQL چه چیزایی لازمه ؟؟ چه نرم افزارهایی ؟؟ آموزش جامع و خوب داره ؟؟؟

veniz2008
پنج شنبه 10 اسفند 1391, 22:02 عصر
برای SQL چه چیزایی لازمه ؟؟ چه نرم افزارهایی ؟؟ آموزش جامع و خوب داره ؟؟؟
الان نسخه 2012 اومده ولی اکثرا همچنان نسخه sql server 2008 R2 رو استفاده میکنن. نرم افزار جانبی خاصی نیاز ندارید. آموزش هم تا دلتون بخواد هست کافیه یه سرچ تو گوگل بزنی. یه pdf هم چند ماه قبل درباره دستورات sql خودم در سایت گذاشتم که اونم اگه تو سایت بگردید پیدا میکنید.
موفق باشی مهندس.

ma.rad
پنج شنبه 10 اسفند 1391, 22:09 عصر
تو sp این کد رو بنویس: البته روش های بهتری هم هست

ALTER PROCEDURE dbo.StudentAdd

(
@P_Name nvarchar(50),
@P_Family nvarchar(50),
@P_Age int,
@P_Degree nvarchar(50),
@P_Address ntext,
@Result nvarchar(30) output
)
AS

declare @ID int
set @Id=0

select @Id=Id from student where name=@P_Name

if @Id=0
begin
insert into Student (name,family,age,degree,address) values (@P_Name,@P_Family,@P_Age,@P_Degree,@P_Address)
set @result='افزودن با موفقیت انجام شده'
end
else
set @result='نام وارد شده تکراری است'


RETURN

SHD.NET
پنج شنبه 10 اسفند 1391, 22:38 عصر
الان نسخه 2012 اومده ولی اکثرا همچنان نسخه sql server 2008 R2 رو استفاده میکنن. نرم افزار جانبی خاصی نیاز ندارید. آموزش هم تا دلتون بخواد هست کافیه یه سرچ تو گوگل بزنی. یه pdf هم چند ماه قبل درباره دستورات sql خودم در سایت گذاشتم که اونم اگه تو سایت بگردید پیدا میکنید.
موفق باشی مهندس.

این نرم افزار که شما میگین فقط برای ایجاد بانک اطلاعاتی هستش ؟؟؟ یعنی میشه با نرم افزارهای دیگه ای که قابلیت ایجاد بانک SQL رو دارن این کارو کرد ؟؟

veniz2008
پنج شنبه 10 اسفند 1391, 23:25 عصر
این نرم افزار که شما میگین فقط برای ایجاد بانک اطلاعاتی هستش ؟؟؟ یعنی میشه با نرم افزارهای دیگه ای که قابلیت ایجاد بانک SQL رو دارن این کارو کرد ؟؟
ساخت جداول فقط ذره ای از امکانات sql server هست. sql از لحاظ قدرت و امکانات قابل مقایسه با Access نیست. الان بین دیتابیس ها رقابت اصلی بین sql server و oracle هست که به دلیل سادگی در کار با sql اکثر برنامه نویس ها، sql server رو به عنوان دیتابیس برنامشون استفاده میکنن. البته انتخاب دیتابیس، به عوامل دیگه ای هم بستگی داره از جمله سازگاری و پشتیبانی محیط برنامه نویسی از دیتابیس مورد استفاده. مثلا دوستان PHP کار تا جایی که من اطلاع دارم از MySQL به عنوان دیتابیس استفاده میکنن ولی دوستان #C کار تقریبا اکثرشون از sql server استفاده میکنن.

momimomi
دوشنبه 05 فروردین 1392, 19:12 عصر
نمیدونم چرا سمت اکسس رفتی ولی از همون اول ازش بدم میومد (خاک تو سرشون کنن با این محیط طراحی فوق پیشرفتش).
به هر حال این کد کار شما رو راه مینداره.
توجه : من یه دیتابیس با نام db1 و در مسیر ذکر شده در کانکشن استرینگ ساختم. یک جدول با نام TblUser و با سه فیلد UserID از نوع number و UName از نوع Text و UFamily هم از نوع Text ساختم.
موفق باشی دوست من.

OleDbConnection con = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\veniz\Documents\db1.mdb");
OleDbDataAdapter da = new OleDbDataAdapter("select * from TblUser where UserID = @userid and UName = @uname and UFamily = @ufamily",con);
da.SelectCommand.Parameters.AddWithValue("@userid", TxtID.Text);
da.SelectCommand.Parameters.AddWithValue("@uname", TxtName.Text);
da.SelectCommand.Parameters.AddWithValue("@ufamily", TxtFamily.Text);
DataTable dt = new DataTable();
da.Fill(dt);
if (dt.Rows.Count > 0)
{
MessageBox.Show("این کد قبلا ثبت شده است");
}
else
{
OleDbCommand cmd = new OleDbCommand("insert into TblUser values(@userid,@uname,@ufamily)", con);
cmd.Parameters.AddWithValue("@id", TxtID.Text);
cmd.Parameters.AddWithValue("@name", TxtName.Text);
cmd.Parameters.AddWithValue("@family", TxtFamily.Text);
con.Open();
cmd.ExecuteNonQuery();
con.Close();
MessageBox.Show("اطلاعات با موفقیت ثبت گردید");
}
سلام
سال نو مبارک
دوست عزیز بنده مبتدی هستم اما یه سوال برام پیش اومده: چون دستور count (شمارش رکوردها) برای بانکهای اطلاعاتی بزرگ زمان بر است, اگه از دستور exists استفاده کنیم بهتر نیست؟

veniz2008
دوشنبه 05 فروردین 1392, 20:18 عصر
دوست عزیز بنده مبتدی هستم اما یه سوال برام پیش اومده: چون دستور count (شمارش رکوردها) برای بانکهای اطلاعاتی بزرگ زمان بر است, اگه از دستور exists استفاده کنیم بهتر نیست؟
بله حرف شما صحیح هست و این موردی که من گفتم فقط من باب مثال ذکر شده که دوستمون یه ذهنیت نسبت به پیاده سازی مطلب بدست بیارن وگرنه در پست 5 راه صحیح ذکر شده که در برنامه های خودم از همین روش Exists استفاده میکنم. دلبل اینکه EXISTS نسبت به COUNT سریعتر هست به این دلیله که تابع Exists زمانیکه رکورد مورد نظر رو پیدا کنه دیگه بقیه رکوردها رو پیمایش نمیکنه و مقدار true رو برمیگردونه ولی در count همه رکوردها تا آخرین رکورد پیمایش میشن تا تعداد رکوردها با شرط وارد شده رو بدست بیاره. بنابراین در تعداد زیاد رکوردها سرعت Exists بیشتر خواهد بود.
موفق باشید.

momimomi
دوشنبه 05 فروردین 1392, 21:55 عصر
با تشکر از راهنمایی جنابعالی
متاسفانه یا خوشبختانه پایگاه داده بنده هم اکسس هست و تا کنون با sp نکرده ام، پست 5 رو بررسی کردم آیا sp رو در اکسس هم می شود ایجاد کرد، لطفا با توجه به مبتدی بودن بنده توضیح بیشتری ذکر بفرمایید.
ممنون

momimomi
دوشنبه 05 فروردین 1392, 22:47 عصر
نمیدونم چرا سمت اکسس رفتی ولی از همون اول ازش بدم میومد (خاک تو سرشون کنن با این محیط طراحی فوق پیشرفتش).
به هر حال این کد کار شما رو راه مینداره.
توجه : من یه دیتابیس با نام db1 و در مسیر ذکر شده در کانکشن استرینگ ساختم. یک جدول با نام TblUser و با سه فیلد UserID از نوع number و UName از نوع Text و UFamily هم از نوع Text ساختم.
موفق باشی دوست من.

OleDbConnection con = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\veniz\Documents\db1.mdb");
OleDbDataAdapter da = new OleDbDataAdapter("select * from TblUser where UserID = @userid and UName = @uname and UFamily = @ufamily",con);
da.SelectCommand.Parameters.AddWithValue("@userid", TxtID.Text);
da.SelectCommand.Parameters.AddWithValue("@uname", TxtName.Text);
da.SelectCommand.Parameters.AddWithValue("@ufamily", TxtFamily.Text);
DataTable dt = new DataTable();
da.Fill(dt);
if (dt.Rows.Count > 0)
{
MessageBox.Show("این کد قبلا ثبت شده است");
}
else
{
OleDbCommand cmd = new OleDbCommand("insert into TblUser values(@userid,@uname,@ufamily)", con);
cmd.Parameters.AddWithValue("@id", TxtID.Text);
cmd.Parameters.AddWithValue("@name", TxtName.Text);
cmd.Parameters.AddWithValue("@family", TxtFamily.Text);
con.Open();
cmd.ExecuteNonQuery();
con.Close();
MessageBox.Show("اطلاعات با موفقیت ثبت گردید");
}

سلام
من این کدها رو نوشتم ولی همچنان اطلاعات تکراری درج می کنه
به نظر شما اشکال کار کجاست؟

private void btnSabtEstelam_Click(object sender, EventArgs e)
{
//ثبت استعلام غیر تکراری
OleDbConnection con = new OleDbConnection();
con.ConnectionString = @"provider = microsoft.jet.oledb.4.0;" + @"data source =TS.mdb";
OleDbDataAdapter da = new OleDbDataAdapter("select * from estelam where " +
"code = @code and shestelam = @shestelam and taestelam = @taestelam and subject = @subject" +
" and az = @az and details = @details and tavosool = @tavosool and shsabt = @shsabt" +
" and tasabt = @tasabt", con);
da.SelectCommand.Parameters.AddWithValue("@code", txtCode.Text);
da.SelectCommand.Parameters.AddWithValue("@shestelam", txtsh.Text);
da.SelectCommand.Parameters.AddWithValue("@taestelam", faDatetaestelam.GetDateString());
da.SelectCommand.Parameters.AddWithValue("@subject", cmbSubject.Text);
da.SelectCommand.Parameters.AddWithValue("@az", cmbAz.Text);
da.SelectCommand.Parameters.AddWithValue("@details", cmbDetail.Text);
da.SelectCommand.Parameters.AddWithValue("@tavosool", faDatetavosool.GetDateString());
da.SelectCommand.Parameters.AddWithValue("@shsabt", txtShSabt.Text);
da.SelectCommand.Parameters.AddWithValue("@tasabt", faDatetasabt.GetDateString());
DataTable dt = new DataTable();
da.Fill(dt);
if (dt.Rows.Count > 0)
{
MessageBox.Show("این استعلام قبلا ثبت شده است");
}
else
{
OleDbCommand cmd = new OleDbCommand("INSERT INTO estelam (code,shestelam," +
"taestelam,az,subject,details,tavosool,shsabt,tasab t)" +
"values(@code,@shestelam,@taestelam,@az,@subject,@d etails,@tavossol,@shsabt,@tasabt)", con);
cmd.Parameters.AddWithValue("@code", txtCode.Text);
cmd.Parameters.AddWithValue("@shestelam", txtsh.Text);
cmd.Parameters.AddWithValue("@taestelam", faDatetaestelam.GetDateString());
cmd.Parameters.AddWithValue("@subject", cmbSubject.Text);
cmd.Parameters.AddWithValue("@az", cmbAz.Text);
cmd.Parameters.AddWithValue("@details", cmbDetail.Text);
cmd.Parameters.AddWithValue("@tavosool", faDatetavosool.GetDateString());
cmd.Parameters.AddWithValue("@shsabt", txtShSabt.Text);
cmd.Parameters.AddWithValue("@tasabt", faDatetasabt.GetDateString());
con.Open();
cmd.ExecuteNonQuery();
con.Close();
MessageBox.Show("استعلام با موفقیت ثبت گردید");

veniz2008
دوشنبه 05 فروردین 1392, 23:32 عصر
معمولا فقط کلید رو چک میکنن که تکراری نباشه و چک کردن این همه فیلد در دستور Select به نظر کار صحیحی نمیاد. توصیه میکنم مفاهیم مقدماتی بانک های اطلاعاتی رو مطالعه کنید. بهتره جداولتون رو دوباره یه بازنگری کنید. شاید نیاز باشه که دیدتون رو نسبت به مسائل عوض کنید.
در مورد کدها اینو بگم که ظاهر امر مشکلی نیست ولی حتی یک فاصله (space ) هم میتونه یک رکورد رو با رکورد قبلی متمایز کنه.
موفق باشی دوست عزیز.

momimomi
جمعه 16 فروردین 1392, 06:15 صبح
معمولا فقط کلید رو چک میکنن که تکراری نباشه و چک کردن این همه فیلد در دستور Select به نظر کار صحیحی نمیاد. توصیه میکنم مفاهیم مقدماتی بانک های اطلاعاتی رو مطالعه کنید. بهتره جداولتون رو دوباره یه بازنگری کنید. شاید نیاز باشه که دیدتون رو نسبت به مسائل عوض کنید.
در مورد کدها اینو بگم که ظاهر امر مشکلی نیست ولی حتی یک فاصله (space ) هم میتونه یک رکورد رو با رکورد قبلی متمایز کنه.
موفق باشی دوست عزیز.
بنده مجبورم جدولم رو به این شکل طراحی کنم، کدهای بالا رو هم حسابی بررسی کردم اما بازم اطلاعات تکراری ثبت می کنه یه جای کدها اشکال داره.

veniz2008
جمعه 16 فروردین 1392, 10:45 صبح
بنده مجبورم جدولم رو به این شکل طراحی کنم، کدهای بالا رو هم حسابی بررسی کردم اما بازم اطلاعات تکراری ثبت می کنه یه جای کدها اشکال داره.
اگر فکر میکنید طراحیتون درسته!!! در اینصورت هیچ حرفی باقی نمیمونه.
اما بریم سراغ مشکلتون. کدها صحیح هستن و مشکلی ندارن ولی دو تا مورد به ذهنم میرسه که باید در برنامتون چک کنید:
مورد اول مربوط به متد ()GetDateString هست که ظاهرا به عنوان تاریخ برای شما کاربرد داره. خروجی این متد به چه شکلی هست؟(فقط روز و ماه و سال رو داره یا شامل چیز دیگه ای هم هست؟)
مورد بعدی اینه که بهتره به آخر textbox ها یک ()Trim اضافه کنید که احیانا اگر فضاهای خالی وجود داره رو حذف کنه مثلا برای یکی از تکست باکس به شکل زیر میشه:


cmd.Parameters.AddWithValue("@code", txtCode.Text.Trim());

momimomi
شنبه 17 فروردین 1392, 00:04 صبح
با سلام
خروجی متد ()GetDateString به صورت 1392/01/17 هست
متد Trim رو هم اضافه کردم اما جواب نداد.
اگه بخوام سه فیلد رو چک کنه: shestelam, taestelam , az و تکراری بودن بقیه مهم نباشه، چه تغییری باید بدم؟
ممنون

veniz2008
شنبه 17 فروردین 1392, 00:16 صبح
اگه بخوام سه فیلد رو چک کنه: shestelam, taestelam , az و تکراری بودن بقیه مهم نباشه، چه تغییری باید بدم؟
باید در شرط خودتون (همون where ) نام 3 فیلد مورد نظرتون رو قید کنید و بقیه فیلدها رو از عبارت شرط پاک کنید.