none
C#中GridView中的删除 RRS feed

  • 问题

  • 今天在做GridView中的RowDeleting事件代码时,总是遇到如下两个问题,请问一下是什么原因:
    1.数据库错误,错误原因:列名 'T2510001' 无效
    2.数据库错误,错误原因:将 varchar 值 'T1410001' 转换为数据类型为 int 的列时发生语法错误

    页面设置表述如下:<Columns>
                                <asp:TemplateField HeaderText="编号">
                                    <ItemTemplate>
                                        <asp:Label ID="Label1" runat="server" Text='<%# Eval("TeacherID") %>'></asp:Label>
                                    </ItemTemplate>
                                </asp:TemplateField>
                                <asp:TemplateField HeaderText="姓名">
                                    <ItemTemplate>
                                        <asp:Label ID="Label2" runat="server" Text='<%# Eval("TeacherName") %>'></asp:Label>
                                    </ItemTemplate>
                                    <EditItemTemplate>
                                        <asp:TextBox ID="txtName" runat="server" Text='<%# Eval("TeacherName") %>'
                                            Width="35px"></asp:TextBox>
                                    </EditItemTemplate>
                                </asp:TemplateField>
                                <asp:TemplateField HeaderText="院系">
                                    <ItemTemplate>
                                         <asp:Label ID="Label3" runat="server" Text='<%# Eval("SchoolName") %>'></asp:Label>
                                    </ItemTemplate>
                                    <EditItemTemplate>
                                        <asp:HiddenField ID="hdfDepart" runat="server"
                                            Value='<%# Eval("SchoolName") %>' />
                                        <asp:DropDownList ID="ddlDepart" runat="server">
                                        </asp:DropDownList>
                                    </EditItemTemplate>
                                </asp:TemplateField>
                                <asp:CommandField HeaderText="编辑" ShowEditButton="True" />
                                <asp:CommandField HeaderText="删除" ShowDeleteButton="True" />
                            </Columns>

    我的编码是这样的:protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
        {
            string id = GridView1.DataKeys[e.RowIndex].Values[0].ToString();              //取出要删除的记录的主键值
            string connStr = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;//取出连接字符串
            string SqlStr = "delete from TeacherTable where TeacherID=" + id;
            try
            {
                SqlConnection conn = new SqlConnection(connStr);                           //创建连接对象
                if (conn.State.ToString() == "Closed")
                    conn.Open();
                SqlCommand comm = new SqlCommand(SqlStr, conn);
                comm.ExecuteNonQuery();                                                  //执行删除操作
                if (conn.State.ToString() == "Open")
                    conn.Close();
                GridView1.EditIndex = -1;
               
            }
            catch (Exception ex)
            {
                Response.Write("数据库错误,错误原因:" + ex.Message);
                Response.End();
            }




    其中DatakeyNames="TeacherID"
    请大家帮帮看看,找出原因吧!
    • 已移动 mldark 2010年1月29日 16:20 asp.net 问题 (发件人:Visual C#)
    2010年1月29日 15:23

答案

  •        string    id=     e.Values["TeacherID"].ToString();  
            string connStr = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;//取出连接字符串
            string SqlStr = "delete from TeacherTable where TeacherID=@TeacherID"  ;
            try
            {
                SqlConnection conn = new SqlConnection(connStr);                           //创建连接对象
                SqlCommand comm = new SqlCommand(SqlStr, conn);
              comm.Parameters.AddWithValue("@TeacherID",id);
                if (conn.State== System.Data.ConnectionState.Closed)
                   conn.Open();
                   comm.ExecuteNonQuery();                                                  //执行删除操作
                if (conn.State== System.Data.ConnectionState.Open)
                    conn.Close();
                GridView1.EditIndex = -1;
                
            }
            catch (Exception ex)
            {
                Response.Write("数据库错误,错误原因:" + ex.Message);
                Response.End();
            }
    • 已编辑 mldark 2010年1月30日 2:33 少写了两个字母
    • 已标记为答案 Smiling008 2010年1月30日 6:11
    2010年1月29日 16:19
  • 你好!

    1 不要拼接 SQL,使用参数的方式
    2 既然是新的 SqlConnection 判断 conn.State 是没有意义的
    3 你的问题是出在拼接 SQL 的问题上。你的 TeacherID 应该是一个 NVARCHAR 字段,而你拼接的时候并没有给值加上单引号。

    string id = GridView1.DataKeys[e.RowIndex].Values[0].ToString();              //取出要删除的记录的主键值
    string SqlStr = "delete TeacherTable where TeacherID = @TeacherID"; 
    string connStr = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;//取出连接字符串
    
    using (SqlConnection conn = new SqlConnection(connStr))
    {
        SqlCommand comm = new SqlCommand(SqlStr, conn);
        comm.Parameters.AddWithValue("@TeacherID", id);
        conn.Open();
        comm.ExecuteNonQuery();
    
        // 重新绑定 GridView
    }


    知识改变命运,奋斗成就人生!
    • 已标记为答案 Smiling008 2010年1月30日 6:11
    2010年1月29日 16:31
    版主
  • 外键的存在是为了保证数据记录的完整性。你可以先将 CourseTable  中记录删除后再删除 Teacher 表。删除时最好能给个提示让用户确认。

    string SqlStr = "delete CourseTable where TeacherId = @TeacherID; delete TeacherTable where TeacherID = @TeacherID"; 

    知识改变命运,奋斗成就人生!
    • 已标记为答案 Smiling008 2010年1月30日 6:11
    2010年1月30日 5:16
    版主
  • 可又出现了这个问题:数据库错误,错误原因:DELETE 语句与 COLUMN REFERENCE 约束 'FK_CourseTable_TeacherTable' 冲突。该冲突发生于数据库 'Student',表 'CourseTable', column 'TeacherID'。语句已终止。是不是我数据库设置得有问题啊?

    DELETE 语句与 COLUMN REFERENCE 约束冲突。

    解决办法:sql server 中只要设计从表;

    管理关系选择相应的关系;

    把级联删除前面勾选。

    • 已标记为答案 Smiling008 2010年1月30日 6:11
    2010年1月30日 5:19
  • 还有提醒对话 这样做 把gridview自带删除按钮改成自定义模板
    <asp:TemplateField ShowHeader="False"> <ItemTemplate> <asp:LinkButton ID="LinkButton1" runat="server" OnClientClick="return window.confirm('确定删除吗?')" CommandName="Delete" Text="删除"></asp:LinkButton> </ItemTemplate> </asp:TemplateField>
    • 已标记为答案 Smiling008 2010年1月30日 6:12
    2010年1月30日 5:30

全部回复

  •        string    id=     e.Values["TeacherID"].ToString();  
            string connStr = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;//取出连接字符串
            string SqlStr = "delete from TeacherTable where TeacherID=@TeacherID"  ;
            try
            {
                SqlConnection conn = new SqlConnection(connStr);                           //创建连接对象
                SqlCommand comm = new SqlCommand(SqlStr, conn);
              comm.Parameters.AddWithValue("@TeacherID",id);
                if (conn.State== System.Data.ConnectionState.Closed)
                   conn.Open();
                   comm.ExecuteNonQuery();                                                  //执行删除操作
                if (conn.State== System.Data.ConnectionState.Open)
                    conn.Close();
                GridView1.EditIndex = -1;
                
            }
            catch (Exception ex)
            {
                Response.Write("数据库错误,错误原因:" + ex.Message);
                Response.End();
            }
    • 已编辑 mldark 2010年1月30日 2:33 少写了两个字母
    • 已标记为答案 Smiling008 2010年1月30日 6:11
    2010年1月29日 16:19
  • 你好!

    1 不要拼接 SQL,使用参数的方式
    2 既然是新的 SqlConnection 判断 conn.State 是没有意义的
    3 你的问题是出在拼接 SQL 的问题上。你的 TeacherID 应该是一个 NVARCHAR 字段,而你拼接的时候并没有给值加上单引号。

    string id = GridView1.DataKeys[e.RowIndex].Values[0].ToString();              //取出要删除的记录的主键值
    string SqlStr = "delete TeacherTable where TeacherID = @TeacherID"; 
    string connStr = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;//取出连接字符串
    
    using (SqlConnection conn = new SqlConnection(connStr))
    {
        SqlCommand comm = new SqlCommand(SqlStr, conn);
        comm.Parameters.AddWithValue("@TeacherID", id);
        conn.Open();
        comm.ExecuteNonQuery();
    
        // 重新绑定 GridView
    }


    知识改变命运,奋斗成就人生!
    • 已标记为答案 Smiling008 2010年1月30日 6:11
    2010年1月29日 16:31
    版主
  • X.X.Y<abbr class="affil">版主
    您好!您一直都强调不要使用拼接 SQL,要使用使用参数的方式,其次还强调遇到问题要多使用SQL Profile 这些我都牢记在心里,但由于这次寒假回家匆忙,就带了一本c#和SQL参考书回家,而我之前也一直都在使用这本书,所以我对使用拼接SQL比较熟悉,而对使用参数的方式不是太了解,所以我没次上传代码的时候,心里总是会想,这次版主又得说我使用拼接SQL了,以上这两个问题我都上网查过,但效果不是很明显 ,还有一个问题就是在开发系统的过程中,我对GridView中的事件、属性都了解的不是很透彻,而它又是c#的精华,可不可以介绍关于这方面的一本书啊,我想好好在看看,麻烦了!</abbr>
    2010年1月30日 4:09
  • 如果我没理解错的话,上面两位版主就已经在使用参数方式的SQL了吧?就是下面的这几句吧!
    string id = GridView1.DataKeys[e.RowIndex].Values[0].ToString();              //取出要删除的记录的主键值
    string SqlStr = "delete TeacherTable where TeacherID = @TeacherID"
    comm.Parameters.AddWithValue("@TeacherID", id);
    2010年1月30日 4:19
  • 可又出现了这个问题:数据库错误,错误原因:DELETE 语句与 COLUMN REFERENCE 约束 'FK_CourseTable_TeacherTable' 冲突。该冲突发生于数据库 'Student',表 'CourseTable', column 'TeacherID'。语句已终止。是不是我数据库设置得有问题啊?
    2010年1月30日 4:30
  • 你好!

    出现这个问题,是因为外键存在的原因。你要先判断你要删除的 TeacherId 是否在表 CourseTable 中存在,不存在才能删除。

    Wrox 红皮书都不错你可以去看看,如 C# 高级编程, 另外 MSDN WebCast 也是不错的资源。

    知识改变命运,奋斗成就人生!
    2010年1月30日 4:57
    版主
  • 出现这个问题,是因为外键存在的原因。你要先判断你要删除的 TeacherId 是否在表 CourseTable 中存在,不存在才能删除。 那如果要删除的TeacherId 在表 CourseTable 中存在,那该怎么办,是不是一定要把外键删除,有没有别的方法
    2010年1月30日 5:12
  • 外键的存在是为了保证数据记录的完整性。你可以先将 CourseTable  中记录删除后再删除 Teacher 表。删除时最好能给个提示让用户确认。

    string SqlStr = "delete CourseTable where TeacherId = @TeacherID; delete TeacherTable where TeacherID = @TeacherID"; 

    知识改变命运,奋斗成就人生!
    • 已标记为答案 Smiling008 2010年1月30日 6:11
    2010年1月30日 5:16
    版主
  • 可又出现了这个问题:数据库错误,错误原因:DELETE 语句与 COLUMN REFERENCE 约束 'FK_CourseTable_TeacherTable' 冲突。该冲突发生于数据库 'Student',表 'CourseTable', column 'TeacherID'。语句已终止。是不是我数据库设置得有问题啊?

    DELETE 语句与 COLUMN REFERENCE 约束冲突。

    解决办法:sql server 中只要设计从表;

    管理关系选择相应的关系;

    把级联删除前面勾选。

    • 已标记为答案 Smiling008 2010年1月30日 6:11
    2010年1月30日 5:19
  • 可又出现了这个问题:数据库错误,错误原因:DELETE 语句与 COLUMN REFERENCE 约束 'FK_CourseTable_TeacherTable' 冲突。该冲突发生于数据库 'Student',表 'CourseTable', column 'TeacherID'。语句已终止。是不是我数据库设置得有问题啊?

    DELETE 语句与 COLUMN REFERENCE 约束冲突。

    解决办法:sql server 2000 中只要设计从表;

    管理关系选择相应的关系;

    把级联删除前面勾选。


    你使用上面上种方式更好一些。删除前给用户一个提示让用户确认之后再删除。

    知识改变命运,奋斗成就人生!
    2010年1月30日 5:22
    版主
  • 还有提醒对话 这样做 把gridview自带删除按钮改成自定义模板 <asp:TemplateField ShowHeader="False"> <ItemTemplate> <asp:LinkButton ID="LinkButton1" runat="server" OnClientClick="return window.confirm('确定删除吗?')" CommandName="Delete" Text="删除"></asp:LinkButton> </ItemTemplate> </asp:TemplateField>
    2010年1月30日 5:30
  • 还有提醒对话 这样做 把gridview自带删除按钮改成自定义模板
    <asp:TemplateField ShowHeader="False"> <ItemTemplate> <asp:LinkButton ID="LinkButton1" runat="server" OnClientClick="return window.confirm('确定删除吗?')" CommandName="Delete" Text="删除"></asp:LinkButton> </ItemTemplate> </asp:TemplateField>
    • 已标记为答案 Smiling008 2010年1月30日 6:12
    2010年1月30日 5:30
  • 可又出现了这个问题:数据库错误,错误原因:DELETE 语句与 COLUMN REFERENCE 约束 'FK_CourseTable_TeacherTable' 冲突。该冲突发生于数据库 'Student',表 'CourseTable', column 'TeacherID'。语句已终止。是不是我数据库设置得有问题啊?

    DELETE 语句与 COLUMN REFERENCE 约束冲突。

    解决办法:sql server 2000 中只要设计从表;

    管理关系选择相应的关系;

    把级联删除前面勾选。

    mldark 版主,真是太谢谢你们了,你们真是太好了,我的系统开发的前面部分都做得差不多了,就是GridView那边现在存在着很大的问题,希望版主您能够指点迷津,有助于我今天系统的开发!
    2010年1月30日 5:48
  • 不客气 下次再来提问
    2010年1月30日 6:13
  • 现在删除的问题解决了,可在前台点击删除后,后台数据库相应的数据删除了,可是前台页面上并没有相应的实时更新,只有重新点击查询按钮才能显示更新,可我的意思是让它在点击删除的时候,前后台的数据同时消失,请问这个问题该怎么解决

    2010年1月30日 6:16
  • 创建gridview的rowdeleted事件 以下代码可以解决 
    protected void GridView1_RowDeleted(object sender, GridViewDeletedEventArgs e)
            {
                GridView1.DataBind();
            }
    2010年1月30日 6:23
  • mldark版主,老实说
    我现在的问题一大推,都不好意思一次性问个痛快,害怕把你们给问烦了!
    2010年1月30日 6:24
  • mldark版主,老实说
    我现在的问题一大推,都不好意思一次性问个痛快,害怕把你们给问烦了!

    没事 你是客户 我们尽力服务的 不会烦的
    2010年1月30日 6:25
  • 我运行了一下,貌似不可以!

    2010年1月30日 6:40
  • 我运行了一下,貌似不可以!


    那你到少把绑定方法放在你的操作删除数据后面看看 一般解决这个问题 重新绑定就可以了
    2010年1月30日 6:42
  • 我参照我的参考书,和网上的一篇日志,写了一下GridView绑定数据的代码:
    //GridView绑定数据的方法
        private void GridViewBind(string SqlStr)
        {
            string connStr = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
            if (SqlStr == "")
                SqlStr = "select TT.TeacherID,TT.TeacherName,ST.SchoolID,ST.SchoolName from TeacherTable as TT,SchoolTableID as ST where TT.TeacherSchoolID=ST.School order by ST.SchoolID";
            DataSet ds = new DataSet();
            SqlConnection conn = new SqlConnection(connStr);
            try
            {
                if (conn.State.ToString() == "Closed")
                    conn.Open();

                SqlDataAdapter da = new SqlDataAdapter(SqlStr, conn);
                da.Fill(ds);
                GridView1.DataSource = ds.Tables[0].DefaultView;
                GridView1.DataBind();
            }
            catch (Exception ex)
            {
                Response.Write("数据库错误,错误原因:" + ex.Message);
                Response.End();
            }
            finally
            {
                if (conn.State.ToString() == "Open")
                    conn.Close();
            }
        }



    说明:因为我的参考书是拼串的SQL,所以我一时,还改不来,还望见谅!今天上午您写给我的代码,应该就是使用参数的SQL吧!
    我的意思是我的绑定方法有没有错误,因为我感觉数据绑定的代码的格式基本都是这样的,不知您是否同意我的愚见啊!

    2010年1月30日 9:06
  • 我参照我的参考书,和网上的一篇日志,写了一下GridView绑定数据的代码:
    //GridView绑定数据的方法
        private void GridViewBind(string SqlStr)
        {
            string connStr = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
            if (SqlStr == "")
                SqlStr = "select TT.TeacherID,TT.TeacherName,ST.SchoolID,ST.SchoolName from TeacherTable as TT,SchoolTableID as ST where TT.TeacherSchoolID=ST.School order by ST.SchoolID";
            DataSet ds = new DataSet();
            SqlConnection conn = new SqlConnection(connStr);
            try
            {
                if (conn.State.ToString() == "Closed")
                    conn.Open();

                SqlDataAdapter da = new SqlDataAdapter(SqlStr, conn);
                da.Fill(ds);
                GridView1.DataSource = ds.Tables[0].DefaultView;
                GridView1.DataBind();
            }
            catch (Exception ex)
            {
                Response.Write("数据库错误,错误原因:" + ex.Message);
                Response.End();
            }
            finally
            {
                if (conn.State.ToString() == "Open")
                    conn.Close();
            }
        }



    说明:因为我的参考书是拼串的SQL,所以我一时,还改不来,还望见谅!今天上午您写给我的代码,应该就是使用参数的SQL吧!
    我的意思是我的绑定方法有没有错误,因为我感觉数据绑定的代码的格式基本都是这样的,不知您是否同意我的愚见啊!


    没有问题! 啊
    2010年1月30日 9:40
  • 建议你了解一下 SqlHelper,将数据访问封装到一个类中。这样每次访问数据时就没有必要这么麻烦了。
    知识改变命运,奋斗成就人生!
    2010年1月30日 9:59
    版主