【问题标题】:ASP.NET / SQL parameter issue in a stored procedure存储过程中的 ASP.NET / SQL 参数问题
【发布时间】:2013-07-16 16:54:48
【问题描述】:

我正在尝试从 ASP.NET 中的 SQL Server 访问一些数据,但我无法获取要传递给 SQL Server 存储过程的参数。该参数位于 URL 中(即www.company.com/ImportantManager.aspx?id=Jones,%Bob),因为我只希望显示 Bob Jones 的结果。

NiceMgr_Total 是存储过程。我在这里和 Microsoft 论坛上看到了许多对类似问题的不同回复,但我认为存储过程可能会搞砸它(特别是 @manager 参数 - 其他参数似乎工作正常)。

我尝试了多种方法,但遇到了各种各样的解析器错误和“找不到参数”错误。感谢您的帮助。

代码如下:

<asp:GridView ID="GridView1" DataSourceID="SqlDataSource7" runat="server" 
       AutoGenerateRows="False" EmptyDataText="There are no data records to display."
       AutoGenerateColumns="False">
   <Columns>
       <asp:BoundField DataField="Manager" HeaderText="Manager" SortExpression="Manager" 
            ItemStyle-Width="41px" ItemStyle-HorizontalAlign="Center" 
            HeaderStyle-CssClass="tableheader3" ItemStyle-CssClass="tabledata2" />
   </Columns>
</asp:GridView>

<asp:SqlDataSource ID="SqlDataSource7" runat="server" 
     ConnectionString="<%$ConnectionStrings:ConnectionString3 %>" 
     ProviderName="<%$ ConnectionStrings:ConnectionString3.ProviderName %>" 
     SelectCommand="DECLARE @PerDate VARCHAR(50)
    DECLARE @CurrentDate DATETIME
    SET @CurrentDate = (SELECT MAX([MostRecent]) FROM sameDB.dbo.RecentDate)
    SET @PerDate = CAST(CONVERT(VARCHAR(10),@CurrentDate,120) AS VARCHAR(50))
    EXEC [NiceMgr_Total] @date1=@PerDate, @date2=@PerDate, @manager=@MgrName">

    <selectparameters>
        <asp:querystringparameter name="MgrName" DBtype="String" 
             QueryStringField="<%Response.Write(Request.QueryString.Item("id"))%>" />
    </selectparameters>
</asp:SqlDataSource>

【问题讨论】:

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


    【解决方案1】:

    您的方法存在很多问题 - 请尝试以下步骤:

    1. 您需要在SelectCommand 中指定只需存储过程名称
    2. 您需要将所有参数放入&lt;SelectParameters&gt;集合中
    3. 请:如果您有日期 - 然后使用 DATEDATETIME 数据类型,不要经常来回转换字符串!
    4. 您需要告诉您的选择命令它是一个存储过程(而不是内联 SQL 文本)
    5. 对于您的&lt;QueryStringParameter&gt; - 您只需指定查询字符串元素的名称 - SqlDataSource 将自行读取值

    你需要尝试这样的事情:

    <asp:SqlDataSource ID="SqlDataSource7" runat="server" 
            ConnectionString="<%$ConnectionStrings:ConnectionString3 %>" 
            ProviderName="<%$ ConnectionStrings:ConnectionString3.ProviderName %>" 
            SelectCommand="dbo.NiceMgr_Total"   <!-- *JUST* the name! -->
            SelectCommandType="StoredProcedure">   <!-- tell it's a stored procedure! -->
        <SelectParameters>
            <asp:QueryStringParameter name="MgrName" DbType="String" QueryStringField="id" />
            <!-- specify *ALL* parameters here! -->
            <asp:Parameter Name="date1" DbType="DATETIME" />   
            <asp:Parameter Name="date2" DbType="DATETIME" />
        </SelectParameters>
    </asp:SqlDataSource>
    

    现在,当然,您需要找到某种方法来指定 date1date2 参数,然后才能执行 SqlDataSourceSelectCommand ......

    【讨论】:

      【解决方案2】:

      试试:

        QueryStringField="<%Response.Write(HttpUtility.HtmlDecode(Request.QueryString.Item("id")))%>" />
      

      您可能需要先对查询字符串进行解码,然后才能对其进行参数化。

      【讨论】:

      • QueryStringField 应该只包含查询字符串中的字段名称 - 而不是查询字符串中指定的值!
      猜你喜欢
      • 1970-01-01
      • 2020-10-08
      • 2019-04-17
      • 1970-01-01
      • 2011-02-02
      • 1970-01-01
      • 2020-02-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多