使用一个按钮在数据库中INSERT,UPDATE,DELETE

时间:2018-02-19 14:09:36

标签: c# sql-server winforms

我有一个应用程序让用户从列表中选择一个项目,然后显示该项目的组件,当单击组件时,dataGridView将填充该组件的库存(大小和数量)。

我想这样做,以便用户只需使用一个“保存”按钮即可修改数据库内的dataGridView和UPDATE,INSERT和DELETE中的数字。

我设法让这些功能单独工作,但我想知道如何在一个button_click事件中将它们全部放在一起。

例如,这是我的更新功能:

 private void buttonSave_Click(object sender, EventArgs e)
 {
     using (SqlConnection con = new SqlConnection(conString))
         {
             con.Open();
             if (con.State == ConnectionState.Open)
             {
                foreach (DataGridViewRow row in dataGridViewStock.Rows)
                {
                    if (row.Cells[0].Value != null && row.Cells[1].Value != null)
                    {
                        SqlCommand update = new SqlCommand("UPDATE stock_test SET quantity=" + row.Cells[1].Value + " WHERE size=" + row.Cells[0].Value+ "AND codeArticleComponent ='" +labelComponentChosen.Text+ "'" , con);
                        update.ExecuteNonQuery();
                        update.Parameters.Clear();
                    }
                }    
            }
        }

编辑:我知道这个应用程序的旧版本通过简单地删除整个表并再次插入所有值来管理它,但我不想这样做,因为它看起来完全不安全并且表将结束很大的。

1 个答案:

答案 0 :(得分:1)

有时需要使用单个存储过程在GridView中插入,更新和删除记录,而不是为每个操作创建单独的存储过程。

假设我有一个.aspx网页,我需要在其中插入,查看,更新和删除记录。为此,我不是创建四个存储过程来执行这些任务,而是创建一个存储过程以满足我的要求,我将在后面的代码中访问它,具体取决于最终用户在单击按钮时执行的操作。

我写这篇文章专门关注新手和任何新想要使用单一存储过程在GridView中插入,更新和删除记录的人,所以让我们从基本介绍开始。

首先创建名为employee的表: 我在id列上设置了主键,并且我已将Identity规范设置为Yes。

现在我们有一个表来执行这些操作。现在让我们开始创建存储过程。

使用关键字Create Procedure后跟过程名称创建存储过程。让我们创建名为" EmpEntry"的Stored Prcedure。如下所示:

create Procedure EmpEntry
(
  --variable  declareations 
 @Action Varchar (10),    --to perform operation according to string ed to this varible such as Insert,update,delete,select      
 @id int=null,    --id to perform specific task
 @FnameVarchar (50)=null,   -- for FirstName
 @MName Varchar (50)=null,   -- for MName
 @Lname Varchar (50)=null    -- for LastName
)
as
Begin 
  SET NOCOUNT ON;

If @Action='Insert'   --used to insert records
Begin
   Insert Into employee (FirstName,MName,LastName)values(@Fname,@MName,@Lname)
End  
else if @Action='Select'   --used to Select records
Begin
    select *from employee
end
else if @Action='Update'  --used to update records
Begin
   update employeeset FirstName=@Fname,MName=@MName,LastName=@Lname where id=@id
 End
 Else If @Action='delete'  --used to delete records
 Begin
   delete from employeewhere id=@id
 end
 End

上面存储过程中的注释清楚地解释了哪个块用于哪个目的,所以我再次简要解释一下。我已经使用@Action变量并将字符串分配给它们,并根据存储过程的参数ed执行特定块,因为我已将这些块或条件保存在嵌套if else if条件语句中。

最重要的是我已经为每个变量分配了null以避免对存储过程的参数ed产生影响,因为我们输入的参数数量不同但参数数量不同于存储过程以执行这些任务。

现在创建一个示例应用程序" Empsys"为:

"Start" - "All Programs" - "Microsoft Visual Studio 2010".
"File" - "New Project" - "C#" - "Empty Web Application" (to avoid adding a master page).

为网站提供一个名称,例如" Empsys"或其他你想要的,并指定位置。 然后右键单击Solution Explorer - " Add New Item" - " Default.aspx页面"。

将一个按钮,三个文本框,一个GridView和一个隐藏字段拖放到数据库的隐藏值和Default.aspx页面部分的一个标签。

然后切换到设计视图; Default aspx页面源的部分将如下所示:

<form id="form1"runat="server">
    <div>
First Name  <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
Middle Name<asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
Last Name <asp:TextBox ID="TextBox3" runat="server"></asp:TextBox>
        <asp:ButtonID="Button1"runat="server"Text="save"onclick="Button1_Click" />
    </div>
<asp:HiddenField ID="HiddenField1" runat="server"/>
 <asp:GridViewID="GridView1"runat="server" >
     </asp:GridView>
</form>

现在使用以下GridView事件属性来执行更新,删除,编辑取消等事件。让我们看看属性是什么:

  • DataKeyNames:这个属性我已经习惯了GridView的行索引
  • OnRowEditing:此属性用于在用户点击编辑按钮时处理事件
  • OnRowCancelingEdit:当用户点击点击编辑按钮后存在的取消按钮时,此属性用于处理事件
  • OnRowDeleting:当用户点击删除GridView行的删除按钮时,此属性用于处理事件
  • OnRowUpdating:当用户点击更新网格记录的更新按钮时,此属性用于处理事件

现在我的网格将如下所示:

<asp:GridViewID="GridView1" runat="server" DataKeyNames ="id"OnRowEditing ="Edit"               
        OnRowCancelingEdit ="canceledit"    OnRowDeleting ="delete"    OnRowUpdating = "Update" >
 </asp:GridView>

在前面的GridView属性中,我已经为特定操作分配了方法名称。

在数据库中插入数据的方法

右键单击设计页面并查看代码,然后在default.aspx.cs页面中编写以下代码,以将插入的记录保存在数据库中:

protected void empsave(object sender, EventArgs e)
{
      connection();
      query =  "studentEntryView";          //Stored Procedure name 
      SqlCommand com = new SqlCommand(query, con);  //creating  SqlCommand  object
      com.CommandType = CommandType.StoredProcedure;  //here we declaring command type as stored Procedure

       /* adding paramerters to  SqlCommand below *\
      com.Parameters.AddWithValue("@Action", HiddenField1.Value).ToString();//for ing hidden value to preform insert operation
       com.Parameters.AddWithValue("@FName",TextBox1.Text.ToString());        //first Name
       com.Parameters.AddWithValue("@Mname ", TextBox2.Text.ToString());     //middle Name
       com.Parameters.AddWithValue("@LName ",TextBox3.Text.ToString());       //Last Name
       com.ExecuteNonQuery();                     //executing the sqlcommand
       Label1.Visible = true;
       Label1.Text = "Records are Submitted Successfully";
}

现在创建mehtod以查看GridView中的记录:

public void viewdata()

{
    connection();
    query = "studentEntryView";
    SqlCommand com = new SqlCommand(query, con);
    com.CommandType = CommandType.StoredProcedure;
    com.Parameters.AddWithValue("@Action", HiddenField2.Value).ToString();
    DataSet ds =new DataSet();
    SqlDataAdapter da =  new SqlDataAdapter(com);
    da.Fill(ds);
    GridView1.DataSource = ds;
    GridView1.DataBind();
}

以下是&#34; OnRowEditing&#34;的方法。事件:

protected void edit(objectsender, GridViewEditEventArgs e)

{

    GridView1.EditIndex= e.NewEditIndex;

    gedata();

}

以下是&#34; OnRowCancelingEdit&#34;的方法。事件:

protected void  canceledit(object sender, GridViewCancelEditEventArgs e)

{

    GridView1.EditIndex = -1;

    gedata();

}

以下是&#34; OnRowDeleting&#34;事件:

protected void delete(object sender, GridViewDeleteEventArgs e)
{
      connection();

      int id =  int.Parse(GridView1.DataKeys[e.RowIndex].Value.ToString());

      HiddenField1.Value = "Delete";

      query = "EmpEntry";

      com = new SqlCommand(query, con);

      com.CommandType =CommandType .StoredProcedure;

      com.Parameters.AddWithValue("@Action", HiddenField1.Value).ToString();

      com.Parameters.AddWithValue("id", SqlDbType.Int).Value = id;

      com.ExecuteNonQuery();

      con.Close();

      gedata();                 

 }

以下是&#34; OnRowUpdating&#34;的方法。事件:

protected void update(object sender, GridViewUpdateEventArgs e)
{
     connection();

     int id=int.Parse(GridView1.DataKeys[e.RowIndex].Value.ToString());

     HiddenField1.Value = "update";

     query = "EmpEntry";

     com = new SqlCommand(query, con);

     com.CommandType = CommandType.StoredProcedure;

     com.Parameters.AddWithValue("@Action", HiddenField1.Value).ToString();

     com.Parameters.AddWithValue("@FName", ((TextBox)GridView1.Rows[e.RowIndex].Cells[3].Controls[0]).Text.ToString());

     com.Parameters.AddWithValue("@MName", ((TextBox)GridView1.Rows[e.RowIndex].Cells[4].Controls[0]).Text.ToString());

     com.Parameters.AddWithValue("@LName", ((TextBox)GridView1.Rows[e.RowIndex].Cells[5].Controls[0]).Text.ToString());

     com.Parameters.AddWithValue("@id", SqlDbType.int ).Value = id;

     com.ExecuteNonQuery();

     con.Close();

     GridView1.EditIndex = -1;

     gedata();



}

代码简介

在上面的示例代码中,我使用了两个字符串查询来提供存储过程名称和用于存储来自web.config文件的连接的构造,另一件事是我使用了一个隐藏字段,我正在使用它我们的存储过程所需的操作值。

现在我们的应用程序已准备好使用,按F5或其他按照您的知识,然后输入一些值到TextBox并按&#34; Save&#34;按钮。

现在点击&#34; Save&#34;按钮,隐藏字段值取值&#34; Insert&#34;并将其作为存储过程作为操作,因此存储过程将执行特定类型的块。

现在在页面加载时我调用了方法,因此网格将填充如下:

现在点击调用编辑方法的编辑按钮,如下面的网格所示:

如果您点击&#34;取消&#34;按钮然后将调用editcancel方法并取消编辑模式。现在在网格TextBox中输入一些值,然后单击调用update方法的更新按钮,然后GridView中的记录将更新为:

现在点击调用delete方法的删除按钮,并从GridView中删除记录

请注意 有关详细代码,请下载上面附带的zip文件。     别忘了更新服务器位置的Web.config文件。