2013-06-19 2 views
2

я должен следующие параметры, которые необходимы для выполнения хранимой процедуры в SQL Server 2008 R2использование переменного сеанса в качестве параметров в asp.net

da.SelectCommand.Parameters.AddWithValue("@StartDate", sessionStartDate.ToString()); 
da.SelectCommand.Parameters.AddWithValue("@EndDate", sessionEndDate.ToString()); 
da.SelectCommand.Parameters.AddWithValue("@PaymentType", payment.ToString()); 

Они необходимы для выполнения хранимой процедуры. Все переменные сеанса передаются правильно. Однако при отображении gridview он не отображает данные. Я знаю, что есть данные, потому что я могу запускать хранимую процедуру в SSMS, и она отлично работает с параметрами, которые передаются proc (когда я их ввожу).

Я довольно смущен в этой точке, поэтому любая помощь будет полезна.

grdDenialDetail.DataSource = ds.Tables["DetailDenial"].DefaultView; 
grdDenialDetail.DataBind(); 

ВЕСЬ ТЕКУЩИЙ: (возможно, это поможет)

public void ExecuteDetailReport() 
{ 
    string sessionConnection = Session["Company"].ToString(); 
    string sessionStartDate = Session["StartDate"].ToString(); 
    string sessionEndDate = Session["EndDate"].ToString(); 
    string payment = Session["payment"].ToString(); 

    SqlConnection conn = new SqlConnection(WebConfigurationManager.ConnectionStrings[sessionConnection].ConnectionString); 

    SqlDataAdapter da = new SqlDataAdapter("dbo.cusGenDenialReportPivotStylePType", conn); 

    da.SelectCommand.CommandType = CommandType.StoredProcedure; 

    /*da.SelectCommand.Parameters.Add(new SqlParameter("@StartDate", SqlDbType.VarChar, 11)).Value = sessionStartDate.ToString(); 
    da.SelectCommand.Parameters.Add(new SqlParameter("@EndDate", SqlDbType.VarChar, 11)).Value = sessionEndDate.ToString(); 
    da.SelectCommand.Parameters.Add(new SqlParameter("@PaymentType", SqlDbType.VarChar, 100)).Value = payment.ToString();*/ 
    da.SelectCommand.Parameters.AddWithValue("@StartDate", sessionStartDate); 
    da.SelectCommand.Parameters.AddWithValue("@EndDate", sessionEndDate); 
    da.SelectCommand.Parameters.AddWithValue("@PaymentType", payment); 
    lblTest.Visible = true; 
    lblTest.Text = "You selected " + payment + "."; 

    DataSet ds = new DataSet(); 

    da.Fill(ds, "DetailDenial"); 

    grdDenialDetail.DataSource = ds.Tables["DetailDenial"].DefaultView; 
    grdDenialDetail.DataBind(); 

    da.Dispose(); 
    conn.Close(); 
} 
+0

Где ваш код привязки? –

+0

Я добавил его к вопросу. – MaximusPrime

+2

Нет необходимости в 'ToString()' каждой из переменных; тип второго параметра 'AddWithValue' - это' object'. Если вы оставите его, вы можете передать переменные на SQL-сервер в том формате, который он не понимает. –

ответ

1

Я думаю, что ваша проблема связана с тем фактом, что вы используете и сравниваете даты как строки, а не даты. Ваш результирующий набор пуст, потому что ваш запрос пытается сравнить строки даты в алфавитном порядке вместо хронологически. Чтобы реорганизовать код, я хотел бы убедиться, что вы адресуете следующие области:

Установка переменных сеанса

Тщательно разобрать даты из ваших текстовых полей.

DateTime startDate; 
if (DateTime.TryParseExact(txtStartDate.Text, "MM/dd/yyyy", 
     CultureInfo.CurrentCulture, DateTimeStyles.None, out startDate)) 
{ 
    Session["StartDate"] = startDate; 
} 

DateTime endDate; 
if (DateTime.TryParseExact(txtEndDate.Text, "MM/dd/yyyy", 
     CultureInfo.CurrentCulture, DateTimeStyles.None, out endDate)) 
{ 
    Session["EndDate"] = endDate; 
} 

Вы можете обрабатывать случай, когда TryParseExact методы возвращают false (синтаксический отказ).

Получение переменного сеанса

Мы устанавливаем переменные сессии в качестве DateTime объектов, поэтому бросили их обратно после извлечения:

var sessionStartDate = (DateTime)Session["StartDate"]; 
var sessionEndDate = (DateTime)Session["EndDate"]; 

Заметьте, что мы все еще используем собственные .NET тип здесь.

Настройка параметров запроса

Используйте .Date свойство DateTime структуры уронить компонент времени:

da.SelectCommand.Parameters.AddWithValue("@StartDate", sessionStartDate.Date); 
da.SelectCommand.Parameters.AddWithValue("@EndDate", sessionEndDate.Date); 
... 

И, наконец, обновить хранимую процедуру так, чтобы его параметры типа date

CREATE PROCEDURE dbo.cusGenDenialReportPivotStylePType 
(
    @StartDate date = null, 
    @EndDate date = null, 
    ... 
) 
AS 
... 
    SELECT 
     * 
    FROM 
     Somewhere 
    WHERE 
     TheDate BETWEEN @StartDate AND @EndDate 

Ke eping все в своем собственном формате данных сделает вашу жизнь намного проще.

+0

Спасибо, Кори! Моя единственная другая проблема - ошибка, которая теперь называется «Ссылка на объект не установлена ​​в экземпляр объекта». и он выделяет строку «var sessionStartDate = (DateTime) Session [« StartDate »]» Переменная, по-видимому, переходит к сеансу, но не к sproc. Я изменил sproc, чтобы иметь startdate и enddate в типе данных DATE, как вы показали выше. – MaximusPrime

+0

Когда я прошел через код, он не набирает дату начала, а собирает дату окончания. Я рассмотрю, что дальше – MaximusPrime

1

Удалить .ToString() вызовы из вашего кода.

+0

Igor Я сделал это, и он по-прежнему не дал данных – MaximusPrime

+0

Это было очевидно, что неправильно в вашем коде. Я не знаю типы переменных 'sessionStartDate',' sessionEndDate' и 'payment', как настроен' da.SelectCommand', какие типы параметров ожидает ваша хранимая процедура. – Igor

+0

Все переменные сеанса ... являются строковыми значениями, а хранимая процедура ожидает значения VARCHAR. VARCHAR и строка правильны? – MaximusPrime

Смежные вопросы