asp.net中奇怪的gridview问题

时间:2010-10-31 20:57:42

标签: asp.net sql

我在.net中有这个奇怪的gridview问题,到目前为止我还没有找到可能出现的问题。 这是什么: 我有一个sqldatareader使用的存储过程。 然后我让读者读取所有值并从存储过程中显示。 问题现在正在发生。当我输入参数的某些特定值时,屏幕上的所有内容都会正常显示。例如,我有日期和最小/最大金额,并且gridview正确填充。 当我再包含一个参数时,让我们说客户电子邮件,读者说它有行,但是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 个答案:

答案 0 :(得分:1)

您只能阅读SqlDataReader一次。

通过所有返回的行调用Read()后,读者就完成了;它无法返回并再次读取行。

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

答案 1 :(得分:0)

您不应该在while循环中对网格进行数据绑定。

您目前正在为每一行再次对其进行数据绑定,这将导致意外行为。

答案 2 :(得分:0)

试试这个......

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,因此您不必首先遍历结果集。