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

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

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.03.2018, 14:42   #1
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию Запрос к MS ACCESS возращает не ожидаемый результат

Имеется запрос access
Код:
SELECT 
        SHPRGР AS TYPE, 
        Sum(AMOUNT) AS KILK, 
        Sum(OrderCost) AS WART
FROM qSales
GROUP BY SHPRGР
ORDER BY SHPRGР DESC;
результат работы
Код:
TYPE	KILK	WART
LD	39642	3568741,47
HD	2196	704024,18
в VS2015 код
Код:
using System.Data.OleDb;
...
private static OleDbConnection connection = new OleDbConnection
        {
            ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=tgdb.accdb;" +
                                "Jet OLEDB:Database Password = pwd;"
        };
...
private void GetData()
{
           OleDbCommand command = new OleDbCommand
            {
                Connection = connection
            };
           string SQL =  @"SELECT " +
                                    @"SHPRGР AS TYPE, " +
                                    @"Sum(AMOUNT) AS KILK, " +
                                    @"Sum(OrderCost) AS WART " +
                              @"FROM qSales " +
                              @"GROUP BY SHPRGР " + 
                              @"ORDER BY SHPRGP DESC;";
                        command.Connection = connection;
                        command.CommandText = SQL;
                        using (dbReader = command.ExecuteReader())
                        {
                            if (dbReader.HasRows)
                            {
                                while (dbReader.Read())
                                {
                                    string answer = $"{dbReader[0]} : {dbReader[1]}, {dbReader[2]} ";
                                    Console.WriteLine(answer);
                                
                                }
                            }
                            else // пустий результат
                            {
                                
                            } 
                        }
        connection.Close();
}
ожидаю в результате такие же данные как в Access, а получаю
Код:
LD : 41838, 4272765,65
т.е. 1-е значение ОК.
2-е, 3-е - как сумма нужных значений.
Где ошибка?
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.
Aleksandr H. вне форума Ответить с цитированием
Старый 15.03.2018, 23:09   #2
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию

Записал киношку, вдруг так кто подскажет
https://youtu.be/46bucc8aeyI
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.
Aleksandr H. вне форума Ответить с цитированием
Старый 16.03.2018, 07:36   #3
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,520
По умолчанию

На баг похоже. Если текст запроса SalesByType скопировать, то он правильно отработает или тоже просуммирует?
pu4koff вне форума Ответить с цитированием
Старый 16.03.2018, 09:48   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

забыли
Код:
reader.NextResult();
см. на оф.сайте (Retrieving Multiple Result Sets using NextResult)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 16.03.2018, 11:07   #5
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию

Цитата:
Сообщение от pu4koff Посмотреть сообщение
Если текст запроса SalesByType скопировать, то он правильно отработает или тоже просуммирует?
тоже суммирует

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
(Retrieving Multiple Result Sets using NextResult)
я видел, читал
Цитата:
If multiple result sets are returned, the DataReader provides the NextResult method to iterate through the result sets in order.
понял применяется если одной коммандой передаю 2 или больше запроса. Пробовал NextResult и в While и после и пред. Ничего.
Может надо как-то умудриться запустить сохраненный запрос в аксессе который сохранить данные в таблицу и читать таблицу? Таблица читается нормально.

из студии следующий код создает просуммированую таблицу
Код:
SQL = "SELECT SalesByTYPE.* INTO [tmp] FROM SalesByTYPE";
OleDbCommand cmd = new OleDbCommand(SQL, conn);
cmd.ExecuteNonQuery();
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.
Aleksandr H. вне форума Ответить с цитированием
Старый 16.03.2018, 11:18   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от Aleksandr H. Посмотреть сообщение
Пробовал NextResult и в While и после и пред. Ничего.
покажите код.

надеюсь, не забыли заменить if на whle ?!!

Код:
        while (reader.HasRows) ...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 16.03.2018, 11:18   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

А если представление сделать? C 2007-го вроде можно
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 16.03.2018, 12:11   #8
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
не забыли заменить if на whle ?!!
код такой
Код:
while (reader.HasRows)
{
	while (reader.Read())
	{
		answer = $"{reader[0]} :\t{reader[1]} шт,\t{reader[2]} грн.\n";
		Console.WriteLine(answer);
		await BOT.SendTextMessageAsync(message.Chat.Id, answer);
	}
	reader.NextResult(); 
}
Цитата:
Сообщение от Аватар Посмотреть сообщение
А если представление сделать?
Не делал никогда. Спросил docs.microsoftПопробовал в accesse: В конструкторе прописать
Код:
CREATE VIEW myView (myTYPE, myKILK, myWART)as SELECT FROM SalesByTYPE;
или в модуле
Код:
Function CreateView()
    DoCmd.RunSQL "CREATE VIEW myView (myTYPE, myKILK, myWART)as SELECT FROM SalesByTYPE;"
End Function
ошибка "Ошибка синтаксиса в инструкции CREATE TABLE"
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.
Aleksandr H. вне форума Ответить с цитированием
Старый 16.03.2018, 13:24   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от Aleksandr H. Посмотреть сообщение
код такой
ну да, вроде всё верно
Serge_Bliznykov вне форума Ответить с цитированием
Старый 16.03.2018, 13:41   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Не, создается примерно так в ACCESS и только один раз, как таблица:
Код:
CREATE VIEW myView (TYPE, KILK, WART) AS
  SELECT SHPRGР AS TYPE,Sum(AMOUNT) AS KILK,Sum(OrderCost) AS WART
    FROM qSales 
    GROUP BY SHPRGР
И сам запрос:
Код:
SELECT TYPE, KILK, WART FROM myView ORDER BY TYPE DESC
так, на всякий случай ))
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
CreateDialogParam возращает 0 mikado3333 Win Api 2 16.05.2016 07:27
Сложный запрос и Непредсказуемый результат (проблема с MySQL) Jopses SQL, базы данных 6 28.01.2013 16:15
Запрос выдает неверный результат Sergio_O БД в Delphi 14 13.01.2011 12:17
Запрос с датами и временем к Access [D7, Access] alexandr2010 БД в Delphi 3 26.07.2010 22:19
post запрос, результат разбить на строки Kukkk Общие вопросы Delphi 2 20.08.2009 17:01