Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696

Задать формат данных, полученных из БД

05.04.2015, 02:50. Показов 2344. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Запрашиваю из MS SQL данные и заполняю ими DataGridView. Столкнулся с неприятным поведением.
Запрос группирует данные и отдаёт табличку с суммами (число с дробной частью) по каждой группе. Я эту табличку отдаю в DataGridView. Проблема в том, что, например, сумма равна 65, а в таблице может быть написано 64.99999999 или сумма равна 23.35, а выведет 23.3499999. Это проявляется не во всех строках. Подскажите, как мне или заставить SQL-код выдавать числа в формате "хх.ххх" или уже столбец в контролле выводиться в этом формате и не теряя значений?
P.S. - я то понимаю, что плавающая точка и т.д., то заказчиков это пугает. Учитывая, что они туда вводили суммы денег (т.е. максимум было 2 числа после запятой, а в сумме дало много чисел там же).
Благодарю за внимание!

Добавлено через 16 минут
Заметил ещё одну особенность. Выполняю этот же SQL-код, кладу результаты в тот же DataTable и просто вывожу оттуда значение этой ячейки со странным поведением.
C#
1
2
3
DataTable dt = AdministratorData.Server.GetOrdersForPeriod(id, start, end).Result as DataTable;
this.dataGridViewOperatorClientsList.DataSource = dt;
MessageBox.Show(dt.Rows[0][2].ToString());
Там, где в DataGridView выводится 23.3499999, в DataTable лежит 23.35. Значит это ГридВью меняет формат вывода. Как это исправить?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.04.2015, 02:50
Ответы с готовыми решениями:

Задать стили для полученных данных из javaScript
Добрый день! Есть такая функция которая выводит результат простого сложения. myBtn.onclick = function() { var a =...

Задать формат ячеек Excel при выводе данных из DataGridView
Необходимо сделать текстовый формат всех ячеек в эксле перед выводом данных в него. Данные в эксель выводятся из DataGridView данные...

Как задать нужный формат вывода данных в log-файл?
Есть такой лог: 2016-08-08 22:38:53.986 War 8 и вот формат должен быть таким: Предполагаю,что как-то должен делать через...

10
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
05.04.2015, 09:09
body90, в базе данных используется тип Decimal? Если нет, то используйте именно его, он специально предназначен для денежных сумм.
1
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
06.04.2015, 02:47  [ТС]
insite2012, нет. Используется Float. Данная база уже находится в эксплуатации. Я лишь доделываю некоторые отчёты. Не уверен, что можно менять тип столбца в уже доаольно заполненной базе.
Не понимаю, почему именно DataGridView так коверкает вывод числа. Ведь в отладчике или просто выводя значение в MessageBox всё отображается корректно.
Ещё странно то, что это несёт не постоянный характор. В одном и том же столбце некоторые значения выведены вот так искорёжены, но большинство отображаются в полном порядке и так, как от них ожидается.
0
 Аватар для kodv
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
06.04.2015, 05:22
Цитата Сообщение от body90 Посмотреть сообщение
Используется Float
Цитата Сообщение от body90 Посмотреть сообщение
я то понимаю, что плавающая точка и т.д
Ну ведь сами же все понимаете. Значит про Float объяснять не буду.
Цитата Сообщение от body90 Посмотреть сообщение
Данная база уже находится в эксплуатации.
Я предлагаю сделать куклу Вуду, прилепить туда что-нибудь от создателя базы, и истыкать ее нафиг всю иголками. Если есть возможность, то можно разработчикам руки отрубить, чтобы они больше такое @#$ были не в состоянии вытворить. Тип данных float НЕЛЬЗЯ использовать для хранения финансовых величин. В MS SQL Server для этого есть специальный тип MONEY.
Цитата Сообщение от body90 Посмотреть сообщение
Не уверен, что можно менять тип столбца в уже доаольно заполненной базе.
T-SQL
1
ALTER TABLE MyTable ALTER COLUMN MyFloatColumn MONEY
И будет счастье.
Цитата Сообщение от body90 Посмотреть сообщение
Не понимаю, почему именно DataGridView так коверкает вывод числа. Ведь в отладчике или просто выводя значение в MessageBox всё отображается корректно.
Отладчик и MessageBox эту сумму округляют до определенного количества знаков после запятой, а DataGridView по умолчанию не хочет. По-моему, точность отображения для столбца можно изменить. А вообще, все выражено в следующей фразе:
Цитата Сообщение от body90 Посмотреть сообщение
я то понимаю, что плавающая точка и т.д.
1
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
07.04.2015, 03:03  [ТС]
Цитата Сообщение от kodv Посмотреть сообщение
T-SQL
1
ALTER TABLE MyTable ALTER COLUMN MyFloatColumn MONEY
Вопрос, скорее, не в том, как изменить тип, а в том, на сколько безопасно такое изменение для уже имеющихся данных. У меня не было опыта в преобразовании типов уже заполненных столбцов.
0
 Аватар для kodv
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
07.04.2015, 03:46
body90, Вам никто не мешает развернуть резервную копию базы данных, изменить тип там, проверить работоспособность вашего отчета на копии и, после того, как убедитесь в безпасности, перенести решение на рабочую базу. В вашем случае (не более двух знаков после запятой) преобразование никаких негативных последствий вызвать не должно. Единственный нюанс, что во всех клиентских приложениях будет продолжать ожидаться значение данного столбца типа Float. Нужно будет, естественно, тоже исправлять.
1
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
07.04.2015, 04:10  [ТС]
kodv, а Money и Smallmoney в какой CLR-тип преобразовуется, когда я его вытащу из базы в переменную? Decimal?
Цитата Сообщение от kodv Посмотреть сообщение
проверить работоспособность вашего отчета на копии
А как мне убедиться, что вместо плавающих 123,45, я где-то не получил денежные 12345, 1,2345 или ещё хуже 123,4499? Я же на глаз не смогу проверить тысячи строк.
А отчёты должны будут работать, т.к. при выходе с базы сразу прописаны явные преобразования типов. Небольшие значения, теоретически, должны спокойно преобразовываться из Decimal в Float-переменные. Но всё хорошо проверить всё равно стоит.
0
 Аватар для kodv
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
07.04.2015, 04:20
Цитата Сообщение от body90 Посмотреть сообщение
а Money и Smallmoney в какой CLR-тип преобразовуется, когда я его вытащу из базы в переменную? Decimal?
По-моему, да.
Цитата Сообщение от body90 Посмотреть сообщение
А как мне убедиться, что вместо плавающих 123,45, я где-то не получил денежные 12345 или 1,2345?
T-SQL
1
2
3
4
5
SELECT *
    FROM MyBase..MyTable t
        JOIN MyBase_Test..MyTable tt
            ON tt.MyId = t.MyId
                AND tt.MyField <> t.MyField
Этим запросом вы увидите все записи, в которых значения вашего полей до и после преобразования будут отличаться. Если преобразование прошло удачно, то запрос вернет пустой набор данных.
1
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
07.04.2015, 04:46  [ТС]
А tt.MyField <> t.MyField не в WHERE, разве, должно быть?
Цитата Сообщение от kodv Посмотреть сообщение
Этим запросом вы...
Спасибо! Что-то сразу, в полусонном состоянии, не дошло такой вариант рассмотреть.

Добавлено через 9 минут
Ещё сопутствующий вопрос.
Используется бесплатная версия MSSQL, а она ограничена в размерах.
По отдельности в ячейках лежат не большие значения (максимум 2-3 сотни), так что можно было бы использовать и Smallmoney. Но вот для статистики нужно получать суммы за разные промежутки. Ничего не будет, если сама сумма, подсчитанная запросом, превысит максимальное значение Smallmoney? Обратно в базу эта сумма писать не будет.
Да и вообще, какой из двух типов посоветуете?
0
 Аватар для kodv
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
07.04.2015, 05:09
Цитата Сообщение от body90 Посмотреть сообщение
А tt.MyField <> t.MyField не в WHERE, разве, должно быть?
Я бы слово должно не употреблял в данном случае. Оно может быть в WHERE, может быть в JOIN'е. Так как JOIN по умолчанию INNER, то результат запроса от этого не изменится. Дело вкуса. Я предпочитаю, по возможности, все условия, которые касаются двух присоединяемых таблиц, запихивать в JOIN, чтобы потом мне было проще смотреть, какие условия к каким таблицам относятся.

Добавлено через 14 минут
Цитата Сообщение от body90 Посмотреть сообщение
Да и вообще, какой из двух типов посоветуете?
SMALLMONEY, по моему, имеет диапазон значений до примерно 215 тысяч условных единиц. При текущем положении на валютном рынке и рынке нефти лично я бы не стал ограничиваться типом SMALLMONEY.
Цитата Сообщение от body90 Посмотреть сообщение
Ничего не будет, если сама сумма, подсчитанная запросом, превысит максимальное значение Smallmoney?
Такое выражение выдает ошибку арифметического переполнения:
T-SQL
1
SELECT CAST(200000 AS SMALLMONEY) + CAST(100000 AS SMALLMONEY)
Так что прийдется при суммировании делать явный CAST к MONEY, чтобы такой ошибки не возникало.
Цитата Сообщение от body90 Посмотреть сообщение
Используется бесплатная версия MSSQL, а она ограничена в размерах.
У MS SQL Server 2014 Express ограничение размера 10 ГБНеужели этого настолько мало, чтобы экономить на типе SMALLMONEY? Если есть реальный риск быстро перерасти эти ограничения, то вы их перерастете в любом случае, просто со SMALLMONEY чуть позже, но это чуть будет далеко не двукратное.
1
0 / 0 / 1
Регистрация: 09.09.2014
Сообщений: 30
29.07.2016, 15:25
Столкнулся с похожей проблемой. Какого типа у вас переменная суммы? Если float, то замените ее на double.
Все дело в соответствии типов, читаем msdn: https://msdn.microsoft.com/ru-... .110).aspx
float в SQL это double в .Net.
Вам наверное уже не актуально, но может кому пригодиться.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.07.2016, 15:25
Помогаю со студенческими работами здесь

Задать для значения переменной формат и из введенных данных выделить часть
Разработать класс Cust (арендатор), содержащий следующие поля: id (ИНН арендатора), name (название арендатора), address (адрес...

Как задать формат
Есть файл csv, мне надо сохранить в формате xlsx, но не знаю какой поставить формат? Workbooks.Application.DisplayAlerts = False ...

Задать формат рисунка
Вставляю в колонтитулы рисунок: ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageHeader Selection.InlineShapes.AddPicture...

задать формат программно
добрый день.ни как не могу найти как задать в Excel формат ячейки.дело в том что данные записываются из Access. нашел как переносить слова...

Задать формат даты
Заданная строка символов, содержащая дату в форме &quot;ММ / ДД / ГГ '. Превратить его к виду &quot;день месяц год&quot;. Например, если задано...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru