Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Базы данных (ADO.NET, LinqToSql, ORM Entity Framework, NHibernate)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.08.2010, 21:33   #1
bill
Форумчанин
 
Аватар для bill
 
Регистрация: 26.04.2007
Сообщений: 440
Восклицание Oracle и C#. Сравнение дат.

Здравствуйте.
Моя проблема: В БД Oracle есть таблица Cards_journal2.
Ее структура:
Name Null? Type
----------------------------------------- -------- ------------------------
CARD_ID NOT NULL NUMBER(15)
CHANGE_MONEY NOT NULL NUMBER(5)
CHANGE_DATE NOT NULL DATE
CASH_MACH_NUMB NOT NULL NUMBER(15)

Мне надо выбрать те значения CHANGE_MONEY, дата которых - CHANGE_DATE - входит в определенный промежуток.

Код:
private void Connect_Database(DateTime timef,DateTime timel)
        {
 OleDbCommand select;
            if (timef != timel)
          select = new OleDbCommand("select CHANGE_MONEY Money,CHANGE_DATE Data from cards_journal2
where (CHANGE_DATE>'" + timef.ToString("d", CultureInfo.CreateSpecificCulture("de-DE")) + "')
and (CHANGE_DATE<'" + timel.ToString("d", CultureInfo.CreateSpecificCulture("de-DE")) + "')", cash.Connection);
    else
                select = new OleDbCommand("select CHANGE_MONEY Money,CHANGE_DATE Data from cards_journal2", cash.Connection);

            cash.DataAdapter = new OleDbDataAdapter();
            select.Connection = cash.Connection;
            cash.DataAdapter.SelectCommand = select;
            if (!cash.Dataset.Tables.Contains("CJ"))
                cash.Dataset.Tables.Add("CJ");
            else cash.Dataset.Tables["CJ"].Clear();
            cash.DataAdapter.Fill(cash.Dataset.Tables["CJ"]);
           dataGridView1.DataSource = cash.Dataset.Tables["CJ"];
           dataGridView1.ReadOnly = true;
}
У меня в БД есть данные за сегодняшнее число. И если timef - вчерашнее число, а timel- завтрашнее, код не работает. Но самое интересное, если сделать брейкпоинт на последней строке и посмотреть,скопировать содержимое CommandText команды select(т.е готовый запрос) в Sql Plus, то этот запрос работает. В чем косяк - не знаю.

П.с Формат даты в Oracle стоит - "DD.MM.YYYY".
bill вне форума Ответить с цитированием
Старый 13.08.2010, 21:51   #2
tavrocotaps
Пользователь
 
Аватар для tavrocotaps
 
Регистрация: 16.08.2008
Сообщений: 56
По умолчанию

попробуй начать с человеческого написания запроса, т.е.
Код:
SELECT c.CHANGE_MONEY Money, c.CHANGE_DATE Data 
FROM cards_journal2 c
WHERE c.CHANGE_DATE BETWEEN to_date('<первая дата>','dd.mm.yyyy') AND
to_date('<вторая дата>','dd.mm.yyyy')

<первая дата>,<вторая дата> - строковые представления дат(в одинарных кавычках,как показано в запросе)
forever trusting who we are...
tavrocotaps вне форума Ответить с цитированием
Старый 14.08.2010, 06:38   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

добавлю.
обычно проблемы с преобразованием типов даты/времени элементарно решаются через использование параметрических запросов.
Код:
SELECT c.CHANGE_MONEY Money, c.CHANGE_DATE Data 
FROM cards_journal2 c
WHERE c.CHANGE_DATE BETWEEN @p1 and @p2
потом задаёте эти параметры через
Код:
 
 select.Parameters.AddWithValue("@p1", timef);
 select.Parameters.AddWithValue("@p2", timel);
// где timef и timel — это Ваши переменные типа DateTime

Последний раз редактировалось Serge_Bliznykov; 14.08.2010 в 06:46.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 18.08.2010, 20:11   #4
bill
Форумчанин
 
Аватар для bill
 
Регистрация: 26.04.2007
Сообщений: 440
По умолчанию

Мужики, спасибо. Плюсанул обоих

Рабочий код:
Код:
private void Connect_Database(DateTime timef,DateTime timel)
        {

       /*     BindingSource bindingSource1 = new BindingSource();
            OleDbCommand select = new OleDbCommand("select * from cards_journal2",cash.Connection);
            OleDbDataAdapter data = new OleDbDataAdapter();
            data.SelectCommand = select;
            DataTable table = new DataTable();
           data.Fill(table);
            bindingSource1.DataSource =table;
            dataGridView1.DataSource = bindingSource1; */

            /*
            OleDbCommand select = new OleDbCommand("select CHANGE_MONEY,CHANGE_DATE from cards_journal2", cash.Connection);
            OleDbDataAdapter data = new OleDbDataAdapter();
            data.SelectCommand = select;
            DataTable table = new DataTable();
            data.Fill(table);
            dataGridView1.DataSource = table; */

            /*
            OleDbCommand select = new OleDbCommand("select CHANGE_MONEY Деньги,CHANGE_DATE Дата from cards_journal2", cash.Connection);
            OleDbDataAdapter data = new OleDbDataAdapter();
            data.SelectCommand = select;
            DataTable table = new DataTable();
            data.Fill(table);
            dataGridView1.DataSource = table; */

            MessageBox.Show(timef.ToString());
            MessageBox.Show(timel.ToString());

            OleDbCommand select;
            if (timef != timel)
               // select = new OleDbCommand("select * from cards_journal2 where CHANGE_DATE between '01.02.10' and '12.08.10'", cash.Connection);
                // select = new OleDbCommand("select CHANGE_MONEY Деньги,CHANGE_DATE Дата from cards_journal2 where CHANGE_DATE between '" + timef.ToString("dd.MM.yy") + "' and '" + timel.ToString("dd.MM.yy") + "'", cash.Connection);
                //select = new OleDbCommand("select CHANGE_MONEY Деньги,CHANGE_DATE Дата from cards_journal2 where CHANGE_DATE between '" + Convert.ToString(timef) + "' and '" + Convert.ToString(timel)+"'", cash.Connection);
                //  select = new OleDbCommand("select CHANGE_MONEY Money,CHANGE_DATE Data from cards_journal2 where (CHANGE_DATE>'11.08.2010 12.00.00') and (CHANGE_DATE<'13.08.2010 12.00.00')", cash.Connection);
                //select = new OleDbCommand("select CHANGE_MONEY Money,CHANGE_DATE Data from cards_journal2 where (CHANGE_DATE>'" + timef.ToString("d", CultureInfo.CreateSpecificCulture("de-DE")) + "') and (CHANGE_DATE<'" + timel.ToString("d", CultureInfo.CreateSpecificCulture("de-DE")) + "')", cash.Connection);
               // select = new OleDbCommand("select * from cards_journal2 where(TO_CHAR(CHANGE_DATE)<'" + timel.ToString("d", CultureInfo.CreateSpecificCulture("de-DE")) + "')", cash.Connection);
                select = new OleDbCommand(" SELECT c.CHANGE_MONEY Money, c.CHANGE_DATE Data  FROM cards_journal2 c  WHERE c.CHANGE_DATE BETWEEN to_date('" + timef.ToString("d", CultureInfo.CreateSpecificCulture("de-DE")) + "','dd.mm.yyyy') AND to_date('" + timel.ToString("d", CultureInfo.CreateSpecificCulture("de-DE")) + "','dd.mm.yyyy')", cash.Connection);
            else
                select = new OleDbCommand("select CHANGE_MONEY Money,CHANGE_DATE Data from cards_journal2", cash.Connection);
          //  select = new OleDbCommand("select * from cards_journal2", cash.Connection);
          //  select = new OleDbCommand("select * from cards_journal2", cash.Connection);
          //  select = new OleDbCommand("select * from cards_journal2 where CHANGE_DATE between '01.01.10' and '09.09.10'", cash.Connection);


            select.Parameters.Add(":CARD_ID", OleDbType.Integer, 0, "CARD_ID");
            select.Parameters.Add(":CHANGE_MONEY", OleDbType.Integer, 0, "CHANGE_MONEY");
            select.Parameters.Add(":CHANGE_DATE", OleDbType.Date, 0, "CHANGE_DATE");
            select.Parameters.Add(":CASH_MACH_NUMB", OleDbType.Integer, 0, "CASH_MACH_NUMB");

            OleDbDataReader dat = select.ExecuteReader();
            while (dat.Read())
            {
               MessageBox.Show(dat[0].ToString());
            }
            dat.Close();


            cash.DataAdapter = new OleDbDataAdapter();
            select.Connection = cash.Connection;
            cash.DataAdapter.SelectCommand = select;
            if (!cash.Dataset.Tables.Contains("CJ"))
                cash.Dataset.Tables.Add("CJ");
            else cash.Dataset.Tables["CJ"].Clear();
            cash.DataAdapter.Fill(cash.Dataset.Tables["CJ"]);
          //  dataGridView1.DataSource = null;
          //  dataGridView1.Rows.Clear();
           dataGridView1.DataSource = cash.Dataset.Tables["CJ"];
           dataGridView1.ReadOnly = true;
           

        }
bill вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сравнение дат! RSmile БД в Delphi 0 28.04.2010 20:40
сравнение дат Алёна Microsoft Office Excel 8 03.07.2009 10:47
C#: Сравнение дат Veiron Общие вопросы .NET 1 08.06.2009 23:32
Сравнение дат for_regist1 БД в Delphi 21 26.01.2009 01:29
сравнение дат Geddar Общие вопросы Delphi 2 04.06.2008 19:09