странная проблема gridview в asp.net - PullRequest
0 голосов
/ 31 октября 2010

У меня странная проблема с gridview в .net, я не нашел, в чем может быть проблема.Вот что это такое: у меня есть хранимая процедура, которая используется sqldatareader.Затем читатель должен прочитать все значения и отобразить из хранимой процедуры.Проблема происходит сейчас.Когда я ввожу некоторые конкретные значения для параметров, все хорошо отображается на экране.Например, у меня есть даты и минимальная / максимальная сумма, а сетка отображается правильно.Когда я включаю еще один параметр, скажем, электронную почту клиента, читатель говорит, что у него есть строки, но представление сетки остается пустым:

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 ]

1 голос
/ 01 ноября 2010

Вы можете прочитать SqlDataReader только один раз.

После того, как вы вызовете Read() через все возвращенные строки, считывание завершено;он не может вернуться и снова прочитать строки.

Вместо этого вам, вероятно, следует использовать SqlDataAdapter для заполнения DataTable.

0 голосов
/ 01 ноября 2010

попробуйте вместо этого ...

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();

Поскольку вы привязываете его к сетке, вам не нужно сначала циклически просматривать набор результатов.

0 голосов
/ 01 ноября 2010

Не следует привязывать данные к вашей сетке внутри цикла while.

В настоящее время вы повторно привязываете данные для каждой строки, что приведет к неожиданному поведению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...