Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.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
Asp.net 将GridView参数传递给存储的进程_Asp.net_Sql Server_Stored Procedures - Fatal编程技术网

Asp.net 将GridView参数传递给存储的进程

Asp.net 将GridView参数传递给存储的进程,asp.net,sql-server,stored-procedures,Asp.net,Sql Server,Stored Procedures,我正在研究一些以前从未涉及过的新概念,所以我可能会把它复杂化了 我有一个从5表联接填充的GridView。每列表示联接中5个表中的一个。我试图实现的功能是: 用户选择自动生成的编辑链接按钮 用户编辑行中的一个或多个单元格 用户选择自动生成的更新链接按钮 参数被传递到存储的进程,该进程更新受影响的表。 关于如何进行,我有一些不确定因素。 如果我直接查询更新,我需要从另一列传递ID、更改的文本和外键ID。 所以我的问题是如何让GridView UpdateCommand将整行数据传递给存储的进程?

我正在研究一些以前从未涉及过的新概念,所以我可能会把它复杂化了

我有一个从5表联接填充的GridView。每列表示联接中5个表中的一个。我试图实现的功能是:

用户选择自动生成的编辑链接按钮 用户编辑行中的一个或多个单元格 用户选择自动生成的更新链接按钮 参数被传递到存储的进程,该进程更新受影响的表。 关于如何进行,我有一些不确定因素。 如果我直接查询更新,我需要从另一列传递ID、更改的文本和外键ID。 所以我的问题是如何让GridView UpdateCommand将整行数据传递给存储的进程? 我目前已经用一个额外的参数设置了存储过程,我用它来确定需要更新哪个表,但是由于它可能是多个表,我认为这是错误的方法。这是我的GV、DSN和SP

 <asp:GridView ID="GridView1"
    runat="server"
    AutoGenerateColumns="False" 
    DataKeyNames="id" DataSourceID="SqlDataSource1" 
    EnableModelValidation="True"
    AllowSorting="True" 
    EnableSortingAndPagingCallbacks="True"
    allowpaging="True"
    pagesize="26"
    ondatabound="GridView1_DataBound">    

        <Columns>
<asp:BoundField DataField="id" HeaderText="id" InsertVisible="True"
 ReadOnly="True" SortExpression="id" />
            <asp:BoundField DataField="Manufacturer" HeaderText="Manufacturer"   
SortExpression="Manufacturer" />
            <asp:BoundField DataField="PriModel" HeaderText="PriModel" 
SortExpression="PriModel" />
            <asp:BoundField DataField="SecModel" HeaderText="SecModel"  
SortExpression="SecModel" />
            <asp:BoundField DataField="Form" HeaderText="FormFactor" 
SortExpression="Form" />
            <asp:BoundField DataField="Active" HeaderText="Active" 
SortExpression="Active"/>
            <asp:CommandField ShowEditButton="True" />                
        </Columns>
       </asp:GridView>

<asp:SqlDataSource ID="SqlDataSource1" runat="server" DataSourceMode="DataSet"
    ConnectionString="<%$ ConnectionStrings:inventory_v2ConnectionString %>" 
    SelectCommand="SELECT dbo.Models.ID,dbo.Models.Active, 
    dbo.Models_PriModels.PriModel, dbo.Models_SecModels.SecModel, 
    dbo.Models_OEMs.Manufacturer, dbo.Models_FormFactor.Form
    FROM dbo.Models INNER JOIN dbo.Models_FormFactor ON 
    dbo.Models.FormFactor = dbo.Models_FormFactor.ID INNER JOIN
    dbo.Models_OEMs ON dbo.Models.Manufacturer = dbo.Models_OEMs.ID INNER JOIN
    dbo.Models_PriModels ON dbo.Models.PriModel = dbo.Models_PriModels.ID AND   
    dbo.Models_OEMs.ID = dbo.Models_PriModels.Manufacturer INNER JOIN
    dbo.Models_SecModels ON dbo.Models.SecModel = dbo.Models_SecModels.ID AND 
    dbo.Models_PriModels.ID = dbo.Models_SecModels.PriModel ORDER BY dbo.Models.ID 
    DESC"
    UpdateCommand="Procedure_UpdateModelsTables" UpdateCommandType="StoredProcedure"
    OnUpdated="OnDSUpdatedHandler"   
    InsertCommand="">
</asp:SqlDataSource>

    CREATE PROCEDURE <Procedure_UpdateModelsTables> 

    <@Param int>,
    <@ManufacturerID int>,
    <@Manufacturer varchar(50)>,
    <@PriModelID int>,
    <@PriModel varchar(50)>,
    <@SecModelID int>,
    <@SecModel varchar(50)>,
    <@FormID int>,
    <@Form varchar(50)>,
    <@ModelsID int>,
    <@Active char(1)>,
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    -- Insert statements for procedure here
    --SELECT <@Param1, sysname, @p1>, <@Param2, sysname, @p2>
    IF @param = 1     
        exec SP_OEMTable @ManufacturerID,@Manufacturer;
    IF @param = 2
       exec SP_PriModelsTable @PriModelID,@PriModel;
    IF @param = 3     
        exec SP_SecModelsTable @SecModelID,@SecModel;
    IF @param = 4
       exec SP_FormsTable @FormID,@Form;
    IF @param = 5
       exec SP_ModelsTable @ModelsID,@Active;

END

CREATE PROCEDURE SP_OEMTable
    @ManufacturerID int,
    @Manufacturer varchar(50)
AS
BEGIN  
    UPDATE Models_OEMs SET Manufacturer = @Manufacturer WHERE ID = @ManufacturerID;
END

CREATE PROCEDURE SP_PriModelsTable
    @PriModelID int,
    @ManufacturerID int,
    @PriModel varchar(50)
AS
BEGIN  
    UPDATE Models_PriModels SET PriModel = @PriModel WHERE ID = @PriModelID AND Manufacturer = @ManufacturerID;
END
CREATE PROCEDURE SP_SecModelsTable
    @SecModelID int,
    @PriModelID int,
    @SecModel varchar(50)
AS
BEGIN  
    UPDATE Models_SecModels SET SecModel = @SecModel WHERE ID = @SecModelID AND PriModel = @PriModelID;
END
CREATE PROCEDURE SP_FormsTable
    @FormID int,
    @Form varchar(50)
AS
BEGIN  
    UPDATE Models_FormFactor SET Form = @Form WHERE ID = @FormID;
END
CREATE PROCEDURE SP_ModelsTable
    @ModelsID int,
    @Active char(1)
AS
BEGIN  
    UPDATE Models SET Active = @Active WHERE ID = @ModelsID;
END
GO

本教程是我用来学习此过程的:


这完全无关。只有当您必须更新1个表或1:1视图时,这才有效。在更新时,您可以启动一个存储过程来为您执行此操作。在sql server上停止此操作。@briskovich这就是我试图做的,但是在不执行代码隐藏的情况下将参数从ASP传递到sql是让我困惑的。这就是问题所在。我只做代码隐藏的网格。你拥有最多的控制权,然后你就可以随心所欲地进行更新。这就是我发布该教程的原因。我认为如果没有代码隐藏,你无法完成你想做的事情。有一种方法可以做到这一点。但是,它在我的情况下不起作用,因为单元格值不包含指向原始表ID的链接。它被我的联接交换出去。我看到的唯一方法是获取行的单元格值,并对每个值运行select以从每个表中获取原始ID,然后将所有10个参数推送到存储的进程。讨厌。