【问题标题】:SqlDataSource run stored procedure twiceSqlDataSource 运行存储过程两次
【发布时间】:2016-04-12 10:50:15
【问题描述】:

我有下表

[Department]  [Location]    [Project]      [Job Title]   [Qty]
-------------------------------------------------------------  
HR            Jeddah        Andalusia       JT2            5  
IT            Jeddah        Head Office     JT1            3

我正在尝试使用 SqlDataSource 运行排序过程,如下所示

CREATE PROCEDURE [dbo].[MManPowerUpdate]
    @Dept     nvarchar(350),
    @Loca     nvarchar(350),
    @Proj     nvarchar(350),
    @JobT     nvarchar(350)
AS

   IF (SELECT QTY FROM [MANPOWER] WHERE ([Department] = @Dept) AND ([Location] = @Loca) AND ([Project] = @Proj) AND ([JobTitle] = @JobT)) > 0
       Begin
         SELECT  'Operation Completed Successfully.' AS [Result]
         UPDATE [MANPOWER] SET QTY = QTY - 1 WHERE ([Department] = @Dept) AND ([Location] = @Loca) AND ([Project] = @Proj) AND ([JobTitle] = @JobT)
       End
   Else
       Begin
         SELECT 'Can''t Execute Operation.' AS [Result]
       End
Return 0  

ASP.net 代码:

  <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:_JOOBERConnectionString %>" SelectCommandType="StoredProcedure" SelectCommand="MManPowerUpdate">
        <SelectParameters>
            <asp:ControlParameter ControlID="txtDept" Name="Dept" PropertyName="Text" Type="String" />
            <asp:ControlParameter ControlID="txtLoca" Name="Loca" PropertyName="Text" Type="String" />
            <asp:ControlParameter ControlID="txtProj" Name="Proj" PropertyName="Text" Type="String" />
            <asp:ControlParameter ControlID="txtJobT" Name="JobT" PropertyName="Text" Type="String" />
        </SelectParameters>
    </asp:SqlDataSource>
    <asp:GridView ID="GridView1" runat="server" DataSourceID="SqlDataSource1" AutoGenerateColumns="False">
        <Columns>
            <asp:BoundField DataField="Result" HeaderText="Result" ReadOnly="True" SortExpression="Result" />
        </Columns>
    </asp:GridView>

vb.net 后面的代码:

Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    SqlDataSource1.Select(New DataSourceSelectArguments)
End Sub

当我使用此值执行代码时,例如。

@Dept  = HR
@Loca  = Jeddah
@proj  = Andalus
@JobT  = JT2 

我希望更新后的数量为 4 并检索“操作已成功完成”。但我曾经在更新后得到 3,这意味着当我调用该过程时更新语句运行了两次。 所以我希望能和你一起找到解决办法。

【问题讨论】:

    标签: asp.net sql-server vb.net stored-procedures


    【解决方案1】:

    问题在于您的 Select 查询也会更新您的数据。由于在生命周期中选择查询是PreRender 上的automatically called,因此在单击按钮时会执行两次递减操作:一次在您的按钮单击事件处理程序中,一次在PreRender 中(并且它可能每次递减QTY打开表单的时间,即使您不按Button1)。

    一种解决方案是将MManPowerUpdate 定义为更新查询:

    <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:_JOOBERConnectionString %>" SelectCommandType="StoredProcedure" UpdateCommand="MManPowerUpdate">
        <UpdateParameters>
            <asp:ControlParameter ControlID="txtDept" Name="Dept" PropertyName="Text" Type="String" />
            <asp:ControlParameter ControlID="txtLoca" Name="Loca" PropertyName="Text" Type="String" />
            <asp:ControlParameter ControlID="txtProj" Name="Proj" PropertyName="Text" Type="String" />
            <asp:ControlParameter ControlID="txtJobT" Name="JobT" PropertyName="Text" Type="String" />
        </UpdateParameters>
    </asp:SqlDataSource>
    

    当你点击按钮时调用它:

    Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        SqlDataSource1.Update()
        GridView1.DataBind()
    End Sub
    

    您可以定义另一个 Select 查询,该查询将获取数据并将其显示在 GridView 中,而无需对其进行修改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多