none
在Access执行删除操作,把我记录全部删掉了 RRS feed

  • 问题

  • 最近在做个.net项目的维护,写删除的时候,碰到个问题,总结出来是checkbox惹得祸,不管选哪一个,点击delete都全部删除了,估计得到选项的ID问题,贴出问题代码,请教怎么改法谢谢
                <asp:TemplateColumn
                        HeaderText="Select"
                        ItemStyle-Width="80"
                        ItemStyle-HorizontalAlign="Center"
                        HeaderStyle-HorizontalAlign="Center">
                      <itemTemplate>
                            <asp:CheckBox ID="Select" runat="server" />
                            <asp:Label ID="NewsId" Visible="False" Text='<%#DataBinder.Eval(Container.DataItem, "ID")%>' Runat="server" />
                        </itemTemplate>
                </asp:TemplateColumn>



        protected void Delete_Click(Object sender, EventArgs e)
        {
            OleDbConnection conNewsData;
            OleDbCommand cmdDeleteDB;
            string strDelete = "";
            foreach (DataGridItem chkboxDataGridItem in Content.Items)
            {
                System.Web.UI.WebControls.CheckBox slctCheckBox = (CheckBox)chkboxDataGridItem.FindControl("Select");
                string strNewsId = ((Label)(chkboxDataGridItem.FindControl("NewsId"))).Text;
                conNewsData = new OleDbConnection("PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA Source=" + HttpContext.Current.Server.MapPath(ConfigurationManager.AppSettings["mdbPath"]));
                strDelete = "Delete from News WHERE ID = @ID";
                cmdDeleteDB = new OleDbCommand(strDelete, conNewsData);
                cmdDeleteDB.Parameters.Add(new OleDbParameter("@ID", strNewsId));
                conNewsData.Open();
                cmdDeleteDB.ExecuteNonQuery();
                conNewsData.Close();
            }
            Response.Redirect(Request.Url.ToString());
        }
    2009年11月13日 14:53

答案

  • 测试办法:
    1,你可以先打印出来 strNewsId是否存在值,
    2,在 cmdDeleteDB.Parameters.Add(new OleDbParameter("@ID", strNewsId));之前,执行一次 cmdDeleteDB.Parameters.Clear();
    3,也可能是你的aspx页面设置不正确,导致strNewsId没有值。

    下面是一个可以得到不同id的例子,。注意页面的一些属性设置 。尽管没有真实连接数据库,但道理应该是都很明确了

    <%@ Page Language="C#" EnableViewState="true" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <script runat="server">
      // 计算数据,完全可以从数据看取得
      System.Data.DataView CreateDataSourceByXianhuiMeng()
      {
        System.Data.DataTable dt = new System.Data.DataTable();
        System.Data.DataRow dr;
        dt.Columns.Add(new System.Data.DataColumn("id", typeof(System.String)));
        dt.Columns.Add(new System.Data.DataColumn("学生姓名", typeof(System.String)));
        dt.Columns.Add(new System.Data.DataColumn("语文", typeof(System.Decimal)));
        dt.Columns.Add(new System.Data.DataColumn("数学", typeof(System.Decimal)));
        dt.Columns.Add(new System.Data.DataColumn("英语", typeof(System.Decimal)));
        dt.Columns.Add(new System.Data.DataColumn("计算机", typeof(System.Decimal)));
    
        for (int i = 0; i < 8; i++)
        {
          System.Random rd = new System.Random(Environment.TickCount * i); ;
          dr = dt.NewRow();
          dr[0] = i * i;
          dr[1] = "【孟子E章】" + i.ToString();
          dr[2] = System.Math.Round(rd.NextDouble() * 100, 2);
          dr[3] = System.Math.Round(rd.NextDouble() * 100, 2);
          dr[4] = System.Math.Round(rd.NextDouble() * 100, 2);
          dr[5] = System.Math.Round(rd.NextDouble() * 100, 2);
          dt.Rows.Add(dr);
        }
        System.Data.DataView dv = new System.Data.DataView(dt);
        return dv;
      }
    
      protected void Page_Load(object sender, EventArgs e)
      {
    
        if (!Page.IsPostBack)
        {
          Content.DataSource = CreateDataSourceByXianhuiMeng();
          Content.DataBind();
        }
      }
    
    
      protected void Delete_Click(object sender, EventArgs e)
      {
    
        foreach (DataGridItem chkboxDataGridItem in Content.Items)
        {
          System.Web.UI.WebControls.CheckBox slctCheckBox = (CheckBox)chkboxDataGridItem.FindControl("Select");
          if (slctCheckBox.Checked)
          {           
            string strNewsId1 = ((Label)(chkboxDataGridItem.FindControl("NewsId"))).Text;
            string strNewsId2 = Content.DataKeys[chkboxDataGridItem.DataSetIndex].ToString();
            Response.Write("<li>" + strNewsId1 + " 方法二:" + strNewsId2);
          }
        }
      }
    </script>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head id="Head1" runat="server">
    </head>
    <body>
      <form id="form1" runat="server">
      <asp:DataGrid ID="Content" runat="server" AutoGenerateColumns="false" DataKeyField="id">
        <Columns>
          <asp:TemplateColumn HeaderText="Select" ItemStyle-Width="80" ItemStyle-HorizontalAlign="Center"
            HeaderStyle-HorizontalAlign="Center">
            <ItemTemplate>
              <asp:CheckBox ID="Select" runat="server" />
              <asp:Label ID="NewsId" Visible="False" Text='<%#DataBinder.Eval(Container.DataItem, "id")%>'
                runat="server" />
            </ItemTemplate>
          </asp:TemplateColumn>
        </Columns>
      </asp:DataGrid>
      <asp:Button ID="Button1" runat="server" OnClick="Delete_Click" Text="Delete" />
      </form>
    </body>
    </html>
    

    【孟子E章】
    2009年11月15日 10:13
    版主
  • 你的button事件有问题。你选中grid中的checkbox后,点击button触发回传,再次绑定后,先前选中的checkbox已经变成没有选中了。

    所以逻辑有点问题。

    你可以直接给grid添加一个delete button,然后在ItemCommand检测argument是否是"delete",如果是就处理。

    或者把你的绑定代码放在Page_Load中的If(this.IsPostback)中试试,如果是第一次加载则绑定,否则不绑定。

    可以参考上面几位的代码处理。


    Microsoft Online Community Support
    2009年11月16日 4:32

全部回复

  • access不支持@标记 所有参数都是按照顺序来的

    解决方法
         string strNewsId = ((Label)(chkboxDataGridItem.FindControl("NewsId"))).Text;
                conNewsData = new OleDbConnection("PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA Source=" + HttpContext.Current.Server.MapPath(ConfigurationManager.AppSettings["mdbPath"]));
                strDelete = "Delete from News WHERE ID =?";
                cmdDeleteDB = new OleDbCommand(strDelete, conNewsData);
                cmdDeleteDB.Parameters.Add(new OleDbParameter("ID", strNewsId));
                conNewsData.Open();
                cmdDeleteDB.ExecuteNonQuery();
                conNewsData.Close();
    2009年11月13日 16:18
  • 试过了,还是会把我记录全部删除了,我觉得access支持@标记,因为别人有这样的例子
    2009年11月14日 2:29
  • 恩 是支持@标记的 既然你有checkbox 你应该判断选择的是那一行数据.判断是否选中然后执行删除吧
    CheckBox cb = (CheckBox)GridView1.Rows[i].FindControl("CheckSingle");
    if (cb.Checked)
    {
       //执行删除操作
    }
    2009年11月14日 2:36
  • 你好!

    你要 foreach 中要判断是否已选中,已选中的才删除。
    知识改变命运,奋斗成就人生!
    2009年11月14日 2:41
    版主
  • 怎么还是不对,if语句不成功,我是看过别人的例子的
            foreach (DataGridItem chkboxDataGridItem in Content.Items)
            {
                System.Web.UI.WebControls.CheckBox slctCheckBox = (CheckBox)chkboxDataGridItem.FindControl("Select");
                if (slctCheckBox.Checked)
                {
                    string strNewsId = ((Label)(chkboxDataGridItem.FindControl("NewsId"))).Text;
                    conNewsData = new OleDbConnection("PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA Source=" + HttpContext.Current.Server.MapPath(ConfigurationManager.AppSettings["mdbPath"]));
                    strDelete = "Delete from News WHERE ID = @ID";
                    cmdDeleteDB = new OleDbCommand(strDelete, conNewsData);
                    cmdDeleteDB.Parameters.Add(new OleDbParameter("@ID", strNewsId));
                    conNewsData.Open();
                    cmdDeleteDB.ExecuteNonQuery();
                    conNewsData.Close();
                }
            }
    2009年11月15日 6:13
  • 最近在做个.net项目的维护,写删除的时候,碰到个问题,总结出来是checkbox惹得祸,不管选哪一个,点击delete都全部删除了,估计得到选项的ID问题,贴出问题代码,请教怎么改法谢谢
                <asp:TemplateColumn
                        HeaderText="Select"
                        ItemStyle-Width="80"
                        ItemStyle-HorizontalAlign="Center"
                        HeaderStyle-HorizontalAlign="Center">
                      <itemTemplate>
                            <asp:CheckBox ID="Select" runat="server" />
                            <asp:Label ID="NewsId" Visible="False" Text='<%#DataBinder.Eval(Container.DataItem, "ID")%>' Runat="server" />
                        </itemTemplate>
                </asp:TemplateColumn>



        protected void Delete_Click(Object sender, EventArgs e)
        {
            OleDbConnection conNewsData;
            OleDbCommand cmdDeleteDB;
            string strDelete = "";
             foreach (DataGridItem chkboxDataGridItem in Content.Items)
            {
                System.Web.UI.WebControls.CheckBox slctCheckBox = (CheckBox)chkboxDataGridItem.FindControl("Select");
                if (slctCheckBox.Checked)
                {
                    string strNewsId = ((Label)(chkboxDataGridItem.FindControl("NewsId"))).Text;
                    conNewsData = new OleDbConnection("PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA Source=" + HttpContext.Current.Server.MapPath(ConfigurationManager.AppSettings["mdbPath"]));
                    strDelete = "Delete from News WHERE ID = @ID";
                    cmdDeleteDB = new OleDbCommand(strDelete, conNewsData);
                    cmdDeleteDB.Parameters.Add(new OleDbParameter("@ID", strNewsId));
                    conNewsData.Open();
                    cmdDeleteDB.ExecuteNonQuery();
                    conNewsData.Close();
                }
            }
            Response.Redirect(Request.Url.ToString());
        }
    2009年11月15日 6:52
  •     <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
                DataKeyNames="id" DataSourceID="SqlDataSource1">
            <Columns>
                <asp:BoundField DataField="id" HeaderText="id" InsertVisible="False" 
                    ReadOnly="True" SortExpression="id" />
                <asp:BoundField DataField="names" HeaderText="names" SortExpression="names" />
                <asp:BoundField DataField="m" HeaderText="m" SortExpression="m" />
                <asp:TemplateField HeaderText="c"><ItemTemplate>
                    <asp:CheckBox ID="chk" runat="server" /><br />
                    <asp:Label ID="Label1" runat="server" Text='<%#Eval("id") %>'></asp:Label>
                </ItemTemplate></asp:TemplateField>
            </Columns>
            </asp:GridView>
            <asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button" />
         
         protected void Button1_Click(object sender, EventArgs e)
            {
                SqlConnection cn = new SqlConnection(SqlDataSource1.ConnectionString);
                SqlCommand cmd = new SqlCommand("delete from linqname where id=@id",cn);
                foreach (GridViewRow g in GridView1.Rows)
                {
                    CheckBox c = g.Cells[3].FindControl("chk") as CheckBox;
                    if(c.Checked)
                    {
                        Label l = g.Cells[3].FindControl("Label1") as Label;
                        cmd.Parameters.AddWithValue("@id", l.Text);
                        cn.Open();
                        cmd.ExecuteNonQuery();
                        cn.Close();
                    }
    
                }
     
            }
    2009年11月15日 8:23
  • 测试办法:
    1,你可以先打印出来 strNewsId是否存在值,
    2,在 cmdDeleteDB.Parameters.Add(new OleDbParameter("@ID", strNewsId));之前,执行一次 cmdDeleteDB.Parameters.Clear();
    3,也可能是你的aspx页面设置不正确,导致strNewsId没有值。

    下面是一个可以得到不同id的例子,。注意页面的一些属性设置 。尽管没有真实连接数据库,但道理应该是都很明确了

    <%@ Page Language="C#" EnableViewState="true" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <script runat="server">
      // 计算数据,完全可以从数据看取得
      System.Data.DataView CreateDataSourceByXianhuiMeng()
      {
        System.Data.DataTable dt = new System.Data.DataTable();
        System.Data.DataRow dr;
        dt.Columns.Add(new System.Data.DataColumn("id", typeof(System.String)));
        dt.Columns.Add(new System.Data.DataColumn("学生姓名", typeof(System.String)));
        dt.Columns.Add(new System.Data.DataColumn("语文", typeof(System.Decimal)));
        dt.Columns.Add(new System.Data.DataColumn("数学", typeof(System.Decimal)));
        dt.Columns.Add(new System.Data.DataColumn("英语", typeof(System.Decimal)));
        dt.Columns.Add(new System.Data.DataColumn("计算机", typeof(System.Decimal)));
    
        for (int i = 0; i < 8; i++)
        {
          System.Random rd = new System.Random(Environment.TickCount * i); ;
          dr = dt.NewRow();
          dr[0] = i * i;
          dr[1] = "【孟子E章】" + i.ToString();
          dr[2] = System.Math.Round(rd.NextDouble() * 100, 2);
          dr[3] = System.Math.Round(rd.NextDouble() * 100, 2);
          dr[4] = System.Math.Round(rd.NextDouble() * 100, 2);
          dr[5] = System.Math.Round(rd.NextDouble() * 100, 2);
          dt.Rows.Add(dr);
        }
        System.Data.DataView dv = new System.Data.DataView(dt);
        return dv;
      }
    
      protected void Page_Load(object sender, EventArgs e)
      {
    
        if (!Page.IsPostBack)
        {
          Content.DataSource = CreateDataSourceByXianhuiMeng();
          Content.DataBind();
        }
      }
    
    
      protected void Delete_Click(object sender, EventArgs e)
      {
    
        foreach (DataGridItem chkboxDataGridItem in Content.Items)
        {
          System.Web.UI.WebControls.CheckBox slctCheckBox = (CheckBox)chkboxDataGridItem.FindControl("Select");
          if (slctCheckBox.Checked)
          {           
            string strNewsId1 = ((Label)(chkboxDataGridItem.FindControl("NewsId"))).Text;
            string strNewsId2 = Content.DataKeys[chkboxDataGridItem.DataSetIndex].ToString();
            Response.Write("<li>" + strNewsId1 + " 方法二:" + strNewsId2);
          }
        }
      }
    </script>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head id="Head1" runat="server">
    </head>
    <body>
      <form id="form1" runat="server">
      <asp:DataGrid ID="Content" runat="server" AutoGenerateColumns="false" DataKeyField="id">
        <Columns>
          <asp:TemplateColumn HeaderText="Select" ItemStyle-Width="80" ItemStyle-HorizontalAlign="Center"
            HeaderStyle-HorizontalAlign="Center">
            <ItemTemplate>
              <asp:CheckBox ID="Select" runat="server" />
              <asp:Label ID="NewsId" Visible="False" Text='<%#DataBinder.Eval(Container.DataItem, "id")%>'
                runat="server" />
            </ItemTemplate>
          </asp:TemplateColumn>
        </Columns>
      </asp:DataGrid>
      <asp:Button ID="Button1" runat="server" OnClick="Delete_Click" Text="Delete" />
      </form>
    </body>
    </html>
    

    【孟子E章】
    2009年11月15日 10:13
    版主
  • 您好,见到你很高兴,用了你给的代码之后发现成功了,可是自己写又出问题,反复核对没发现根本问题所在,我把全部贴出来吧

    <%@ Page Language="C#" EnableViewState="true" MasterPageFile="~/GlobalPoint.master" AutoEventWireup="true" CodeFile="Admin.cs" Inherits="admin_manage" %>

    <asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
    <div id="content">
      <form id="Form1" runat="server">
        <div class="cleftGlobal">
          <div class="leftContent">
            <h2>Admin</h2>
            <p>Welcome, <span style="color:red;"><asp:Literal ID="adminName" runat="server" /></span></p>
            <p>You role is GlobalPoint Administrator.</p>
            <p><a href="manage.aspx" style="color:#EF7D00;">News Manage</a></p>
            <p><a href="manageSoftwareResources.aspx" style="color:#EF7D00;">Software Resources Manage</a></p>
            <p><a href="manageInformationResources.aspx" style="color:#EF7D00;">Information Resources Manange</a></p>
          </div>
        </div>
        <div class="crightGlobal">
          <div class="rightContent admin">
            <h2>News Infomation</h2><br /><br />
            <asp:DataGrid
              ID="Content"
              AutoGenerateColumns="false"
              BorderStyle="Solid"
              BorderWidth="1px"
              BorderColor="#FFFFFF"
              HeaderStyle-BackColor="#EF7D00"
              BackColor="#FFFFFF"
              AlternatingItemStyle-BackColor="#ecf9ff"
              Width="100%"
              Runat="Server">
              <Columns>
                <asp:TemplateColumn
                        HeaderText="Title"
                        ItemStyle-HorizontalAlign="Center"
                        HeaderStyle-HorizontalAlign="Center">
                        <itemTemplate>
                    <a href="editNews.aspx?Edit=<%#DataBinder.Eval(Container.DataItem, "ID")%>"><%#DataBinder.Eval(Container.DataItem, "Title")%></a>
                        </itemTemplate>
                </asp:TemplateColumn>
                <asp:TemplateColumn HeaderText="Select" ItemStyle-Width="80" ItemStyle-HorizontalAlign="Center"
                  HeaderStyle-HorizontalAlign="Center">
                  <ItemTemplate>
                    <asp:CheckBox ID="Select" runat="server" />
                    <asp:Label ID="NewsId" Visible="False" Text='<%#DataBinder.Eval(Container.DataItem, "id")%>'
                      runat="server" />
                  </ItemTemplate>
                </asp:TemplateColumn>
              </Columns>
            </asp:DataGrid>
            <div style="padding-top:20px;" >
              <input type="button" value="Add News" onclick="javascript:window.location='addNews.aspx'"/>
              <asp:Button ID="Delete" runat="server" Text="Delete" OnClick="Delete_Click"/>
            </div>
          </div>
        </div>
      </div>
      </form>
    </asp:Content>




    using System;
    using System.Collections;
    using System.Configuration;
    using System.Data;
    using System.Linq;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.HtmlControls;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Xml;
    using System.Xml.Linq;
    using System.Data.OleDb;
    using System.Text;

    public partial class admin_manage : System.Web.UI.Page
    {
        protected void Page_Load(Object sender, EventArgs e)
        {
            FormsIdentity objUserIdentity;
            objUserIdentity = (FormsIdentity)User.Identity;
            adminName.Text = objUserIdentity.Name.ToString();

            OleDbConnection conNewsData;
            OleDbCommand cmdSelectDB;
            OleDbDataReader dtrArticleData;

            conNewsData = new OleDbConnection("PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA Source=" + HttpContext.Current.Server.MapPath(ConfigurationManager.AppSettings["mdbPath"]));
            conNewsData.Open();
            cmdSelectDB = new OleDbCommand("SELECT * FROM News", conNewsData);
            dtrArticleData = cmdSelectDB.ExecuteReader();
            Content.DataSource = dtrArticleData;
            Content.DataBind();
            conNewsData.Close();
        }

        protected void Delete_Click(Object sender, EventArgs e)
        {
            OleDbConnection conNewsData;
            OleDbCommand cmdDeleteDB;
            string strDelete = "";
            foreach (DataGridItem chkboxDataGridItem in Content.Items)
            {
                System.Web.UI.WebControls.CheckBox slctCheckBox = (CheckBox)chkboxDataGridItem.FindControl("Select");
                //if (slctCheckBox.Checked)                                                                                  如果这里不注释,那么if里面的语句都不执行
                //{
                    string strNewsId = ((Label)(chkboxDataGridItem.FindControl("NewsId"))).Text;
                    strMessage.Text = strNewsId;
                    conNewsData = new OleDbConnection("PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA Source=" + HttpContext.Current.Server.MapPath(ConfigurationManager.AppSettings["mdbPath"]));
                    strDelete = "Delete from News WHERE ID = @ID";
                    cmdDeleteDB = new OleDbCommand(strDelete, conNewsData);
                    cmdDeleteDB.Parameters.Add(new OleDbParameter("@ID", strNewsId));
                    conNewsData.Open();
                    cmdDeleteDB.ExecuteNonQuery();
                    conNewsData.Close();
                //}
            }
            Response.Redirect(Request.Url.ToString());
        }
    }
    2009年11月15日 11:16
  • 你的button事件有问题。你选中grid中的checkbox后,点击button触发回传,再次绑定后,先前选中的checkbox已经变成没有选中了。

    所以逻辑有点问题。

    你可以直接给grid添加一个delete button,然后在ItemCommand检测argument是否是"delete",如果是就处理。

    或者把你的绑定代码放在Page_Load中的If(this.IsPostback)中试试,如果是第一次加载则绑定,否则不绑定。

    可以参考上面几位的代码处理。


    Microsoft Online Community Support
    2009年11月16日 4:32