Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取参数的SQLDataSource delete命令_C#_Datagridview_Sqldatasource_Delete Row - Fatal编程技术网

C# 获取参数的SQLDataSource delete命令

C# 获取参数的SQLDataSource delete命令,c#,datagridview,sqldatasource,delete-row,C#,Datagridview,Sqldatasource,Delete Row,我在向DELETE命令传递参数时遇到一些问题,似乎无法很好地理解它的工作原理 <asp:SqlDataSource ID="sdsPropertyList" runat="server" ProviderName="<%$ appSettings:ProviderName %>" ConnectionString="<%$ appSettings:ConnectionString %>" SelectCommand="selPrope

我在向DELETE命令传递参数时遇到一些问题,似乎无法很好地理解它的工作原理

<asp:SqlDataSource ID="sdsPropertyList"
    runat="server"
    ProviderName="<%$ appSettings:ProviderName %>"
    ConnectionString="<%$ appSettings:ConnectionString %>"
    SelectCommand="selPropertyByAcntID"
    SelectCommandType="StoredProcedure"
    OnSelecting="sdsPropertyList_Selecting"
    OnSelected="sdsPropertyList_Selected" 
    DeleteCommand="delPropertyByPropID" 
    DeleteCommandType="StoredProcedure"
    OnDeleting="sdsPropertyList_Deleting"
    OnDeleted="sdsPropertyList_Deleted">
    <SelectParameters>
        <asp:Parameter Name="in_acntID" Type="Int32" DefaultValue="0" />
    </SelectParameters>
    <DeleteParameters>
        <asp:Parameter Name="in_acntID" Type="Int32" DefaultValue="0" />
        <asp:Parameter Name="in_propID" Type="Int32" DefaultValue="0" />
    </DeleteParameters>
</asp:SqlDataSource>

<asp:GridView ID="gvProperty" runat="server" DataSourceID="sdsPropertyList" 
    AutoGenerateColumns="false" CssClass="gvPropList">
    <Columns>
        <asp:BoundField HeaderText="ID" InsertVisible="true" DataField="prop_id" ReadOnly="true" Visible="False" />
        <asp:BoundField HeaderText="Property" DataField="prop_title" 
            ItemStyle-CssClass="gvPropTitle" >
        <ItemStyle CssClass="gvPropTitle" />
        </asp:BoundField>
        <asp:BoundField HeaderText="Units" DataField="unitCount" 
            ItemStyle-CssClass="gvUnitCount" >
        <ItemStyle CssClass="gvUnitCount" />
        </asp:BoundField>
        <asp:BoundField DataField="prop_lastmodified" HeaderText="Last Modified" 
            ItemStyle-CssClass="gvDate" DataFormatString="{0:M/dd/yyyy hh:mm tt}" >
        <ItemStyle CssClass="gvDate" />
        </asp:BoundField>
        <asp:TemplateField>
            <ItemTemplate>
                <asp:LinkButton ID="lbtnEdit" runat="server" CommandName="EditRecord" Text="Edit" CommandArgument='<%# Eval("prop_id") %>'></asp:LinkButton>
                <asp:LinkButton ID="lbtnDelete" runat="server" CommandName="Delete" Text="Delete" CommandArgument='<%# Eval("prop_id") %>'></asp:LinkButton>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField>
            <ItemTemplate>
                <asp:LinkButton ID="lbtnAdd" runat="server" CommandName="AddRecord" Text="Add" CommandArgument='<%# Eval("prop_id") %>'></asp:LinkButton>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
    <HeaderStyle CssClass="headerPropList"/>
    <RowStyle CssClass="gvPropRow" />
</asp:GridView>

protected void sdsPropertyList_Selecting(object sender, SqlDataSourceSelectingEventArgs e)
    {
        int userID = Convert.ToInt32(Page.User.Identity.Name);
        if (userID != 0)
            e.Command.Parameters["in_acntID"].Value = userID;
    }

protected void sdsPropertyList_Deleting(object sender, SqlDataSourceCommandEventArgs e)
    {
        int userID = Convert.ToInt32(Page.User.Identity.Name);
        if (userID != 0)
        {
            e.Command.Parameters["in_acntID"].Value = userID;
        }
    }

