Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
10 / 10 / 7
Регистрация: 17.05.2009
Сообщений: 140

Нарушение параллелизма UpdateCommand

29.03.2014, 21:58. Показов 3612. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Возникла проблема с обновлением бд.
В БД таблицы связаны связью 1 ко многим. Удаление и обновление установлено на каскадное.
Пытаюсь обновление след образом
C#
1
2
3
4
5
DataRow row = main.ds.Tables["plat1"].Rows[main.dataGridView1.CurrentCell.RowIndex];
                        row.BeginEdit();
                        //заполняю ячейки
                        row.EndEdit();
                        main.UpdatePlat();
UpdatePlat():
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
con.Open();
                try
                {
                    da.UpdateCommand.Connection = con;
                    db.EndEdit();
                    da.Update((DataSet)db.DataSource, "plat1");
                    
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Ошибка обращения к БД: " + ex.Message);
                }
                con.Close();
Но вылетает ошибка нарушение параллелизма UpdateCommand затронула 0 из ожидаемых 1 записей. При этом в обоих гридах видно, что данные изменяются, вылетает ошибка.. нажимаю ОК и данные возращаются в исходное состояние.

Как это исправить?

Добавлено через 25 минут
у меня почему то есть подозрение что это из-за второй таблицы. Потому что когда из проги пытаюсь обновить в ней данные.. в гриде обновляются они, а вот в бд не попадают...

Вроде раньше все работал с этим кодом. до тех пор пока в БД не сделал связи(((
Так задается команда на обновление в ней
Кликните здесь для просмотра всего текста

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
da1.UpdateCommand = new MySqlCommand("Update pcalc set " +
                                                        "`nStrah1`=@nStrah1,  `nStrah2`=@nStrah2,  `nStrah3`=@nStrah3,  `nStrah4`=@nStrah4, " +
                                                        " `nNakop1`=@nNakop1,  `nNakop2`=@nNakop2,  `nNakop3`=@nNakop3,  `nNakop4`=@nNakop4, " +
                                                        " `nTFOMS1`=@nTFOMS1,  `nTFOMS2`=@nTFOMS2,  `nTFOMS3`=@nTFOMS3,  `nTFOMS4`=@nTFOMS4, " +
                                                        " `nFFOMS1`=@nFFOMS1,  `nFFOMS2`=@nFFOMS2,  `nFFOMS3`=@nFFOMS3,  `nFFOMS4`=@nFFOMS4, " +
                                                        " `uStrah1`=@uStrah1,  `uStrah2`=@uStrah2,  `uStrah3`=@uStrah3,  `uStrah4`=@uStrah4, " +
                                                        " `uNakop1`=@uNakop1,  `uNakop2`=@uNakop2,  `uNakop3`=@uNakop3,  `uNakop4`=@uNakop4, " +
                                                        " `uTFOMS1`=@uTFOMS1,  `uTFOMS2`=@uTFOMS2,  `uTFOMS3`=@uTFOMS3,  `uTFOMS4`=@uTFOMS4, " +
                                                        " `uFFOMS1`=@uFFOMS1,  `uFFOMS2`=@uFFOMS2,  `uFFOMS3`=@uFFOMS3,  `uFFOMS4`=@uFFOMS4, `God`=@God " +
                                                        " WHERE `RNPFR`=@RNPFR and `God`=@God");
                    da1.UpdateCommand.Parameters.Add("@RNPFR", MySqlDbType.Text, 14, "RNPFR");
                    da1.UpdateCommand.Parameters.Add("@nStrah1", MySqlDbType.Float, 14, "nStrah1");
                    da1.UpdateCommand.Parameters.Add("@nStrah2", MySqlDbType.Float, 14, "nStrah2");
                    da1.UpdateCommand.Parameters.Add("@nStrah3", MySqlDbType.Float, 14, "nStrah3");
                    da1.UpdateCommand.Parameters.Add("@nStrah4", MySqlDbType.Float, 14, "nStrah4");
 
                    da1.UpdateCommand.Parameters.Add("@nNakop1", MySqlDbType.Float, 14, "nNakop1");
                    da1.UpdateCommand.Parameters.Add("@nNakop2", MySqlDbType.Float, 14, "nNakop2");
                    da1.UpdateCommand.Parameters.Add("@nNakop3", MySqlDbType.Float, 14, "nNakop3");
                    da1.UpdateCommand.Parameters.Add("@nNakop4", MySqlDbType.Float, 14, "nNakop4");
 
                    da1.UpdateCommand.Parameters.Add("@nTFOMS1", MySqlDbType.Float, 14, "nTFOMS1");
                    da1.UpdateCommand.Parameters.Add("@nTFOMS2", MySqlDbType.Float, 14, "nTFOMS2");
                    da1.UpdateCommand.Parameters.Add("@nTFOMS3", MySqlDbType.Float, 14, "nTFOMS3");
                    da1.UpdateCommand.Parameters.Add("@nTFOMS4", MySqlDbType.Float, 14, "nTFOMS4");
 
                    da1.UpdateCommand.Parameters.Add("@nFFOMS1", MySqlDbType.Float, 14, "nFFOMS1");
                    da1.UpdateCommand.Parameters.Add("@nFFOMS2", MySqlDbType.Float, 14, "nFFOMS2");
                    da1.UpdateCommand.Parameters.Add("@nFFOMS3", MySqlDbType.Float, 14, "nFFOMS3");
                    da1.UpdateCommand.Parameters.Add("@nFFOMS4", MySqlDbType.Float, 14, "nFFOMS4");
 
                    da1.UpdateCommand.Parameters.Add("@uStrah1", MySqlDbType.Float, 14, "uStrah1");
                    da1.UpdateCommand.Parameters.Add("@uStrah2", MySqlDbType.Float, 14, "uStrah2");
                    da1.UpdateCommand.Parameters.Add("@uStrah3", MySqlDbType.Float, 14, "uStrah3");
                    da1.UpdateCommand.Parameters.Add("@uStrah4", MySqlDbType.Float, 14, "uStrah4");
 
                    da1.UpdateCommand.Parameters.Add("@uNakop1", MySqlDbType.Float, 14, "uNakop1");
                    da1.UpdateCommand.Parameters.Add("@uNakop2", MySqlDbType.Float, 14, "uNakop2");
                    da1.UpdateCommand.Parameters.Add("@uNakop3", MySqlDbType.Float, 14, "uNakop3");
                    da1.UpdateCommand.Parameters.Add("@uNakop4", MySqlDbType.Float, 14, "uNakop4");
 
                    da1.UpdateCommand.Parameters.Add("@uTFOMS1", MySqlDbType.Float, 14, "uTFOMS1");
                    da1.UpdateCommand.Parameters.Add("@uTFOMS2", MySqlDbType.Float, 14, "uTFOMS2");
                    da1.UpdateCommand.Parameters.Add("@uTFOMS3", MySqlDbType.Float, 14, "uTFOMS3");
                    da1.UpdateCommand.Parameters.Add("@uTFOMS4", MySqlDbType.Float, 14, "uTFOMS4");
 
                    da1.UpdateCommand.Parameters.Add("@uFFOMS1", MySqlDbType.Float, 14, "uFFOMS1");
                    da1.UpdateCommand.Parameters.Add("@uFFOMS2", MySqlDbType.Float, 14, "uFFOMS2");
                    da1.UpdateCommand.Parameters.Add("@uFFOMS3", MySqlDbType.Float, 14, "uFFOMS3");
                    da1.UpdateCommand.Parameters.Add("@uFFOMS4", MySqlDbType.Float, 14, "uFFOMS4");
                    da1.UpdateCommand.Parameters.Add("@God", MySqlDbType.Int16, 14, "God");


задание связи в программе
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
da.Fill(ds, "plat1");
da1.Fill(ds, "pcalc");
                    
 
                    dataRelation = new DataRelation("RNPFR1", ds.Tables["plat1"].Columns["RNPFR"], ds.Tables["pcalc"].Columns["RNPFR"]);
 
                    db = new BindingSource(ds, "plat1");
                    db1 = new BindingSource(db, "RNPFR1");
                    
 
                    dataGridView1.DataSource = db;
                    dataGridView2.DataSource = db1;


Помогите пожалуйста решить данную проблему
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.03.2014, 21:58
Ответы с готовыми решениями:

Не меняются картинки в БД и нарушение параллелизма updatecommand
Делаю базу данных мебели по вот этому уроку(https://www.youtube.com/watch?v=uONQaT-nwls&t=1088s) и столкнулся с проблемой, картинки не...

Рандомное нарушение параллелизма в DeleteCommand UpdateCommand
Доброго времени суток! Делаю курсовую работу. Есть некоторые таблицы Подключил источник данных, выбрал таблички. ...

Нарушение параллелизма: UpdateCommand затронула 0 из ожидаемых 1 записей
в базе есть таблица Furnitura такой вот структуры Обновление базы данных делаю следующим образом OleDbCommand update1 = new...

6
 Аватар для Павлик Морозов
138 / 137 / 42
Регистрация: 26.10.2012
Сообщений: 443
29.03.2014, 23:18
Дело не в каскадном обновлении. Некоторое время назад столкнулся с такой же ошибкой. Суть проблемы в том, что перед записью по идее DataSet должен проверить совпадение версий данных в БД и у себя и только потом обновлять (т.е. что с момента получения этих данных никто их не поменял, и сейчас будут менять именно те данные, которые запрашивались). Это сделано в целях защиты данных в БД от перетирания пользователями. Т.к. у меня данные блокируются на уровне ПО (т.е. если один юзер редактирует данные, другой только посмотреть сможет), то потому смело сделал ручное определение команд Insert, Update, Delete и все заработало.
0
10 / 10 / 7
Регистрация: 17.05.2009
Сообщений: 140
30.03.2014, 08:59  [ТС]
А как это сделать? программа в стадии разработки и этими данными никто не пользуется, и никто не меняет.. А ошибка все равно появляется

Добавлено через 32 минуты
Да и почему во второй таблице (описанной выше) не происходит обновление? команда выполянется без ошибок, но в бд данные не появляются
0
 Аватар для Павлик Морозов
138 / 137 / 42
Регистрация: 26.10.2012
Сообщений: 443
30.03.2014, 18:32
Что касается второй таблицы, вы уверены, что в бд уже есть строка которые вы хотите обновить? Если по условиям после WHERE ничего нет, то ничего и не обновится. Может для начала нужно INSERT выполнить?
Как таблицы связаны между собой? Может быть, что вы сначала подчиненную таблицу хотите записать данные, а потом в главную?
0
10 / 10 / 7
Регистрация: 17.05.2009
Сообщений: 140
30.03.2014, 18:40  [ТС]
По поводу второй таблице уверен на 100% что они есть.. Так как все данные берутся из той же БД чтобы однозначно идентифицировать запись... По поводу обоих таблиц.. Update вызывают сначала для главной потом для второй... Как связаны в проге есть код в первом сообщении. В бд связь 1 ко многим с каскадным обновлением. Я понять почему только update не работает.. Insert, delete без ошибок проходит... В качестве альтернативы сделал вариант выполнения своих запросов к БД... Они прекрасно работают, а вот почему через. Updatecommand не хочет.. Мне дико интересно.
0
 Аватар для Павлик Морозов
138 / 137 / 42
Регистрация: 26.10.2012
Сообщений: 443
30.03.2014, 22:38
В моем случае все ломалось, потому что я использовал SqlCommandBuilder для построения запросов в бд. Причем только когда обновлял несколько таблиц из DataSet. Если работать только с одним DataTable, тогда все ровно идет. В вашем случае, я подозреваю что проблема завязана с BindingSource... Можете целиком код показать?
0
10 / 10 / 7
Регистрация: 17.05.2009
Сообщений: 140
30.03.2014, 22:55  [ТС]
Так заполняются гриды. Сразу скажу сократил задание параметров....

Кликните здесь для просмотра всего текста
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
string sSql = "select * from plat";
 
                    MySqlCommand cmd = new MySqlCommand(sSql, con);
                    ds = new DataSet();
                    da = new MySqlDataAdapter(cmd);
 
                    // Добавление
 
                    da.InsertCommand = new MySqlCommand("insert into plat " +
                                                       "(`RNPFR`,   `OKATO`,`INN`,`FAM`,`NAME`,`FATHER`,`DataBD`,`INDEX`,`Adress`," +
                                                        "`zSTrah`,`zNakop`,`zTfoms`,`zFfoms`,`CH`,  `RN_OMS`, `DataRegIP`, `DataZakIP`,  `Dohod`, `CH_NAKOP`, `ispolID`)" +
                                                        "Values (@RNPFR,    @OKATO, @INN, @FAM, @NAME, @FATHER, @DataBD, @INDEX, @Adress," +
                                                        "@zSTrah, @zNakop, @zTfoms, @zFfoms, @CH,   @RN_OMS, @DataRegIP, @DataZakIP,  @Dohod, @CH_NAKOP, @ispolID)");
                    da.InsertCommand.Parameters.Add("@RNPFR", MySqlDbType.Text, 14, "RNPFR");
                    //и т.д.
 
                    //Удаление
                    da.DeleteCommand = new MySqlCommand("Delete from plat WHERE `RNPFR` = @RNPFR");
                    da.DeleteCommand.Parameters.Add("RNPFR", MySqlDbType.String, 14, "RNPFR");
 
                    //Обновить
 
                    da.UpdateCommand = new MySqlCommand("update plat SET `RNPFR`= @RNPFR,   `OKATO`= @OKATO,`INN`= @INN," +
                            "`FAM`= @FAM,`NAME`= @NAME,`FATHER`= @FATHER,`DataBD`= @DataBD," +
                            "`INDEX`= @INDEX,`Adress`= @Adress," +
                            "`zSTrah`= @zSTrah,`zNakop`= @zNakop,`zTfoms`= @zTfoms,`zFfoms`= @zFfoms,`RN_OMS`= @RN_OMS, " +
                            "`DataRegIP` =  @DataRegIP, `DataZakIP`=@DataZakIP,  `Dohod` = @Dohod, `CH` = @CH, `CH_NAKOP`=@CH_NAKOP, `ispolID`=@ispolID" +
                            " WHERE `RNPFR`= @RNPFR");
 
                    da.UpdateCommand.Parameters.Add("@RNPFR", MySqlDbType.Text, 14, "RNPFR");
                    //и т.д.
 
                    
                    MySqlCommand cmd1 = new MySqlCommand("select pcalc.*, plat.zSTrah, plat.zNakop, plat.zTfoms, plat.zFfoms from pcalc, plat where pcalc.RNPFR = plat.RNPFR", con);
                    da1 = new MySqlDataAdapter(cmd1);
                    // Добавить
                    da1.InsertCommand = new MySqlCommand("insert into pcalc (`RNPFR`,  `nStrah1`,  `nStrah2`,  `nStrah3`,  `nStrah4`, " +
                                                                                     " `nNakop1`,  `nNakop2`,  `nNakop3`,  `nNakop4`, " +
                                                                                     " `nTFOMS1`,  `nTFOMS2`,  `nTFOMS3`,  `nTFOMS4`, " +
                                                                                     " `nFFOMS1`,  `nFFOMS2`,  `nFFOMS3`,  `nFFOMS4`, " +
                                                                                     " `uStrah1`,  `uStrah2`,  `uStrah3`,  `uStrah4`, " +
                                                                                     " `uNakop1`,  `uNakop2`,  `uNakop3`,  `uNakop4`, " +
                                                                                     " `uTFOMS1`,  `uTFOMS2`,  `uTFOMS3`,  `uTFOMS4`, " +
                                                                                     " `uFFOMS1`,  `uFFOMS2`,  `uFFOMS3`,  `uFFOMS4`, `God`)" +
                                                                   " VALUES (@RNPFR,  @nStrah1,  @nStrah2,  @nStrah3,  @nStrah4, " +
                                                                                    " @nNakop1,  @nNakop2,  @nNakop3,  @nNakop4, " +
                                                                                    " @nTFOMS1,  @nTFOMS2,  @nTFOMS3,  @nTFOMS4, " +
                                                                                    " @nFFOMS1,  @nFFOMS2,  @nFFOMS3,  @nFFOMS4, " +
                                                                                    " @uStrah1,  @uStrah2,  @uStrah3,  @uStrah4, " +
                                                                                    " @uNakop1,  @uNakop2,  @uNakop3,  @uNakop4, " +
                                                                                    " @uTFOMS1,  @uTFOMS2,  @uTFOMS3,  @uTFOMS4, " +
                                                                                    " @uFFOMS1,  @uFFOMS2,  @uFFOMS3,  @uFFOMS4, @God)");
                    da1.InsertCommand.Parameters.Add("@RNPFR", MySqlDbType.Text, 14, "RNPFR");
                    //и т.д.
 
                    //Удалить
                    da1.DeleteCommand = new MySqlCommand("Delete from pcalc WHERE `RNPFR` = @RNPFR");
                    da1.DeleteCommand.Parameters.Add("RNPFR", MySqlDbType.String, 14, "RNPFR");
                    //Обновить
 
                    da1.UpdateCommand = new MySqlCommand("Update pcalc set " +
                                                        "`nStrah1`=@nStrah1,  `nStrah2`=@nStrah2,  `nStrah3`=@nStrah3,  `nStrah4`=@nStrah4, " +
                                                        " `nNakop1`=@nNakop1,  `nNakop2`=@nNakop2,  `nNakop3`=@nNakop3,  `nNakop4`=@nNakop4, " +
                                                        " `nTFOMS1`=@nTFOMS1,  `nTFOMS2`=@nTFOMS2,  `nTFOMS3`=@nTFOMS3,  `nTFOMS4`=@nTFOMS4, " +
                                                        " `nFFOMS1`=@nFFOMS1,  `nFFOMS2`=@nFFOMS2,  `nFFOMS3`=@nFFOMS3,  `nFFOMS4`=@nFFOMS4, " +
                                                        " `uStrah1`=@uStrah1,  `uStrah2`=@uStrah2,  `uStrah3`=@uStrah3,  `uStrah4`=@uStrah4, " +
                                                        " `uNakop1`=@uNakop1,  `uNakop2`=@uNakop2,  `uNakop3`=@uNakop3,  `uNakop4`=@uNakop4, " +
                                                        " `uTFOMS1`=@uTFOMS1,  `uTFOMS2`=@uTFOMS2,  `uTFOMS3`=@uTFOMS3,  `uTFOMS4`=@uTFOMS4, " +
                                                        " `uFFOMS1`=@uFFOMS1,  `uFFOMS2`=@uFFOMS2,  `uFFOMS3`=@uFFOMS3,  `uFFOMS4`=@uFFOMS4, `God`=@God " +
                                                        " WHERE `RNPFR`=@RNPFR and `God`=@God");
                    da1.UpdateCommand.Parameters.Add("@RNPFR", MySqlDbType.Text, 14, "RNPFR");
                    // ит.д.
                    da.Fill(ds, "plat1");
                    da1.Fill(ds, "pcalc");
                    
 
                    dataRelation = new DataRelation("RNPFR1", ds.Tables["plat1"].Columns["RNPFR"], ds.Tables["pcalc"].Columns["RNPFR"]);
                    ds.Relations.Add(dataRelation);
                    
 
                    db = new BindingSource(ds, "plat1");
                    db1 = new BindingSource(db, "RNPFR1");
                    dataGridView1.AutoGenerateColumns = false;
                    dataGridView2.AutoGenerateColumns = false;
                    
                    dataGridView1.CellValueChanged += new DataGridViewCellEventHandler(dataGridView1_CellValueChanged);
                    dataGridView1.DataSource = db;
                    dataGridView2.DataSource = db1;

вызов update... Не стал приводить код изменения значений в ячейках, там просто изменение значений ячеек... Раньше работало все в таком виде... до создания связей в самой БД
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
con.Close();
                con.Open();
                try
                {
                    da.UpdateCommand.Connection = con;
                    da1.UpdateCommand.Connection = con;
                    db.EndEdit();
                    da.Update((DataSet)db.DataSource, "plat1");
                    da1.Update((DataSet)db.DataSource, "pcalc");
                    
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Ошибка обращения к БД: " + ex.Message);
                }
                con.Close();
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.03.2014, 22:55
Помогаю со студенческими работами здесь

Нарушение параллелизма
Здравствуйте еще раз, много тем видел на форуме но так и не смог решить эту проблему. Есть такой вот код private void...

Нарушение параллелизма
Здравствуйте. возникла ошибка. добавляю данные в грид. запись добавляется с id -1, при закрытии приложения и запуске запись имеет...

Нарушение параллелизма
Всем доброго дня!По данной проблеме читал все ветки в данном разделе,но решение проблемы своей не нашёл. Записываю данные в DatagridView...

SQLCommandBuilder провоцирует нарушение параллелизма
Добрый день, коллеги. Столкнулся с проблемой записи в базу коллекции таблиц (3-8 штук в одном DataSet). Суть проблемы в том, что при...

Нарушение параллелизма: DeleteCommand затронула 0 из ожидаемых 1 записей
Делал проект в среде, т.е добавил источник данных, все дела, автоматом сгенерился BindingNavigator. Так вот если добавить запись,...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru