PDA

View Full Version : کد حذف رکورد از گریدویو در cs.



federrer
دوشنبه 05 شهریور 1386, 21:58 عصر
با سلام

بعد از اینکه که گریدویو ی ما اطلاعات جدول رو نمایش داد برای حذف کردن یک رکورد باید چه کدی در رویداد Row_Deleting بنویسیم ؟؟
به زبان C#

federrer
دوشنبه 05 شهریور 1386, 22:12 عصر
آقای راد از این کوئری برای حذف استفاده کردن ( به زبان VB)





Dim strIDs As String = ""

// field intID dar jadvale T1 .PK ast
Dim strSQL As String = "Delete From T1 Where intID IN (" & strIDs.Substring(0, strIDs.LastIndexOf(",")) & ")"

اگه کسی بلده کد بالا رو به C# تبدیل کنه ، ممنون میشم

nazaninam
دوشنبه 05 شهریور 1386, 22:31 عصر
ببینید دوست من این کد برای حذف رکورد از داخل دیتابیس هستش به یک شرط خاص !
شما به این ترتیب عمل کنید :



Delete From YourTable Where YourIDColumn=@Paramete




حالا کافیه مقدار دهی پارامتر را انجام دهید و یک ExecuteNoneQuery را اجرا کنید موفق باشی

Behrouz_Rad
سه شنبه 06 شهریور 1386, 09:13 صبح
تو C# نمیشه از strIDs.Substring استفاده کرد.
متدهای کلاس String در VB.NET و #C یکسان هست. تفاوتی وجود نداره.
ضمن اینکه، از آخرین نسخه ی GridView که گذاشتم (نسخه ی 6) استفاده کن.
در این نسخه، کلاس IN با استفاده از یک SP، پارامتریک شده و دستور SQL دیگه در کد برنامه وجود نداره.

موفق باشید.

federrer
چهارشنبه 07 شهریور 1386, 12:18 عصر
ببینید دوست من این کد برای حذف رکورد از داخل دیتابیس هستش به یک شرط خاص !
شما به این ترتیب عمل کنید :



Delete From YourTable Where YourIDColumn=@Paramete


حالا کافیه مقدار دهی پارامتر را انجام دهید و یک ExecuteNoneQuery را اجرا کنید موفق باشی


کدی که نوشتم اینجوری در اومد :





string str1 = null;
string str2 = null;

str1 = "Select * from TABLE1 ";

SqlCommand Cmd1 = new SqlCommand(str, Cnn);
Cmd1.Connection.Open();
SqlDataReader SDR ;
SDR = Cmd1.ExecuteReader();

while (SDR.Read())
{
string b = SDR.GetValue(0).ToString();


str2 = "DELETE from TABLE1 where ID= @ID";

SqlCommand Cmd2 = new SqlCommand(str2, Cnn);
Cmd2.Parameters.Add(new SqlParameter("@ID", SqlDbType.Int));
Cmd2.Parameters["@ID"].Value = Int32.Parse(b);


Cmd2.Connection.Open();
Cmd2.ExecuteNonQuery();
Cmd2.Connection.Close();

}
BindGridView();

از Cmd2.ExecuteNonQuery(); این ارور رو میگیره :



There is already an open DataReader associated with this Command which must be closed first.
فکر کنم میگه قبل از اجرای Cmd2.ExecuteNonQuery(); باید SDR.Close بشه!!
اگه SDR.Close اونوقت دیگه نمیتونه ا SDR.Read() رو انجام بده که بره به رکورد بعدی !!

radonband
چهارشنبه 07 شهریور 1386, 13:43 عصر
کدی که نوشتم اینجوری در اومد :





string str1 = null;
string str2 = null;

str1 = "Select * from TABLE1 ";

SqlCommand Cmd1 = new SqlCommand(str, Cnn);
Cmd1.Connection.Open();
SqlDataReader SDR ;
SDR = Cmd1.ExecuteReader();

while (SDR.Read())
{
string b = SDR.GetValue(0).ToString();


str2 = "DELETE from TABLE1 where ID= @ID";

SqlCommand Cmd2 = new SqlCommand(str2, Cnn);
Cmd2.Parameters.Add(new SqlParameter("@ID", SqlDbType.Int));
Cmd2.Parameters["@ID"].Value = Int32.Parse(b);


Cmd2.Connection.Open();
Cmd2.ExecuteNonQuery();
Cmd2.Connection.Close();

}
BindGridView();

از Cmd2.ExecuteNonQuery(); این ارور رو میگیره :



There is already an open DataReader associated with this Command which must be closed first.
فکر کنم میگه قبل از اجرای Cmd2.ExecuteNonQuery(); باید SDR.Close بشه!!
اگه SDR.Close اونوقت دیگه نمیتونه ا SDR.Read() رو انجام بده که بره به رکورد بعدی !!



شما SDR.CLOSE را بعد از string b = SDR.GetValue(0).ToString(); بنویس ، فکر کنم مشکلت حل بشه.

nazaninam
چهارشنبه 07 شهریور 1386, 13:44 عصر
دوست عزیز روند کارت یکم به نظرم عجیب میاد ! شما با این کار دارید همه اطلاعات یک جدول را دریافت می کنید ! بعد داخل یک حلقه یک دستور SQl را بارها انجام میدهید ! شما با این کار همه رکورد های جدول را دارید حذف می کنید!!!!
آیا قصد شما حذف کردن تمامی رکورد های یک جدول داخل بانک هست؟
اگر جوابتون مثبت هست فقط کافیه به صورت زیر بنویسید :



string str1 = "delete from TABLE1";

SqlCommand Cmd1 = new SqlCommand(str, Cnn);
Cmd1.Connection.Open();

Cmd1.ExecuteNonQuery();

Cmd1.Connection.Close();
BindGridView();



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




str2 = "DELETE from TABLE1 where ID= @ID";

SqlCommand Cmd2 = new SqlCommand(str2, Cnn);
Cmd2.Parameters.Add(new SqlParameter("@ID", SqlDbType.Int));
Cmd2.Parameters["@ID"].Value = Int32.Parse(b);


Cmd2.Connection.Open();
Cmd2.ExecuteNonQuery();
Cmd2.Connection.Close();



خوب حالا مسئله اینجاست که در کدی که الان بالا نوشتم مقدار متغیر b که درحقیقت آی دی رکوردیست که قراره حذف بشه را از کجا بیاریم !
برای این کار از EventArg رویداد RowDeleting استفاده می کنیم به این صورت :
یک راه این هست که از دیتا کی ها استفاده کنی ( اگر دیتا کی تعیین کرده باشی )
e.Keys[0]

این مقدار را جایگزین متغیر b کن
موفق باشید

federrer
چهارشنبه 07 شهریور 1386, 15:42 عصر
دستت درد نکنه . آره میدونستم که اون while هر چی رکورد تو DataGrid هست رو پاک میکنه . چون هر بار IDفیلد ID رکورد خونده میشد و خودمون میریختیمش تو. @ID
اونوقت تو شرط کوئریمون هم همیشه ID=@ID بود پس مسلما پاک میشد .

خیلی ممنون که کدم رو با دقت بررسی کردی .

والا اینقدر این While رو جابجا کردم دیگه مخم ترکیده بود. دقیقا میخوام اون رکوردی که گزینه Delete اش میخوره حذف شه ، نه تمام رکوردها .

تمام مشکل در اصل تو خوندن ID رکوردی هست که میخواد حذف شه .



یک راه این هست که از دیتا کی ها استفاده کنی ( اگر دیتا کی تعیین کرده باشی )
e.Keys[0]این مقدار را جایگزین متغیر b کن
موفق باشید

"دیتا کی" تعیین کنم؟؟؟ چه جوری؟؟

nazaninam
چهارشنبه 07 شهریور 1386, 18:30 عصر
<asp:GridView ID="GridView1" runat="server" DataKeyNames="ID">
</asp:GridView>



در ضمن توضیح بده که Gridview رو چطوری بایند کردی؟ از چه روشی؟

federrer
چهارشنبه 07 شهریور 1386, 20:40 عصر
اینجوری بایند کردم :



public void BindGView2()
{
string CS = (string)ConfigurationManager.AppSettings["myConnectionString"];
SqlConnection Cnn = new SqlConnection(CS);

strsql = "select * fromTABLE1";
SqlCommand Cmd = new SqlCommand(strsql, Cnn);

SqlDataAdapter SDA = new SqlDataAdapter(strsql, Cnn);
SDA.SelectCommand = Cmd;
try

{
Cnn.Open();
DataSet DS = new DataSet();
SDA.Fill(DS, "TABLE1");

GView2.DataSource = DS.Tables["TABLE1"].DefaultView;
GView2.DataBind();

}
catch (SqlException ex)
{
Response.Write(ex.Message.ToString());
}
finally
{
// if ((Cmd != null)) Cmd.Dispose();
if ((Cnn.State != ConnectionState.Closed)) Cnn.Close();
}
}

اگه زحمت نمیشه کد کامل رخداد Row_Deleting رو برام بزار.

federrer
چهارشنبه 07 شهریور 1386, 21:08 عصر
بعد از اینکه DataKeyNames="ID" قرار دادم ،کد زیر رو تو RowDeleting گذاشتم:




protected void GridView_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
string CS = (string)ConfigurationManager.AppSettings["myConnectionString"];
//string CS = System.Configuration.ConfigurationManager.Connecti onStrings("myConnectionString").ConnectionString;
SqlConnection Cnn = new SqlConnection(CS);

string c = (e.Keys[0]).ToString;

string strdel = "DELETE from DR where ID= @ID";
SqlCommand Cmd2 = new SqlCommand(strdel, Cnn);
Cmd2.Parameters.Add(new SqlParameter("@ID1", SqlDbType.Int));
Cmd2.Parameters["@ID1"].Value = Int32.Parse(c);


Cmd2.Connection.Open();
Cmd2.ExecuteNonQuery();
Cmd2.Connection.Close();
}