Sql GridView编辑按钮删除行

Sql GridView编辑按钮删除行,sql,.net,gridview,edit,Sql,.net,Gridview,Edit,我目前正在创建一个替换前端,用于修改一个用户维护的两个数据库表。使用此接口维护的表向我的队友和我创建的其他应用程序提供数据 在使用当前存在的前端时,维护此数据的用户有时会创建由给定公司的公司名称上的多个排列组成的数据行,可能是通过键入,包括公司名称字段中的不同附加信息等。。这导致我们的应用程序查询数据,为用户提供同一公司的多个选择,这常常令人困惑 因此,我希望为维护此数据的用户提供修改CorpNames以修复打字错误或同步某些CorpNames的能力,以便每个CorpNum仅具有一个与其关联的对

我目前正在创建一个替换前端,用于修改一个用户维护的两个数据库表。使用此接口维护的表向我的队友和我创建的其他应用程序提供数据

在使用当前存在的前端时,维护此数据的用户有时会创建由给定公司的公司名称上的多个排列组成的数据行,可能是通过键入,包括公司名称字段中的不同附加信息等。。这导致我们的应用程序查询数据,为用户提供同一公司的多个选择,这常常令人困惑

因此,我希望为维护此数据的用户提供修改CorpNames以修复打字错误或同步某些CorpNames的能力,以便每个CorpNum仅具有一个与其关联的对应CorpName

我使用的控件之一是GridView控件,我已将其绑定到sql数据源,其Select命令如下:

按CorpNum asc从表名顺序选择不同的CorpNum、CorpName

我已将此GridView设置为可按请求排序,并在GridView最左边的列中放置了一个编辑按钮。此编辑操作的更新命令是以下存储过程:

更新表名集CorpName=@CorpName,其中CorpNum=@CorpNum

我看到的奇怪行为如下:

当我单击某行的编辑按钮时,该行可能与GridView控件中的另一行具有相同的CorpNum,该行将自动从GridView和我正在使用副本进行测试的数据库表中删除,因此没有真正的威胁。如果我真的编辑单元格的内容,使我选择的行的CorpName与具有相同CorpNum的另一行的CorpName相同,我可以看到类似的情况发生,因为生成的distinct select的输出将删除一行,但我没有更改任何内容,也没有单击“更新”按钮。这就是我觉得奇怪的地方

有什么想法吗?当然,请随时要求任何澄清等

下面是SqlDataSource标记

    <asp:SqlDataSource ID="sdsCorporationInfo" runat="server" 
    ConnectionString="<%$ ConnectionStrings:ConnString %>
    SelectCommand="select distinct CorpNum,CorpName from Distribution_xx order by CorpNum asc"
    onselecting="sdsCorporationInfo_Selecting" 
    UpdateCommand="sp_XXUpdateCorporationInfo" 
    UpdateCommandType="StoredProcedure">
    <UpdateParameters>
    <asp:Parameter Name="CorpNum" Type="Decimal" />
    <asp:Parameter Name="CorpName" Type="String" />
    </UpdateParameters>
    </asp:SqlDataSource>
GridView标记如下所示:

    <asp:GridView ID="gvCorporationInfo" runat="server"  AutoGenerateColumns="False" 
    DataSourceID="sdsCorporationInfo" Visible="False"
    AllowSorting="True" AutoGenerateEditButton="True"
    onrowediting="gvCorporationInfo_RowEdit"
    onrowupdated="gvCorporationInfo_RowUpdate"
    onrowupdating="gvCorporationInfo_RowUpdating"
    <Columns>
    <asp:TemplateField HeaderText="Corp #" SortExpression="CorpNum">
    <EditItemTemplate>
    <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("CorpNum") %>'></asp:TextBox>
    </EditItemTemplate>
    <ItemTemplate>
    <asp:Label ID="Label1" runat="server" Text='<%# Bind("CorpNum") %>'></asp:Label>
    </ItemTemplate>
    </asp:TemplateField>
    <asp:TemplateField HeaderText="Corp Name" SortExpression="CorpName">
    <EditItemTemplate>
    <asp:TextBox ID="TextBox2" runat="server" Text='<%# Bind("CorpName") %>'></asp:TextBox>
    </EditItemTemplate>
    <ItemTemplate>
    <asp:Label ID="Label2" runat="server" Text='<%# Bind("CorpName") %>'></asp:Label>
    </ItemTemplate>
    </asp:TemplateField>
    </Columns>
    </asp:GridView>
运行时GridView内容的概念如下:

            Corp #  Corp Name
    Edit    33  Corp Name 1
    Edit    37  Corp Name 2
    Edit    48  Corp Name 3
    Edit    48  Corp Name Three
    Edit    51  Corp Name 4
    Edit    53  Corp Name 5
    Edit    56  Corp Name 6
    Edit    57  Corp Name 7
    Edit    60  Corp Name 8
    Edit    61  Corp Name 9
    Edit    63  Corp Name 10
    Edit    64  Corp Name 11
    Edit    65  Corp Name 12
    Edit    66  Corp Name 13
    Edit    68  Corp Name 14
    Edit    70  Corp Name 15
    Edit    71  Corp Name 16
    Edit    71  Corp Name Sixteen

TIA

尝试下面的内容

在ASP标记中,请注意已添加的onrowediting以引用codebehind中的事件。此外,在列中,第一个是CommandField按钮。自动生成编辑将替换为该行,以便选定行可以使用codebehind事件。这对我来说很有用,我希望它有用。如果没有别的,也许它会激发一些想法,帮助你走出困境。再次运行探查器,查看发送到SQL server的内容。这是发现数据不匹配和给您带来麻烦的奇数位的好方法。它可能是非常小的东西,这会帮助你发现它

<asp:GridView ID="gvCorporationInfo" runat="server" AutoGenerateColumns="False" DataSourceID="sdsCorporationInfo"
    onselectedindexchanged="gvCorporationInfo_SelectedIndexChanged" 
    DataKeyNames="CorpNum" onrowdatabound="Grid_OnRowDataBound" 
    onrowediting="gvCorporationInfo_RowEditing" >
    <Columns>
        <asp:CommandField ShowEditButton="True" ButtonType="Button" EditText="  Edit  " />
<asp:BoundField>...all your boundfields here

如果输入错误,我很抱歉。

我们可能需要前端、后端和存储过程提供更完整的代码,以获得更完整的图片。此外,我建议使用SQL Profiler来监视数据库,并捕获在应用程序中点击编辑按钮时执行的命令。这可能有助于展示一些意想不到的东西,并给你一些指导。谢谢你的回复。我刚刚用c代码、标记、存储过程和运行时gridview内容的示例更新了我的帖子。我仍然建议使用SQL Profiler查看发送的内容。如果你从来没用过,我很乐意带你去看看。对我来说,这是最好的故障排除工具。其他需要考虑的参数数据类型。我在ASP中定义数据类型时遇到了一些奇怪的问题。我通常只是将SP中的参数声明为varchar,然后将其作为字符串发送。然后我在SQL中使用转换或强制转换来排列类型。这对我很有效。另一种可能的解决方案是创建连接并从代码隐藏中执行SP。我刚刚确认,如果我将select查询更改为将ASP页面中的更新参数设置为,然后在SQL SP中将其声明为varchar,然后将WHERE CASTCorpNum设置为INT=@CorpNum,看看这是否有区别。否则,如果您仍然有问题,并且想要一个如何在codebehind中设置此功能的示例,请告诉我。我会尝试一下,不需要道歉。你不知道我有多感激你的帮助。
            Corp #  Corp Name
    Edit    33  Corp Name 1
    Edit    37  Corp Name 2
    Edit    48  Corp Name 3
    Edit    48  Corp Name Three
    Edit    51  Corp Name 4
    Edit    53  Corp Name 5
    Edit    56  Corp Name 6
    Edit    57  Corp Name 7
    Edit    60  Corp Name 8
    Edit    61  Corp Name 9
    Edit    63  Corp Name 10
    Edit    64  Corp Name 11
    Edit    65  Corp Name 12
    Edit    66  Corp Name 13
    Edit    68  Corp Name 14
    Edit    70  Corp Name 15
    Edit    71  Corp Name 16
    Edit    71  Corp Name Sixteen
<asp:GridView ID="gvCorporationInfo" runat="server" AutoGenerateColumns="False" DataSourceID="sdsCorporationInfo"
    onselectedindexchanged="gvCorporationInfo_SelectedIndexChanged" 
    DataKeyNames="CorpNum" onrowdatabound="Grid_OnRowDataBound" 
    onrowediting="gvCorporationInfo_RowEditing" >
    <Columns>
        <asp:CommandField ShowEditButton="True" ButtonType="Button" EditText="  Edit  " />
<asp:BoundField>...all your boundfields here
<asp:SqlDataSource ID="sdsCorporationInfo" runat="server" 
ConnectionString="<%$ ConnectionStrings:ConnString %>
SelectCommand="select distinct CorpNum,CorpName from Distribution_xx order by CorpNum asc"
onselecting="sdsCorporationInfo_Selecting" 

<UpdateParameters>
    <UpdateParameters>
        <asp:Parameter Name="CorpName" />
        <asp:Parameter Name="CorpNum" />
    </UpdateParameters>
</asp:SqlDataSource>
    protected void gvCorporationInfo_RowEditing(object sender, GridViewEditEventArgs e)
{
    string connectionstring = WebConfigurationManager.ConnectionStrings["ConnString"].ConnectionString;
    SqlConnection con = new SqlConnection();
    con.ConnectionString = connectionstring;
    SqlCommand cmd = new SqlCommand();

    cmd = new SqlCommand("DatabaseName.dbo.sp_XXUpdateCorporationInfo", con);

    cmd.Parameters.AddWithValue("@CorpNum", (String)gvCorporationInfo.DataKeys[e.NewEditIndex].Value);
    cmd.Parameters.AddWithValue("@CorpName", (String)gvCorporationInfo.DataKeys[e.NewEditIndex].Value);


    cmd.CommandType = CommandType.StoredProcedure;

    con.Open();
    cmd.ExecuteScalar();

    con.Close();

    gvCorporationInfo.DataBind();
}