Передача значения параметра в хранимый SQL proc необязательной строки в asp.net - PullRequest
4 голосов
/ 22 июня 2010

У меня есть страница поиска, которая имеет текстовое поле Дата. Пользователь может заполнять или не заполнять это поле. Но поле является параметром хранимого процесса SQL, который вызывается для выполнения поискового запроса.

Когда я иду по коду (а поле «Дата» не заполнено), я получаю сообщение об ошибке, что значение не может быть преобразовано в DateTime

Как я могу преобразовать нулевое значение в DateTime, поскольку параметр ожидает запрос?

cmdSearch.Parameters.Add(new SqlParameter("@StartDate", SqlDbType.DateTime));
cmdSearch.Parameters["@StartDate"].Value = Convert.ToDateTime(txtStartDate.Text.Trim());

Ответы [ 3 ]

5 голосов
/ 22 июня 2010

Если вы установите параметр в процедуре SQL в качестве необязательного параметра, указав значение по умолчанию

CREATE PROCEDURE MyProc
...
@StartDate datetime = null,
....

, вы можете просто пропустить отправку этого параметра из кода c #

DateTime result;
if (DateTime.TryParse(txtStartDate.Text, out result))
{
   cmdSearch.Parameters.Add(new SqlParameter("@StartDate", SqlDbType.DateTime));
   cmdSearch.Parameters["@StartDate"].Value = result;
}

Если анализ текстового поля не выполнен, параметр не добавляется в список параметров, а база данных использует значение по умолчанию.

Кроме того, использование DateTime.TryParse (..) предотвращает обработку исключений..

2 голосов
/ 22 июня 2010

Оберните if утверждение вокруг всего и протестируйте, чтобы увидеть: String.IsNullOrEmpty(txtStartDate.Text)

РЕДАКТИРОВАТЬ

Это то, что я имел в виду, "все"- извиняюсь за то, что не прояснил

if (!String.IsNullOrEmpty(txtStartDate.Text))
    cmdSearch.Parameters["@StartDate"].Value = Convert.ToDateTime(txtStartDate.Text.Trim());
else
    cmdSearch.Parameters["@StartDate"].Value = DateTime.MinValue;
2 голосов
/ 22 июня 2010
cmdSearch.Parameters["@StartDate"].Value = 
    String.IsNullOrEmpty(txtStartDate.Text) ? SqlDateTime.MinValue : 
        Convert.ToDateTime(txtStartDate.Text.Trim()); 

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

Обязательно используйте структуру SqlDateTime вместо DateTime , поскольку эти два имеют совершенно разные MinValue s.

Имейте в виду, что это не исправит случаи, когда TextBox имеет текст, который не имеет надлежащего формата даты. В этих случаях вы будете получать исключения!

...