PDA

View Full Version : سوال: ویرایش و حذف دیتاگرید روی store procedure



bahareh1368
پنج شنبه 25 شهریور 1389, 15:21 عصر
با سلام خدمت برنامه نویسان عزیز

علی رغم توضیحات و جواب های بی شمار دریاره ویرایش و حذف از دیتاگرید اما نتونستم مطلبی رو که در این باره که روی storeproceture کار کنه پیدا کنم.
من اطلاعاتم را درون دیتا گرید نمایش می دم می خوام با کلیک روی هر سطر و انجام ویرایش و زدن کلید ویرایش این تغییرات اعمال بشه.برنامه خطا نداره اما وقتی تغییراتی را روی داده ها می دم و کلید ویرایش و می زنم این تغییرات در sql ذخیره نمی شه.این اتفاق واسه حذف کردن یک رکورد انتخاب شده از دیتاگرید هم می افته.با توجه به کدی که من نوشتم لطفا منو راهنمایی کنید.باتشکر.

private void btnUpdate_Click_1(object sender, EventArgs e)
{
SqlConnection cn = new SqlConnection();
SqlCommand cmd = new SqlCommand("PhoneBook_Update",cn);
cn.ConnectionString = "server=HAMED-PC;database=PhoneBook;uid=sa;pwd=hamed;";
cmd.Connection = cn;
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "PhoneBook_Update";

SqlDataAdapter da = new SqlDataAdapter(cmd);

cmd.Parameters.Add("@Name", SqlDbType.NVarChar, 15).Value = txtName.Text;
cmd.Parameters.Add("@FName", SqlDbType.NVarChar, 25).Value = txtFname.Text;


DataTable dt = new DataTable();

da.Update(dt);

dgvphonebook.DataSource = dt;

}


اینم کد حذف:

private void btnDelete_Click(object sender, EventArgs e)
{
SqlConnection cn = new SqlConnection();
SqlCommand cmd = new SqlCommand("PhoneBook_Update", cn);
cn.ConnectionString = "server=HAMED-PC;database=PhoneBook;uid=sa;pwd=hamed;";
cmd.Connection = cn;
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "PhoneBook_Delete";

SqlDataAdapter da = new SqlDataAdapter(cmd);

cmd.Parameters.Add("@Name", SqlDbType.NVarChar, 15).Value = txtName.Text;
cmd.Parameters.Add("@FName", SqlDbType.NVarChar, 25).Value = txtFname.Text;

MessageBox.Show("اطلاعات با موفقیت حذف شد", "پیام حذف", MessageBoxButtons.OK, MessageBoxIcon.Information
, MessageBoxDefaultButton.Button1);

txtName.Clear();
txtFname.Clear();
txtCellphone.Clear();
txtOffice.Clear();
txtOther.Clear();
txtPhone.Clear();
}

Merila_Rad
پنج شنبه 25 شهریور 1389, 15:43 عصر
cmd.executenonquery یادت نره!

bahareh1368
پنج شنبه 25 شهریور 1389, 16:05 عصر
اگه بخوام از cmd.executenonquery استفاده کنم که باید از cn.open() و cn.close() استفاده کنم در حالی که می خوام از اطلاعات دیتابیس بصورت disconnect استفاده کنم.اینطوری مشکلی ایجاد نمی شه؟

Merila_Rad
پنج شنبه 25 شهریور 1389, 16:31 عصر
تا اونجایی که من میدونم این روش بهتر از استفاده از dataAdapter هست (مخصوصا در تعداد رکورد زیاد)
کد مربوط به حذف رو گذاشتم update هم دقیقا شبیه همینه
اگه بازم نشد کد StoredProcedure را هم بذار ،شاید مشکل از اونجا باشه




private void btnDelete_Click(object sender, EventArgs e)
{
DialogResult a;
a = MessageBox.Show("آیا مطمئن هستید؟", "هشدار", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
if (a == DialogResult.No)
return;
else if (a == DialogResult.Yes)
{
SqlConnection con = new SqlConnection();
SqlCommand com = new SqlCommand();

con.ConnectionString = "Data Source=.;Initial Catalog=Phonebook;Integrated Security=True";
if (con.State != ConnectionState.Open)
con.Open();

com.CommandType = CommandType.StoredProcedure;
com.Parameters.Add("@Name", SqlDbType.NVarChar, 15).Value = txtName.Text;
com.Parameters.Add("@FName", SqlDbType.NVarChar, 25).Value = txtFname.Text;
com.CommandText = "PhoneBook_Delete";
com.Connection = con;
com.ExecuteNonQuery();
con.Close();
con.Dispose();

}
}

bahareh1368
پنج شنبه 25 شهریور 1389, 17:13 عصر
کد شما رو واسه حذف نوشتم اما پیغام می ده که storeprocedure_delete پیدا نمی کنه.این کد storeprocedure واسه delete یه نگاهی بندازید و اشکالشو بهم بگید.ممنون می شم.

create procedure PhoneBook_Delete

@Name nvarchar(15),
@FName nvarchar(25)

AS
Delete from [PhoneBook].[dbo].[PhoneBook_table] where نام=@Name or [نام خانوادگی]=@FName

Merila_Rad
پنج شنبه 25 شهریور 1389, 17:28 عصر
خب توی پیام اگه نگاه کنی نوشته storeprocedure_delete
اما اسم storeprocedure شما Phonebook_delete
به هر حال بعد از یکی کردن نام storeprocedure در sql و در برنامه ت بهتره وقتی یه storeprocedure مینویسی اول تو محیط sqlServer اونو Execute کنی اگه جواب داد بری سراغ برنامه ت
بعد از Execute کردن این storeprocedure ازت مقدار دو پارامتر رو میخواد که بعد از مقداردهی باید رکورد مربوطه را پاک کنه
اگه باز مشکلی پیش اومد بنویس اگه بتونم کمک کنم خوشحال میشم

bahareh1368
یک شنبه 28 شهریور 1389, 12:31 عصر
خب توی پیام اگه نگاه کنی نوشته storeprocedure_delete
اما اسم storeprocedure شما Phonebook_delete
به هر حال بعد از یکی کردن نام storeprocedure در sql و در برنامه ت بهتره وقتی یه storeprocedure مینویسی اول تو محیط sqlServer اونو Execute کنی اگه جواب داد بری سراغ برنامه ت
بعد از Execute کردن این storeprocedure ازت مقدار دو پارامتر رو میخواد که بعد از مقداردهی باید رکورد مربوطه را پاک کنه
اگه باز مشکلی پیش اومد بنویس اگه بتونم کمک کنم خوشحال میشم

کد شما رو واسه حذف نوشتم.اما رکوردی رو حذف نمی کنه و هیچ خطایی هم نمی ده.
درمورد update هم خطای زیرو می ده :

storeproceture or function 'Phonebook_update' expects parameters '@phonenumber' wich was not supplied.

من برنامه رو می ذارم لطفا راهنماییم کنید که چیکار باید بکنم:ناراحت:

mkmostafa
یک شنبه 24 آذر 1392, 19:23 عصر
دوستان چه را راه دور میرید.
از این کد برای درج استفاده کنید.

protected void btn_insert_Click(object sender, EventArgs e)
{
db.insert_user(txt_user.Value.Trim(), txt_pass.Value.Trim(), txt_email.Value.Trim());
Page_Load(null, null);

}
همانطور که میبینید در رویداد باتن ذخیره کد نوشته شده است.
خط دوم کد برای اینکه دیتاگرید رفرش بشه.
من دستور حذف و اپدیت رو ندارم.حالا یکی اینا رو به من بده؟؟؟

sorena2000
یک شنبه 24 آذر 1392, 22:26 عصر
من کد پروسیجر و C#‎‎ رو برات قرار میدم امید وارم بدردت بخوره .



ALTER PROCEDURE [dbo].[PhoneBook_Update]

@Id INT,
@Name nvarchar(20),
@Fname nvarchar(20),
@PhoneNumber int,
@CellphoneNumber varchar(20),
@OfficeNumber varchar(10),
@OtherNumber varchar(10)


AS

BEGIN
UPDATE PhoneBook_table
SET
Name=@Name ,
Fname=@Fname ,
PhoneNumber=@PhoneNumber ,
CellphoneNumber=@CellphoneNumber ,
OfficeNumber=@OfficeNumber,
OtherNumber=@OtherNumber

WHERE Id=@Id
END






SqlCommand command = new SqlCommand("PhoneBook_Update", connString);
command.CommandType = CommandType.StoredProcedure;
command.Parameters.Add("@Id", SqlDbType.Int).Value = Id;
command.Parameters.Add("@Name", SqlDbType.NVarChar).Value = TxtName.Text.Trim();
command.Parameters.Add("@Fname", SqlDbType.NVarChar).Value = TxtFamily.Text.Trim();
command.Parameters.Add("@PhoneNumber", SqlDbType.int).Value = TxtPhoneNumber.Text.Trim();
command.Parameters.Add("@CellphoneNumber", SqlDbType.VarChar).Value = TxtCellphoneNumber.Text.Trim();
command.Parameters.Add("@OfficeNumber", SqlDbType.VarChar).Value = txtOfficeNumber.Text.Trim();
command.Parameters.Add("@OtherNumber", SqlDbType.VarChar).Value = txtOtherNumber.Text.Trim();

connString.Open();
command.ExecuteNonQuery();
connString.Close();

mkmostafa
دوشنبه 25 آذر 1392, 18:37 عصر
دوست گرامی sorena2000 (http://barnamenevis.org/member.php?69912-sorena2000)

وقتی از استوری پروسیجور استفاده میکنید , دیگه نیازی نیست از کدهای sql استفاده کنید.


در سال 2012 طرح جدیدی به نام LINQ امده که در یک خط کارهایی از قبیل : آپدیت و ذخیره و ..... را به راحتی انجام داد.

مانند:


db.insert_user(txt_user.Value.Trim(), txt_pass.Value.Trim(), txt_email.Value.Trim());

sorena2000
سه شنبه 26 آذر 1392, 00:51 صبح
بله این رو میدونم من هم کد معمولی رو نوشتم بخاطر اینکه پروژه دوستمون رو که دیدم به این روش بود من هم براش اینجور نوشتم .

اما در کل حق با شماست