PDA

View Full Version : دستور Delete در یک برنامه ی 3 لایه



mahdi101
یک شنبه 28 مهر 1392, 17:27 عصر
سلام بر همگی
من می خوام یک دستور delete بنویسم ولی هر کاری می کنم یه جاییش یه اروری میده .حالا تمام مراحلی رو که انجام دادم می نویسم به نظر شما اشتباه از کجاست:گریه:
1) در بانک یکstored procedures به نام Delete_customer ایجاد کردم:

delete from customer_B where c_id='@id'

2) کد های بخش DLL:
public void docommand(string spname, SqlParameter[] p)
{

SqlCommand cmd = new SqlCommand(spname, con);
cmd.Parameters.AddRange(p);
cmd.CommandType = CommandType.StoredProcedure;
con.Open();
cmd.ExecuteNonQuery();
con.Close();
}
public DataTable select(string spname, SqlParameter[] p)
{
SqlDataAdapter da = new SqlDataAdapter(spname, con);
da.SelectCommand.CommandType = CommandType.StoredProcedure;
da.SelectCommand.Parameters.AddRange(p);
DataTable dt = new DataTable();
da.Fill(dt);
return dt;
}

3) کد های بخش BLL :

class BLL_customer_B
{
DAL d = new DAL();

int id;

public int Id
{
get { return id; }
set { id = value; }
}


public void delete()
{
SqlParameter[] p = new SqlParameter[1];
p[0] = new SqlParameter();
p[0].ParameterName = "@id";
p[0].SqlDbType = System.Data.SqlDbType.BigInt;
p[0].Value = id;
d.docommand("Delete_customer", p);
}



4) کدی که روی کلید Delete نوشتم:

dataGridView1[0, dataGridView1.CurrentRow.Index].Value.ToString();
cb.delete();




فکنم مشکل از قسمت 4 با شه .دقیقا نمی دونم.
نمی دونم چه شکلی سطون انتخابی در data gride view رو با متغیر id هماهنگ کنم که هرچی در datagride بود رو در id بریزه و مقدار id بره تو bll و حذف بشه.
لطفا کمک کنید.
ممنون:قلب:

khokhan
یک شنبه 28 مهر 1392, 17:45 عصر
نمی دونم چه شکلی سطون انتخابی در data gride view رو با متغیر id هماهنگ کنم که هرچی در datagride بود رو در id بریزه و مقدار id بره تو bll و حذف بشه.
لطفا کمک کنید.

.................................................. .........................................:لبخن د:

رویداد کلیک باتن:

private void button2_Delete_Click(object sender, EventArgs e)
{
int custID = Convert.ToInt16(dataGridView1[0, dataGridView1.CurrentRow.Index].Value);
DAL.Accessor.Delete(custID);
FillGrid();


}
2 . DAL :

public static void Delete(int id)
{
// buyerId = buyerIdForEdit;
DataClasses1DataContext db = new DataClasses1DataContext();
var matchedcall = (from c in db.GetTable<Table_pb>()
where c.id == id
select c).Single();
try
{

db.Table_pbs.DeleteOnSubmit(matchedcall);
db.SubmitChanges();
}
catch (Exception ex)
{
throw ex;
}
}

3 . Bll :

namespace Phone_Book.BLL
{
public class PhonBookEntry
{
public int ID { get; set; }
public String FirstName { get; set; }
public String LastName { get; set; }
public String Num1 { get; set; }
public String Num2 { get; set; }
public String Num3 { get; set; }
public String Fax { get; set; }
public String Email { get; set; }
public String Post { get; set; }

}
}

mahdi101
یک شنبه 28 مهر 1392, 17:59 عصر
آقای KHOKHAN پس به نظر شما ااین dal که من نوشتم اشتباهه ؟

mahdi101
یک شنبه 28 مهر 1392, 18:02 عصر
اینم خطایی که میده:
Procedure delete_customer has no parameters and arguments were supplied.

mahdi101
یک شنبه 28 مهر 1392, 18:59 عصر
لطفا راهنمایی کنید ....
خیلی ضروریه .....

khokhan
یک شنبه 28 مهر 1392, 19:05 عصر
اینم خطایی که میده:
Procedure delete_customer has no parameters and arguments were supplied.
کدهای شما مربوط به معماری Ado می شه که stored procedure موجود در بانک رو فراخوانی و آ دی گزینه انتخابی توسط کاربر رو به پارامتر موجود stored procedure اختصاص می ده
مضمون پیام اینه که پروکودور شما فاقد پارامتر می باشد
احتمالا کدها رو از دوجای مختلف اقتباس کردید و سعی دارید با هم مخلوط کنید

mahdi101
یک شنبه 28 مهر 1392, 19:13 عصر
کدهای شما مربوط به معماری Ado می شه که stored procedure موجود در بانک رو فراخوانی و آ دی گزینه انتخابی توسط کاربر رو به پارامتر موجود stored procedure اختصاص می ده
مضمون پیام اینه که پروکودور شما فاقد پارامتر می باشد
احتمالا کدها رو از دوجای مختلف اقتباس کردید و سعی دارید با هم مخلوط کنید
یعنی کارم اشتباه است؟؟
درست من با دستور های insert , update هم همین مشکل رو دارم ، اما وقتی برنامه رو دیباگ می کنم (برای دستور insert ) تمام متغیر هام پارامتر میگیرند اما در لایه DAl در کد :
cmd.ExecuteNonQuery();
همون ارور رو میده .
به نظر شما چی کار کنم؟