受保护的无效sdsPropertyList_正在选择(对象发送方、SqlDataSourcesSelectingEventArgs e)
{
int userID=Convert.ToInt32(Page.User.Identity.Name);
if(userID!=0)
e、 Command.Parameters[“in_acntID”]。Value=userID;
}
受保护的无效sdsPropertyList_正在删除(对象发送方,SqlDataSourceCommandEventArgs e)
{
int userID=Convert.ToInt32(Page.User.Identity.Name);
if(userID!=0)
{
e、 Command.Parameters[“in_acntID”]。Value=userID;
}
}
SELECT语句非常简单,需要一个输入参数userID。 但是,DELETE语句需要2个参数输入。 in_acntID=userID in_propID=边界字段数据字段属性id

我做错了什么?如果在SqlDataSource级别定义了CommandName和CommandArgument,那么它是否应该在ItemTemplate级别传递

我希望“删除”按钮实现以下功能:

  • 从数据库中的表中删除记录
  • 从gridview中删除该行
  • 更新


    经过一些额外的研究,我发现,参数的名称和Boundfield的HeaderText必须相同,以便gridview中的值可以被数据源的SQL命令使用

    除了最初的select commant之外,我已经删除了所有代码隐藏引用


    现在一切都正常工作。

    例如,如果id位于列表框或下拉列表中

    <DeleteParameters>
                   <asp:ControlParameter ControlID="controlname" Name="id" PropertyName="SelectedValue" Type="Int32" />
                        </DeleteParameters>
    
    <asp:SqlDataSource ID="sdsPropertyList"
        runat="server"
        ProviderName="<%$ appSettings:ProviderName %>"
        ConnectionString="<%$ appSettings:ConnectionString %>"
        SelectCommand="selPropertyByAcntID"
        SelectCommandType="StoredProcedure"
        OnSelecting="sdsPropertyList_Selecting"
        DeleteCommand="delPropertyByPropID" 
        DeleteCommandType="StoredProcedure"
        OnDeleted="sdsPropertyList_Deleted" >
        <SelectParameters>
            <asp:Parameter Name="acnt_id" Type="Int32" />
        </SelectParameters>
        <DeleteParameters>
            <asp:Parameter Name="acnt_id" Type="Int32" />
            <asp:Parameter Name="prop_id" Type="Int32" />
        </DeleteParameters>
    </asp:SqlDataSource>
    <asp:GridView ID="gvProperty" runat="server" DataSourceID="sdsPropertyList" 
        AutoGenerateColumns="false" CssClass="gvPropList" DataKeyNames="acnt_id, prop_id">
        <Columns>
            <asp:BoundField HeaderText="acnt_id" InsertVisible="true" DataField="acnt_id" ReadOnly="true" Visible="False" />
            <asp:BoundField HeaderText="prop_id" InsertVisible="true" DataField="prop_id" ReadOnly="true" Visible="False" />
            <asp:BoundField HeaderText="Property" DataField="prop_title">
            <ItemStyle CssClass="gvPropTitle" />
            </asp:BoundField>
            <asp:BoundField HeaderText="Units" DataField="unitCount" >
            <ItemStyle CssClass="gvUnitCount" />
            </asp:BoundField>
            <asp:BoundField DataField="prop_lastmodified" HeaderText="Last Modified" 
                ItemStyle-CssClass="gvDate" DataFormatString="{0:M/dd/yyyy hh:mm tt}" >
            <ItemStyle CssClass="gvDate" />
            </asp:BoundField>
            <asp:BoundField HeaderText="Active" DataField="prop_active">
            <ItemStyle CssClass="gvPropActive" />
            </asp:BoundField>
            <asp:TemplateField>
                <ItemTemplate>
                    <asp:LinkButton ID="lbtnEdit" runat="server" CommandName="EditRecord" Text="Edit"></asp:LinkButton>
                    <asp:LinkButton ID="lbtnDelete" runat="server" CommandName="Delete" Text="Delete"></asp:LinkButton>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField>
                <ItemTemplate>
                    <asp:LinkButton ID="lbtnAdd" runat="server" CommandName="AddRecord" Text="Add"></asp:LinkButton>
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
        <HeaderStyle CssClass="headerPropList"/>
        <RowStyle CssClass="gvPropRow" />
    </asp:GridView>
    
    
    
    我已成功地使用上面的内容进行删除。这可能适用于文本框或标签。如果您正在处理事件,为什么不将整个删除过程交给偶数处理程序呢?指定整个sql设置,包括连接、命令执行。这种方法对我也很有效

    根据,您需要在gridView上指定DataKeyName:


    “使用DataKeyNames属性指定表示数据源主键的一个或多个字段。必须设置DataKeyNames属性才能使GridView控件的自动更新和删除功能正常工作。这些关键字段的值被传递给数据源控件,以便指定要更新或删除的行。“

    经过一些额外的研究,我发现,参数的名称和Boundfield的HeaderText必须相同,以便gridview中的值可以被数据源的SQL命令使用

    除了最初的select commant之外,我已经删除了所有代码隐藏引用

    现在一切正常

    <asp:SqlDataSource ID="sdsPropertyList"
        runat="server"
        ProviderName="<%$ appSettings:ProviderName %>"
        ConnectionString="<%$ appSettings:ConnectionString %>"
        SelectCommand="selPropertyByAcntID"
        SelectCommandType="StoredProcedure"
        OnSelecting="sdsPropertyList_Selecting"
        DeleteCommand="delPropertyByPropID" 
        DeleteCommandType="StoredProcedure"
        OnDeleted="sdsPropertyList_Deleted" >
        <SelectParameters>
            <asp:Parameter Name="acnt_id" Type="Int32" />
        </SelectParameters>
        <DeleteParameters>
            <asp:Parameter Name="acnt_id" Type="Int32" />
            <asp:Parameter Name="prop_id" Type="Int32" />
        </DeleteParameters>
    </asp:SqlDataSource>
    <asp:GridView ID="gvProperty" runat="server" DataSourceID="sdsPropertyList" 
        AutoGenerateColumns="false" CssClass="gvPropList" DataKeyNames="acnt_id, prop_id">
        <Columns>
            <asp:BoundField HeaderText="acnt_id" InsertVisible="true" DataField="acnt_id" ReadOnly="true" Visible="False" />
            <asp:BoundField HeaderText="prop_id" InsertVisible="true" DataField="prop_id" ReadOnly="true" Visible="False" />
            <asp:BoundField HeaderText="Property" DataField="prop_title">
            <ItemStyle CssClass="gvPropTitle" />
            </asp:BoundField>
            <asp:BoundField HeaderText="Units" DataField="unitCount" >
            <ItemStyle CssClass="gvUnitCount" />
            </asp:BoundField>
            <asp:BoundField DataField="prop_lastmodified" HeaderText="Last Modified" 
                ItemStyle-CssClass="gvDate" DataFormatString="{0:M/dd/yyyy hh:mm tt}" >
            <ItemStyle CssClass="gvDate" />
            </asp:BoundField>
            <asp:BoundField HeaderText="Active" DataField="prop_active">
            <ItemStyle CssClass="gvPropActive" />
            </asp:BoundField>
            <asp:TemplateField>
                <ItemTemplate>
                    <asp:LinkButton ID="lbtnEdit" runat="server" CommandName="EditRecord" Text="Edit"></asp:LinkButton>
                    <asp:LinkButton ID="lbtnDelete" runat="server" CommandName="Delete" Text="Delete"></asp:LinkButton>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField>
                <ItemTemplate>
                    <asp:LinkButton ID="lbtnAdd" runat="server" CommandName="AddRecord" Text="Add"></asp:LinkButton>
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
        <HeaderStyle CssClass="headerPropList"/>
        <RowStyle CssClass="gvPropRow" />
    </asp:GridView>
    
    
    
    我尝试添加datakeynames datakeynames=“prop\u id,acnt\u id“,但是仍然没有达到我想要的结果。当我将值传递给datakeynames时,如何将其作为参数传递给sdsPropertyList_Deleting命令?这个答案对我来说是解决方案,我看到您的解决方案是由于一个不同的问题,但希望提醒人们,如果您希望将所有DataKey作为参数包含,请始终将其包含在内,谢谢您的回答!