代码之家  ›  专栏  ›  技术社区  ›  Laziale

asp.net中奇怪的gridview问题

  •  0
  • Laziale  · 技术社区  · 14 年前

    我在.net中有一个奇怪的gridview问题,到目前为止我还没有找到问题所在。 我有一个由sqldatareader使用的存储过程。 问题正在发生。当我为参数输入一些特定值时,屏幕上的一切都会显示得很好。例如,我有日期和最小/最大数量,gridview被正确填充。 当我再包含一个参数时,比如说customer email,读者说它有行,但是gridview保持空白:

    SqlDataReader rdrAdvancedReport = commAdvanced.ExecuteReader();
                while (rdrAdvancedReport.Read())
                {
                    gvResults.DataSource = rdrAdvancedReport;
                    gvResults.DataBind();
                }
                rdrAdvancedReport.Close();
    

    更“有趣”的是,一旦gridview循环完成,我就有另一个循环,给我所有订单的总金额,并且标签填充正确。

      if (rdrTotal.HasRows)
                    {
                        while (rdrTotal.Read())
                        {
                            orderTotalSum = orderTotalSum + Convert.ToDouble(rdrTotal["OrderTotal"]);
    

    有什么问题吗?

    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER PROCEDURE SearchCust
    (
    @StartTime datetime = null,
    @EndTime datetime = null,
    @CustomerEmail nvarchar(255) = null,    
    @Username nvarchar(255) = null,
    @CustomerName nvarchar(255) = null, 
    @MinimumOrderAmount decimal = null, 
    @MaximumOrderAmount decimal = null, 
    )
     AS
    BEGIN
    SET NOCOUNT ON
    
    SELECT DISTINCT o.OrderID, o.OrderTotal, o.ShippingCountry, n.Name AS OrderStatus, p.Name AS PaymentStatus FROM Order o
    JOIN OrderStatus n ON o.OrderStatusID = n.OrderStatusID
    JOIN PaymentStatus p ON o.OrderStatusID = p.PaymentStatusID 
    JOIN Customer c ON o.CustomerID = c.CustomerID
    JOIN OrderProduct op ON o.OrderID = op.OrderID
    JOIN ProductValue pv ON op.ProductVariantID = pv.ProductVariantId
    WHERE (o.CreatedOn > @StartTime OR @StartTime IS NULL)
    AND (o.CreatedOn < @EndTime OR @EndTime IS NULL)
    AND (o.ShippingEmail = @CustomerEmail OR @CustomerEmail IS NULL)    
    AND (c.Username = @Username OR @Username IS NULL)
    AND (o.BillingFirstName + ' ' + o.BillingLastName = @CustomerName OR @CustomerName IS NULL)
    AND (o.ShippingFirstName + ' ' + o.ShippingLastName = @CustomerName OR @CustomerName IS NULL)   
    AND (o.OrderTotal > @MinimumOrderAmount or @MinimumOrderAmount IS NULL)
    AND (o.OrderTotal < @MaximumOrderAmount OR @MaximumOrderAmount IS NULL) 
    ORDER BY o.OrderID
    END
    

    提前谢谢

    3 回复  |  直到 14 年前
        1
  •  0
  •   clyc    14 年前

    试试这个。。。

    SqlConnection conn = new SqlConnection(connectionString);
    SqlCommand commAdvanced= new SqlCommand(commandString);
    conn.Open();
    commAdvanced.Connection = conn;
    SqlDataReader rdrAdvancedReport = commAdvanced.ExecuteReader(CommandBehavior.CloseConnection);
    gvResults.DataSource = rdrAdvancedReport;
    gvResults.DataBind();
    

    因为您正在将其数据绑定到gridview,所以不必首先遍历结果集。

        2
  •  1
  •   SLaks    14 年前

    你只能读 SqlDataReader 一次。

    你打电话之后 Read()

    相反,您可能应该使用 SqlDataAdapter 填充 DataTable .

        3
  •  0
  •   SLaks    14 年前

    while 循环。

    您当前正在为每一行重新进行数据绑定,这将导致意外行为。