mahdi101
یک شنبه 28 مهر 1392, 22:36 عصر
:ناراحت::ناراحت::ناراحت:

veniz2008
یک شنبه 28 مهر 1392, 23:46 عصر
سلام.
تاپیک زیر رو ببینید تا مفاهیم رو متوجه بشید.
http://barnamenevis.org/showthread.php?418906-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D8%B3%D9%87-%D9%84%D8%A7%DB%8C%D9%87&highlight=%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87+%D9 %86%D9%88%DB%8C%D8%B3%DB%8C+%DA%86%D9%86%D8%AF+%D9 %84%D8%A7%DB%8C%D9%87

mahdi101
دوشنبه 29 مهر 1392, 17:39 عصر
شرمنده من مثل اون تاپیک هم عمل کردم ولی دوباره همون ارور رو میده:
اگه میشه یه نگاه به برنامه بندازین ببینین مشکلش چیه(لطفا):
ممنون.
http://www.uplooder.net/cgi-bin/dl.cgi?key=4e55baff657cfcb8b4a15ee7e0f4f0f2

mahdi101
دوشنبه 29 مهر 1392, 22:17 عصر
جوابی نبود ؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟
:ناراحت:

khokhan
دوشنبه 29 مهر 1392, 23:27 عصر
جوابی نبود ؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟
:ناراحت:
اول از همه گفتن این نکته لازمه که ..........................................:لبخ د:
کدهای مربوط به کلاس BLL رو به این شکل بنویسین :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace WindowsFormsApplication2
{
public class customer
{
public int c_id { get; set; }
public string c_name { get; set; }
public string c_family { get; set; }
public int c_mobile { get; set; }
public int c_tell { get; set; }
public string c_adress { get; set; }
}
}rror('Invalid customer Id',16,1)

واین هم برای کلاس DAL :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;
using System.Collections;

namespace WindowsFormsApplication2
{
public class customer_DAL
{
public static DataTable getcustomers()
{
SqlConnection con = new SqlConnection(Database.ConnectionString);
SqlDataAdapter da = new SqlDataAdapter("customers", con);
da.SelectCommand.CommandType = CommandType.StoredProcedure;
DataSet ds = new DataSet();
da.Fill(ds, "customer_B");
return ds.Tables[0];
}

public static ArrayList GetBook(int bookid)
{
ArrayList sequence = new ArrayList();
SqlConnection con = new SqlConnection(Database.ConnectionString);
try
{
con.Open();
SqlCommand cmd = new SqlCommand("getcustomers", con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@c_id", bookid);
SqlDataReader dr = cmd.ExecuteReader();
if (dr.Read())
{
customer b = new customer();
b.c_id =int.Parse( dr["c_id"].ToString());
b.c_name = dr["c_name"].ToString();
b.c_family = dr["c_family"].ToString();
b.c_mobile = int.Parse(dr["c_mobile"].ToString());
b.c_tell = int.Parse(dr["c_tell"].ToString());
b.c_adress = dr["c_adress"].ToString();
sequence.Add(b);
return sequence;
}
else
return null;
}
catch (Exception ex)
{
return null;
}
finally
{
con.Close();
}
}

public static string Addcustomer(string c_name,string c_family,int c_mobile,int c_tell,string c_adress)
{
SqlConnection con = new SqlConnection(Database.ConnectionString);
try
{
con.Open();
SqlCommand cmd = new SqlCommand("Addcustomers", con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@c_name ",c_name);
cmd.Parameters.AddWithValue("@c_family", c_family);
cmd.Parameters.AddWithValue("@c_mobile", c_mobile);
cmd.Parameters.AddWithValue("@c_tell", c_tell);
cmd.Parameters.AddWithValue("@c_adress", c_adress);
cmd.ExecuteNonQuery();
return null;
}
catch (Exception ex)
{
return ex.Message;
}
finally
{
con.Close();
}
}

public static string DeleteBook(int bookid)
{
SqlConnection con = new SqlConnection(Database.ConnectionString);
try
{
con.Open();
SqlCommand cmd = new SqlCommand("Deletecustomer", con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@cid", bookid);
cmd.ExecuteNonQuery();
return null;
}
catch (Exception ex)
{
return ex.Message;
}
finally
{
con.Close();
}
}
public static string Updatecustomer(int c_id,string c_name, string c_family, int c_mobile, int c_tell, string c_adress)
{
SqlConnection con = new SqlConnection(Database.ConnectionString);
try
{
con.Open();
SqlCommand cmd = new SqlCommand("Updatecost", con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@c_id ", c_id);
cmd.Parameters.AddWithValue("@c_name ", c_name);
cmd.Parameters.AddWithValue("@c_family", c_family);
cmd.Parameters.AddWithValue("@c_mobile", c_mobile);
cmd.Parameters.AddWithValue("@c_tell", c_tell);
cmd.Parameters.AddWithValue("@c_adress", c_adress);
cmd.ExecuteNonQuery();
return null;
}
catch (Exception ex)
{
return ex.Message;
}
finally
{
con.Close();
}
}
}
}

حالا در رویداد کلیک باتن حذف می نویسین :

private void button1_Click(object sender, EventArgs e)
{
string msg = customer_DAL.DeleteBook(Int32.Parse(textBox1.Text) );
if (msg == null)
{
MessageBox.Show("برو خدا رو شکر کن حذف صورت گرفت وگرنه....");
fillgrid();
}
else
MessageBox.Show("Error -> " + msg);

}
و این هم پروژه حضرتعالی با معماری چند لایه و stored procedures به همراه امکان افزودن جدید و حذف و ویرایش ............................:لبخند: