Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
2 / 2 / 0
Регистрация: 18.04.2014
Сообщений: 60

Замена запятой на точку в SQL запросе

06.10.2021, 17:10. Показов 2925. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Есть SQL запрос на занесение данных в таблицу:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
string myCommandText = "INSERT INTO ProductName " +
                    "(ID, parID, ParID2, groupID, part_level, parent, part_name, isChild, quantity, intD, outD, length, mass) " +
                    "VALUES (" 
                    + IDVal + ", "
                    + parIDVal + ", "
                    + ParID2Val + ", "
                    + groupIDVal + " , "
                    + part_levelVal + " , "
                    + parentVal + " , "
                    + part_nameVal + ", "
                    + isChildVal + ", "
                    + quantityVal + ", "
                    + intDVal + ", "
                    + outDVal + ", "
                    + lengthVal + ", "
                    + massVal + ")";
Часть значений - десятичные дроби, которые в запросе в итоге разделяются запятыми. В итоге запрос воспринимает эти запятые как разделение разных значений и этих значений становится больше, чем столбцов. В результате - исключение, конечно.
Как можно решить эту проблему?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.10.2021, 17:10
Ответы с готовыми решениями:

Замена запятой на точку
Совсем маленький "зацеп". Несколько лет назад все работало как положено. А сегодня перестало. Точку на запятую меняет. Все в порядке. По...

Замена запятой на точку
<script type="text/javascript"> function calculate() { var price = 0; var price_new = 0; var...

Замена запятой на точку
Здравствуйте! Есть такой файлик. В нем мне надо перемножить два столбика, но проблема в том что вба считает только числа с точкой. А когда...

11
296 / 120 / 33
Регистрация: 06.03.2016
Сообщений: 453
06.10.2021, 22:12
Gaidn, используйте параметры, а не соединение строк. Создаете команду. В ней будет свойство Parameters в него добавляете свои параметры, желательно слева направо, по порядку, как они идут в тексте команды.
1
2 / 2 / 0
Регистрация: 18.04.2014
Сообщений: 60
06.10.2021, 23:34  [ТС]
Цитата Сообщение от ipsorokin Посмотреть сообщение
Gaidn, используйте параметры, а не соединение строк. Создаете команду. В ней будет свойство Parameters в него добавляете свои параметры, желательно слева направо, по порядку, как они идут в тексте команды.
Да, это могло бы решить проблему. Попробую разобраться с параметрами. А пока еще пробую помудрить с CultureInfo.

Добавлено через 9 минут
Сейчас попробовал следующий код:
C#
1
2
3
NumberFormatInfo nfi = new CultureInfo("en-US", false).NumberFormat;
                nfi.NumberGroupSeparator = "";
                nfi.NumberDecimalDigits = 1;
И задавал значение перменной вот так:
C#
1
string quantityVal = (n.quantity).ToString("N", nfi);
В итоге получилось. Но... Access отказался записывать такие значения с точкой, так как ему нужна запятая. ) Остался один путь - использование параметров.)
0
Эксперт .NET
 Аватар для Usaga
14307 / 9388 / 1355
Регистрация: 21.01.2016
Сообщений: 35,405
07.10.2021, 05:59
Цитата Сообщение от Gaidn Посмотреть сообщение
Остался один путь - использование параметров.
Т.е. правильным путём мы идём только после того, как убедились, что работа через задницу не клеится?)
2
2 / 2 / 0
Регистрация: 18.04.2014
Сообщений: 60
07.10.2021, 10:18  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Т.е. правильным путём мы идём только после того, как убедились, что работа через задницу не клеится?)
В целом да, но с нюансом.
Оно почему так выходит? ) Потому что знаний и опыта не хватает. А точнее, потому что их почти нет.)) Если бы сразу умел с параметрами в запросе работать и знал бы их плюсы, то изначально сделал бы как надо. А так, делал так, как умел на тот момент.)
1
2 / 2 / 0
Регистрация: 18.04.2014
Сообщений: 60
07.10.2021, 19:17  [ТС]
Появилась новая проблема...
Почему-то запись в таблицу БД идёт одна и та же.
Не могу понять, из-за чего. Видимо, я опять чего-то не знаю про параметры.) Может их как-то надо каждый раз обновлять, активировать, не знаю...
Код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
myConnection = new OleDbConnection(connectString);
            myConnection.Open();
            OleDbCommand insertCommand = new OleDbCommand();
            OleDbCommand deleteCommand = new OleDbCommand();
            
            insertCommand.Connection = myConnection;
            deleteCommand.Connection = myConnection;
            
            deleteCommand.CommandText = "DELETE FROM ProductName";
            deleteCommand.ExecuteNonQuery();
            foreach (Part n in list)
            {
                int c = n.parID.CompareTo("");
                int c1 = n.parent.CompareTo("");
                int c2 = n.level.CompareTo("");
                int c3 = n.name.CompareTo("");
 
                string boolstatus = (n.isChild==true) ? "TRUE" : "FALSE";
                int IDVal = n.ID;
                string parIDVal = (c==0 ? "NULL" : ("'" + n.parID + "'"));
                int parID2Val = n.parID2;
                int groupIDVal = n.groupID;
                string part_levelVal = (c2 == 0 ? "NULL" : ("'" + n.level + "'"));
                string parentVal = (c1 == 0 ? "NULL" : ("'" + n.parent + "'"));
                string part_nameVal = (c3 == 0 ? "NULL" : ("'" + n.name + "'"));
                int quantityVal = n.quantity;
                double intDVal = n.intD;
                double outDVal = n.outD;
                double lengthVal = n.length;
                double massVal = n.mass;
 
                string myCommandText = "INSERT INTO ProductName " +
                    "(ID, parID, ParID2, groupID, part_level, parent, part_name, quantity, intD, outD, length, mass) " +
                    "VALUES ("
                    + "@ID, "
                    + "@parID, "
                    + "@ParID2, "
                    + "@groupID, "
                    + "@part_level, "
                    + "@parent, "
                    + "@part_name, "
                    + "@quantity, "
                    + "@intD, "
                    + "@outD, "
                    + "@length, "
                    + "@mass)";
 
                MessageBox.Show(myCommandText);
                
 
                OleDbParameter IDParam = new OleDbParameter("@ID", IDVal);
                insertCommand.Parameters.Add(IDParam);
 
                OleDbParameter parIDParam = new OleDbParameter("@parID", parIDVal);
                insertCommand.Parameters.Add(parIDParam);
 
                OleDbParameter parID2Param = new OleDbParameter("@parID2", parID2Val);
                insertCommand.Parameters.Add(parID2Param);
 
                OleDbParameter groupIDParam = new OleDbParameter("@groupID", groupIDVal);
                insertCommand.Parameters.Add(groupIDParam);
 
                OleDbParameter part_levelParam = new OleDbParameter("@part_level", part_levelVal);
                insertCommand.Parameters.Add(part_levelParam);
 
                OleDbParameter parentParam = new OleDbParameter("@parent", parentVal);
                insertCommand.Parameters.Add(parentParam);
 
                OleDbParameter part_nameParam = new OleDbParameter("@part_name", part_nameVal);
                insertCommand.Parameters.Add(part_nameParam);
 
                OleDbParameter quantityParam = new OleDbParameter("@quantity", quantityVal);
                insertCommand.Parameters.Add(quantityParam);
 
                OleDbParameter intDParam = new OleDbParameter("@intD", intDVal);
                insertCommand.Parameters.Add(intDParam);
                insertCommand.Parameters["@intD"].OleDbType = OleDbType.Double;
 
                OleDbParameter outDParam = new OleDbParameter("@outD", outDVal);
                insertCommand.Parameters.Add(outDParam);
                insertCommand.Parameters["@outD"].OleDbType = OleDbType.Double;
 
                OleDbParameter lengthParam = new OleDbParameter("@length", lengthVal);
                insertCommand.Parameters.Add(lengthParam);
                insertCommand.Parameters["@length"].OleDbType = OleDbType.Double;
 
                OleDbParameter massParam = new OleDbParameter("@mass", massVal);
                insertCommand.Parameters.Add(massParam);
                insertCommand.Parameters["@mass"].OleDbType = OleDbType.Double;
 
                insertCommand.CommandText = myCommandText;
                insertCommand.ExecuteNonQuery();
                MessageBox.Show("Запись сделана: " + n.name + " " + lengthVal + " " + intDVal);
Раньше, до того как я применил параметры, запись шла как полагается - каждый экземпляр коллекции заносился новой строкой в таблицу БД. Теперь же в каждой строке таблицы одна и та же запись повторяется. При этом MessageBox выдаёт нормальные индивидуальные данные для каждого элемента коллекции. То есть переменные отличаются, но вот параметры в запросе почему-то получаются одинаковые для каждого элемента (n) коллекции list.
Надеюсь на помощь сообщества.)
Заранее спасибо!
0
296 / 120 / 33
Регистрация: 06.03.2016
Сообщений: 453
07.10.2021, 19:23
Gaidn, особо не смотрел, но осмелюсь предположить, что если перед добавлением новых параметров сделать Parameters.Clear(), то всё будет ок.

Добавлено через 4 минуты
Используйте упрощенный вариант
C#
1
2
command.Parameters.AddWithValue("@part_name", part_nameVal);
command.Parameters.AddWithValue("@parent", parentVal);
1
2 / 2 / 0
Регистрация: 18.04.2014
Сообщений: 60
07.10.2021, 19:31  [ТС]
Цитата Сообщение от ipsorokin Посмотреть сообщение
Gaidn, особо не смотрел, но осмелюсь предположить, что если перед добавлением новых параметров сделать Parameters.Clear(), то всё будет ок.
О, надо попробовать. Спасибо.)
Цитата Сообщение от ipsorokin Посмотреть сообщение
Используйте упрощенный вариант
Я правильно понимаю, что указанный Вами вариант сразу и создаёт параметр и добавляет его?
0
296 / 120 / 33
Регистрация: 06.03.2016
Сообщений: 453
07.10.2021, 19:38
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
string boolstatus = (n.isChild==true) ? "TRUE" : "FALSE";
                int IDVal = n.ID;
                string parIDVal = (c==0 ? "NULL" : ("'" + n.parID + "'"));
                int parID2Val = n.parID2;
                int groupIDVal = n.groupID;
                string part_levelVal = (c2 == 0 ? "NULL" : ("'" + n.level + "'"));
                string parentVal = (c1 == 0 ? "NULL" : ("'" + n.parent + "'"));
                string part_nameVal = (c3 == 0 ? "NULL" : ("'" + n.name + "'"));
                int quantityVal = n.quantity;
                double intDVal = n.intD;
                double outDVal = n.outD;
                double lengthVal = n.length;
                double massVal = n.mass;
Сразу не обратил внимания. Это все зачем? Просто берется значение и передается в параметр.
C#
1
2
command.Parameters.AddWithValue("len", n.length);
command.Parameters.AddWithValue("name", n.name);
Добавлено через 5 минут
Цитата Сообщение от Gaidn Посмотреть сообщение
Я правильно понимаю, что указанный Вами вариант сразу и создаёт параметр и добавляет его?
n - это какой-то класс или структура. Вот и присваивайте значения свойств этого n сразу в параметры.
C#
1
2
3
4
5
6
foreach(var n in items){
command.Parameters.Clear();
// (имя параметра, сам параметр)
command.Parameters.AddWithValue("name", n.name);
command.Parameters.AddWithValue("len", n.length);
.....
Если это Access, то там дофени как вы будете их обзывать, и в CommandText можно сделать так
C#
1
"INSERT INTO ProductName (ID, parID, ParID2, groupID, part_level, parent, part_name, quantity, intD, outD, length, mass) VALUES (?,?,?,?,?,?,?,?,?,?,?,?)";
Главное по порядку добавлять в список параметров
0
2 / 2 / 0
Регистрация: 18.04.2014
Сообщений: 60
07.10.2021, 19:51  [ТС]
Цитата Сообщение от ipsorokin Посмотреть сообщение
осмелюсь предположить, что если перед добавлением новых параметров сделать Parameters.Clear(), то всё будет ок
К сожалению, не вышел аленький цветочек.) Проблема не решилась.
Для справки, вставлял вот сюда:
C#
1
2
3
4
5
6
  MessageBox.Show(myCommandText);
               
                insertCommand.Parameters.Clear();
                
                OleDbParameter IDParam = new OleDbParameter("@ID", IDVal);
                insertCommand.Parameters.Add(IDParam);
Добавлено через 6 минут
Цитата Сообщение от ipsorokin Посмотреть сообщение
n - это какой-то класс или структура. Вот и присваивайте значения свойств этого n сразу в параметры.
Честно говоря, изначально так и делал, но стала получаться длинна очень строка, которая тяжело читалась, особенно когда понадобилось использовать конструкцию if, поэтому разбил эту запись как есть. А чтобы семантика названия значений не отличалась, везде использовал суффикс val. Но, да, этот кусок, конечно надо упрощать.
Попозже переделаю на предложенный Вами вариант.

Добавлено через 4 минуты
C#
1
2
command.Parameters.AddWithValue("len", n.length);
command.Parameters.AddWithValue("name", n.name);
А здесь не нужно @ перед именем параметра вставлять?
0
296 / 120 / 33
Регистрация: 06.03.2016
Сообщений: 453
07.10.2021, 19:59
Цитата Сообщение от Gaidn Посмотреть сообщение
А здесь не нужно @ перед именем параметра вставлять?
там можно вставлять что в голову взбредёт (конкретно в этом случае). Я уже несколько раз написал, что главное - это ПОРЯДОК добавления параметров
Code
1
2
3
4
5
6
sql_text ... (?,?,?,?)
порядок парам (1,2,3,4)
add("первый",....)
add("второй",....)
add("третий",....)
add("четвертый",....)
И переделайте весь свой , код выше, по аналогии с этим. Без лишней ерунды.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        public void Insert(IEnumerable<AnyClass> list) // сюда передаем какой-то список с данными
        {
            insertCommand = new OleDbCommand("INSERT INTO `Products` (`Name`, `GroupId`) VALUES (?,?)", oleDbConnection);
            using (oleDbConnection = new OleDbConnection())
            {
                oleDbConnection?.Open();
                foreach (var item in list)
                {
                    insertCommand.Parameters.Clear();
                    insertCommand.Parameters.AddWithValue("name", item.name); // либо создать их ДО цикла, а потом в цикле по индексу менять значение
                    insertCommand.Parameters.AddWithValue("gId", item.groupId);
                    insertCommand.ExecuteNonQuery();
                }
                oleDbConnection?.Close();
            }
        }
1
2 / 2 / 0
Регистрация: 18.04.2014
Сообщений: 60
07.10.2021, 21:47  [ТС]
ipsorokin, спасибо, буду пробовать.)

Добавлено через 1 час 45 минут
Я очень прошу прощения, но ларчик открылся очень просто.) Да, на самом деле помогло Parameters.Clear().
Просто я библиотеку обновлял, а исполняемый файл запускал из под exe, и он ссылался на старую библиотеку. И что бы я ни делал, естественно не помогало.)
Но и спасибо за замечания по организации кода. Я поправил их.)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.10.2021, 21:47
Помогаю со студенческими работами здесь

Edit замена запятой на точку
Всем доброго дня! Пишу обработчик события Keypress, что-то типа маски ввода даты. Варианты с маскедитом отпадают, прошу не предлагать =) ...

Автоматическая замена запятой на точку
Как сделать так, чтобы запятая автоматически заменялась на точку, если ее кто-то случайно поставит

Замена запятой в дроби на точку (replace)
Помогите, пожалуйста, с кодом. У меня есть numericUpDownModel. Вот мой код: //Model decimal Model =...

Замена запятой на точку в PascalABC.NET
Программа выдаёт ошибку, если в программе при вводе числа стоит запятая в строке readln(l) и readln(m). Код программы: Program Optim_ves;...

Замена запятой на точку PHP AJAX JS
Помогите поставить замену запятой на точку вот здесь, при вводе количества. С точкой всё ок. С запятой Internal Error....


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru