Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 при запросе в промежутке дат февраль идет после марта  [new]
jarrhead
Member

Откуда:
Сообщений: 25
есть таблица со столбцами ID, datetime, road. в ней есть события только за ФЕВРАЛЬ. в SharePoint 2007 есть вебчасть, на которой есть поле ввода даты, поле ввода ID и кнопка посыла запроса. на кнопке висит такой запрос
"SELECT * FROM KPP WHERE id = '" + (txtID.Text) + "' " + "AND date <= '" + enddatetimepicker.SelectedDate.Date.TimeOfDay + "' "
в поле ввода даты ввожу сегодняшнее число, т.е. МАРТ месяц. при нажатии на кнопку выводится пуста страница. а если передалать запрос на
"SELECT * FROM KPP WHERE id = '" + (txtID.Text) + "' " + "AND date >= '" + enddatetimepicker.SelectedDate.Date.TimeOfDay + "' "
то выводит все нужнве записи. т.е. получается что Февральская дата больше чем Мартовская. как такое может быть???
20 мар 12, 16:51    [12282771]     Ответить | Цитировать Сообщить модератору
 Re: при запросе в промежутке дат февраль идет после марта  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
И какой же текст запроса ваша вебчасть отсылает на сервер?
20 мар 12, 16:52    [12282779]     Ответить | Цитировать Сообщить модератору
 Re: при запросе в промежутке дат февраль идет после марта  [new]
Glory
Member

Откуда:
Сообщений: 104751
jarrhead
т.е. получается что Февральская дата больше чем Мартовская. как такое может быть???

Получается, что вы отсылаете дату преобразованную в какую-то строку
20 мар 12, 16:53    [12282797]     Ответить | Цитировать Сообщить модератору
 Re: при запросе в промежутке дат февраль идет после марта  [new]
jarrhead
Member

Откуда:
Сообщений: 25
преобразований нет. в DateTimePicker вводится именно дата. если добавить принудительное преоразование Convert.ToDateTime, то выводит ошибку.
20 мар 12, 16:58    [12282836]     Ответить | Цитировать Сообщить модератору
 Re: при запросе в промежутке дат февраль идет после марта  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
jarrhead
преобразований нет. в DateTimePicker вводится именно дата. если добавить принудительное преоразование Convert.ToDateTime, то выводит ошибку.


а чего вы ждете от такого запроса?

AND date <= '" + enddatetimepicker.SelectedDate.Date.TimeOfDay + "' "


Параметры используйте и преобразование в датетайм
20 мар 12, 16:59    [12282854]     Ответить | Цитировать Сообщить модератору
 Re: при запросе в промежутке дат февраль идет после марта  [new]
jarrhead
Member

Откуда:
Сообщений: 25
Гавриленко Сергей Алексеевич
И какой же текст запроса ваша вебчасть отсылает на сервер?

в смысле?
конкретно на кнопке висит такой код
        protected void Search_Click(object sender, EventArgs e)
        {
            DataSet dataSet = null;
            string sql = "SELECT * FROM KPP WHERE id = '" + (txtID.Text) + "' " +  "AND date <= '" + enddatetimepicker.SelectedDate.Date.TimeOfDay + "' ";

            //Get Data
            using (SqlConnection conn = new SqlConnection("Data Source = localhost; Initial Catalog = portal; Integrated Security = SSPI"))
            {
                try
                {
                    conn.Open();
                    SqlDataAdapter adapter = new SqlDataAdapter(sql, conn);
                    dataSet = new DataSet("root");
                    adapter.Fill(dataSet, "KPP");
                }
                catch (SqlException x)
                {
                    messages.Text = x.Message;
                }
                catch (Exception x)
                {
                    messages.Text = x.Message;
                }
            }

            //Bind Data
            try
            {
                grid.DataSource = dataSet;
                grid.DataMember = "KPP";
                grid.DataBind();
            }
            catch (Exception x)
            {
                messages.Text += x.Message;
            }
        }
20 мар 12, 17:01    [12282865]     Ответить | Цитировать Сообщить модератору
 Re: при запросе в промежутке дат февраль идет после марта  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
jarrhead
получается что Февральская дата больше чем Мартовская. как такое может быть???
'28.02.2012' > '12.03.2012'
Ведь это правильно же?!
Это для Вас там февраль и март, а для сервера это две строки.
Однако, если писать год/месяц/день в правильном порядке (от больших единиц к меньшим слева направо),
то и строки будут правильно сравниваться. Например:
'2012-02-28' < '2012-03-12'
Правильнее же всего сравнивать между собой величины типа даты-времени:
CAST('20120228' AS DATETIME) < CAST('20120312' AS DATETIME)
20 мар 12, 17:02    [12282873]     Ответить | Цитировать Сообщить модератору
 Re: при запросе в промежутке дат февраль идет после марта  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
jarrhead
конкретно на кнопке висит такой код
Ваш код на кнопке никому не интересен. Интересен тот запрос, который этот код отправляет на сервер.
20 мар 12, 17:02    [12282876]     Ответить | Цитировать Сообщить модератору
 Re: при запросе в промежутке дат февраль идет после марта  [new]
jarrhead
Member

Откуда:
Сообщений: 25
Winnipuh
jarrhead
преобразований нет. в DateTimePicker вводится именно дата. если добавить принудительное преоразование Convert.ToDateTime, то выводит ошибку.


а чего вы ждете от такого запроса?

AND date <= '" + enddatetimepicker.SelectedDate.Date.TimeOfDay + "' "


Параметры используйте и преобразование в датетайм


при Convert.ToDateTime(enddatetimepicker.SelectedDate.Date.TimeOfDay) выдает ошибку Unable to cast object of type 'System.TimeSpan' to type 'System.IConvertible'.
20 мар 12, 17:03    [12282884]     Ответить | Цитировать Сообщить модератору
 Re: при запросе в промежутке дат февраль идет после марта  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 3058
Вы дату передаёте строкой
и результат зависит от настроек сервера

к примеру
'02/12/2012'
'03/02/2012'

какая дата больше? Вот именно при определенных настройках вторая, т.к это 2 марта, а первая - 12 февраля

конвертите значение пикера в формат YYYYMMDD - стандарт для SQL
20 мар 12, 17:03    [12282885]     Ответить | Цитировать Сообщить модератору
 Re: при запросе в промежутке дат февраль идет после марта  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 3058
конвертируйте примерно итак (за синтаксис не отвечаю)

AND date <= '" + string.format(enddatetimepicker.SelectedDate, "YYYYMMDD") + "'...



а лучше, как говорили, используйте параметры
20 мар 12, 17:06    [12282901]     Ответить | Цитировать Сообщить модератору
 Re: при запросе в промежутке дат февраль идет после марта  [new]
jarrhead
Member

Откуда:
Сообщений: 25
Поясните пожалуйста, я не понимаю. Сравниваются 2 значения типа DateTime. это же не строки и не числа. одно больше другого, независимо от того в каком виде ты эту дату видишь. или я не прав? если не прав, то объясните, плиз
20 мар 12, 17:09    [12282931]     Ответить | Цитировать Сообщить модератору
 Re: при запросе в промежутке дат февраль идет после марта  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 3058
запрос к серверу - это просто текст и, конечно же, там нет никакого DateTime, есть просто набор символов
а как эти символы интерпритируются сервером - зависит от настроек
20 мар 12, 17:14    [12282975]     Ответить | Цитировать Сообщить модератору
 Re: при запросе в промежутке дат февраль идет после марта  [new]
Glory
Member

Откуда:
Сообщений: 104751
jarrhead
Сравниваются 2 значения типа DateTime.

Вы сравниваете строки
Потому что у вас значение в кавычках в тексе запроса
Вы не видите кавычек что ли ?
20 мар 12, 17:15    [12282985]     Ответить | Цитировать Сообщить модератору
 Re: при запросе в промежутке дат февраль идет после марта  [new]
jarrhead
Member

Откуда:
Сообщений: 25
понял. подскажите тогда, пожалуйста. как сконвертировать значения с пикера в нужный формат?
20 мар 12, 17:16    [12283001]     Ответить | Цитировать Сообщить модератору
 Re: при запросе в промежутке дат февраль идет после марта  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 3058
12282901
20 мар 12, 17:18    [12283014]     Ответить | Цитировать Сообщить модератору
 Re: при запросе в промежутке дат февраль идет после марта  [new]
jarrhead
Member

Откуда:
Сообщений: 25
спасибо за помощь, буду пробовать
20 мар 12, 17:21    [12283046]     Ответить | Цитировать Сообщить модератору
 Re: при запросе в промежутке дат февраль идет после марта  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
jarrhead,
А может все таки сделать по-человечески? Через параметризированный запрос с правильными типами.
Кто мне помешает ввести в ваше поле ID скажем такой текст?
'; DROP TABLE KPP --

Что выполнится на сервере как:
SELECT * FROM KPP WHERE id = ''; DROP TABLE KPP -- AND date <= '20120312' 
21 мар 12, 03:04    [12285245]     Ответить | Цитировать Сообщить модератору
 Re: при запросе в промежутке дат февраль идет после марта  [new]
jarrhead
Member

Откуда:
Сообщений: 25
еще раз прошу помощи. наваял вот это
            string sql = string.Format("SELECT * FROM KPP WHERE id = @ID AND date >= @startdate and date <= @enddate");
            SqlConnection conn = new SqlConnection("Data Source = localhost; Initial Catalog = portal; Integrated Security = SSPI");
            conn.Open();
            using (SqlCommand cmd = new SqlCommand(sql, conn))
            {
                SqlParameter param = new SqlParameter();
                param.ParameterName = "@ID";
                param.Value = txtID.Text;
                param.SqlDbType = SqlDbType.VarChar;
                param.Size = 40;
                cmd.Parameters.Add(param);

                param = new SqlParameter();
                param.ParameterName = "@startdate";
                param.Value = Convert.ToDateTime(startdatetimepicker.SelectedDate.Date);
                param.SqlDbType = SqlDbType.DateTime;
                cmd.Parameters.Add(param);

                param = new SqlParameter();
                param.ParameterName = "@enddate";
                param.Value = Convert.ToDateTime(enddatetimepicker.SelectedDate.Date);
                param.SqlDbType = SqlDbType.DateTime;
                cmd.Parameters.Add(param);

                cmd.ExecuteNonQuery();

            }
            conn.Close();


при нажатии на кнопку пишет "Необходимо объявить скалярную переменную "@ID".The IListSource does not contain any data sources."
помогите, плиз, найти ошибку
21 мар 12, 16:15    [12289417]     Ответить | Цитировать Сообщить модератору
 Re: при запросе в промежутке дат февраль идет после марта  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
давно не программил на С#
может ?
jarrhead
param.Value = txtID.Text;
param.SqlDbType = SqlDbType.VarChar;
param.Size = 40;

махнуть на
param.SqlDbType = SqlDbType.Int;
param.Value = Convert.ToInt32( txtID.Text);
или поле ID в базе строкового типа?
А че сейчас модно присваивать значение параметру,а потом говорить какого он типа?
21 мар 12, 16:33    [12289577]     Ответить | Цитировать Сообщить модератору
 Re: при запросе в промежутке дат февраль идет после марта  [new]
jarrhead
Member

Откуда:
Сообщений: 25
denis2710
давно не программил на С#
может ?
jarrhead
param.Value = txtID.Text;
param.SqlDbType = SqlDbType.VarChar;
param.Size = 40;

махнуть на
param.SqlDbType = SqlDbType.Int;
param.Value = Convert.ToInt32( txtID.Text);
или поле ID в базе строкового типа?
А че сейчас модно присваивать значение параметру,а потом говорить какого он типа?



ID - набор цифр и букв длиной до 40.
а вообще похожий пример нашел у Троелсена в большой и умной книге. там тип указан после присваивания.
21 мар 12, 16:39    [12289624]     Ответить | Цитировать Сообщить модератору
 Re: при запросе в промежутке дат февраль идет после марта  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
Глянул Троелсена, он пишет где как :) будем думать дальше
21 мар 12, 16:44    [12289676]     Ответить | Цитировать Сообщить модератору
 Re: при запросе в промежутке дат февраль идет после марта  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
Исчо вопрос
зачем делать select c
cmd.ExecuteNonQuery(); ?
21 мар 12, 17:09    [12289903]     Ответить | Цитировать Сообщить модератору
 Re: при запросе в промежутке дат февраль идет после марта  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
jarrhead ,пробовали ловить,что программа отправляет на сервер с помощью SQL Server Profiler?
21 мар 12, 17:12    [12289930]     Ответить | Цитировать Сообщить модератору
 Re: при запросе в промежутке дат февраль идет после марта  [new]
jarrhead
Member

Откуда:
Сообщений: 25
вы правы. не подумав слизал с книги. cmd.ExecuteNonQuery(); не нужен.
убрал, ошибка все равно появляется
21 мар 12, 17:14    [12289958]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить