Я предлагаю параметризованный запрос с включающей начальной датой и исключительной конечной датой для запросов диапазона дат.Лучше избегать применения функций к столбцам SQL Server в предложении WHERE
, поскольку это препятствует эффективному использованию индексов (если таковые имеются).Например:
var date = DateTime.Now;
if(!DateTime.TryParse(Textbox11.Text, out date))
{
//invalid date handing
return;
}
var startDate = new DateTime(date.Year, date.Month, 1);
var endDate = startDate.AddMonths(1);
string s = "SELECT * FROM Stock WHERE Date >= @StartDate AND Date < @EndDate;";
SqlCommand cmd = new SqlCommand(s, conn);
SqlDataAdapter dr = new SqlDataAdapter(cmd);
cmd.Parameters.Add("@StartDate", SqlDbType.DateTime).Value = startDate;
cmd.Parameters.Add("@EndDate", SqlDbType.DateTime).Value = endDate;
DataTable dt = new DataTable();
dr.Fill(dt);
Также рассмотрите возможность указания списка столбцов объяснения только с необходимыми столбцами, а не SELECT *
, поскольку это уменьшит ненужную передачу данных и даст SQL Server больше возможностей оптимизации запросов.
Имейте в виду, что разбор даты произвольной формы неоднозначен.Было бы лучше ограничить ввод данных пользователем определенным форматом даты или использовать элемент управления выбора даты, который сделает это за вас, разрешив TryParseExact
на стороне сервера.