Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.72/29: Рейтинг темы: голосов - 29, средняя оценка - 4.72
 Аватар для xamelione25
-4 / 5 / 2
Регистрация: 04.02.2013
Сообщений: 1,861
MySQL

Не получается обновить данные в mysql с использованием двойного условия

25.08.2021, 23:03. Показов 6199. Ответов 35
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '&& C_0=1' at line 1
Мне просто двойное условие фильтрации нужно соблюсти при обновлении (см. 63 строку).

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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using MySql.Data.MySqlClient;
 
namespace IT_A_stroy
{
    public partial class Form2 : Form
    {
        DataSet ds;
        DataTable dt1;
        MySqlDataAdapter adapter;
        public string ID { get; set; }
        public bool IsEdit { get; set; }
        string sql = "select post, FIO from a_stroy.employee where 1=2";
        public DataTable Execute(string script)
        {
            using (MySqlConnection connection = new MySqlConnection(DBMySQLUtils.GetConnectionString()))
            {
                DataTable table = new DataTable();
                connection.Open();
                adapter = new MySqlDataAdapter(script, connection);
                adapter.Fill(table);
                return table;
            }
        }
        public Form2()
        {
            InitializeComponent();
            dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
            dataGridView1.AllowUserToAddRows = false;
            using (MySqlConnection connection = new MySqlConnection(DBMySQLUtils.GetConnectionString()))
            {
                connection.Open();
                ds = new DataSet();
                adapter = new MySqlDataAdapter(sql, connection);
                adapter.Fill(ds);
                dataGridView1.DataSource = ds.Tables[0];
                dataGridView1.Columns["post"].Width = 97;
                dataGridView1.Columns["post"].HeaderText = "Должность";
                dataGridView1.Columns["FIO"].Width = 100;
                dataGridView1.Columns["FIO"].HeaderText = "ФИО";
            }
        }
        MySqlCommand mySqlCommand;
        
        private void Button1_Click(object sender, EventArgs e)
        {
            try
            {
                if (IsEdit)
                {
                    MySQL_connect.Execute2($@"UPDATE Organization SET Name_organization = '{textBox1.Text}', FCS_director = '{textBox2.Text}', INN = {textBox3.Text}, KPP = {textBox4.Text}, OGRN = {textBox5.Text}, OKATO = {textBox6.Text}, OKPO = {textBox7.Text}, Email = '{textBox8.Text}', Phone = {textBox9.Text}, Name_bank = '{textBox10.Text}', Schet_raschetniy = {textBox11.Text}, Schet_korr = {textBox12.Text}, BIK = {textBox13.Text}, UR_index = {textBox14.Text}, UR_region = '{textBox15.Text}', UR_city = '{textBox16.Text}', UR_street = '{textBox17.Text}', UR_house = '{textBox18.Text}', UR_stroenie = '{textBox19.Text}', UR_korpus = '{textBox20.Text}', UR_flat = '{textBox21.Text}', FAKT_index = {textBox22.Text}, FAKT_region = '{textBox23.Text}', FAKT_city = '{textBox24.Text}', FAKT_street = '{textBox25.Text}', FAKT_house = '{textBox26.Text}', FAKT_stroenie = '{textBox27.Text}', FAKT_korpus = '{textBox28.Text}', FAKT_flat  = '{textBox29.Text}' WHERE id_organization={ID}");
                    var cells = dataGridView1.CurrentRow.Cells;
                    var tabletemp = MySQL_connect.Execute($"SELECT id FROM a_stroy.employee WHERE id={ID} && C_O=1");
                    for (int i = 0; i < dataGridView1.RowCount; i++)
                    {
                        MySQL_connect.Execute2($"UPDATE employee SET post = '{dataGridView1.Rows[i].Cells[1].Value}', FIO = '{dataGridView1.Rows[i].Cells[2].Value}' where id={tabletemp} && C_O=1;");
                    }
                    MessageBox.Show("Введенные данные успешно изменены!", "Successful");
                }
                else
                {
                    string query = "INSERT INTO Organization (Name_organization, FCS_director, INN, KPP, OGRN, OKATO, OKPO, Email, Phone, Name_bank, Schet_raschetniy, Schet_korr, BIK, UR_index, UR_region, UR_city, UR_street, UR_house, UR_stroenie, UR_korpus, UR_flat, FAKT_index, FAKT_region, FAKT_city, FAKT_street, FAKT_house, FAKT_stroenie, FAKT_korpus, FAKT_flat) VALUES ('" + textBox1.Text + "','" + textBox2.Text + "','" + textBox3.Text + "','" + textBox4.Text + "','" + textBox5.Text + "','" + textBox6.Text + "','" + textBox7.Text + "','" + textBox8.Text + "','" + textBox9.Text + "','" + textBox10.Text + "','" + textBox11.Text + "','" + textBox12.Text + "','" + textBox13.Text + "','" + textBox14.Text + "','" + textBox15.Text + "','" + textBox16.Text + "','" + textBox17.Text + "','" + textBox18.Text + "','" + textBox19.Text + "','" + textBox20.Text + "','" + textBox21.Text + "','" + textBox22.Text + "','" + textBox23.Text + "','" + textBox24.Text + "','" + textBox25.Text + "','" + textBox26.Text + "','" + textBox27.Text + "','" + textBox28.Text + "','" + textBox29.Text + "')";
                    MySQL_connect.Execute2(query);
                    MySqlConnection connection = new MySqlConnection(DBMySQLUtils.GetConnectionString());// объект для установления соединения с БД
                    connection.Open();// открываем соединение
                    object lastid = ((MySQL_connect.Execute("SELECT id_organization FROM a_stroy.organization;").Rows as DataRowCollection).OfType<DataRow>().LastOrDefault()).ItemArray[0];
                    for (int i = 0; i < dataGridView1.RowCount; i++)
                    {
                        mySqlCommand = new MySqlCommand("sp_create_employee", connection);
                        mySqlCommand.CommandType = CommandType.StoredProcedure;
                        var cells = dataGridView1.Rows[i].Cells;
                        mySqlCommand.Parameters.Add(new MySqlParameter("@id", lastid));
                        mySqlCommand.Parameters.Add(new MySqlParameter("@post", cells[0].Value));
                        mySqlCommand.Parameters.Add(new MySqlParameter("@FIO", cells[1].Value));
                        mySqlCommand.Parameters.Add(new MySqlParameter("@C_O", 1));
                        mySqlCommand.ExecuteScalar();
                    }
                    MessageBox.Show("Введенные данные успешно сохранены!", "Successful");
                }
                Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                //throw;
            }
        }
        private void Button2_Click(object sender, EventArgs e)
        {
            Close();
        }
        private void Form2_Load(object sender, EventArgs e)
        {
            if (IsEdit)
            {
                button1.Text = "Изменить";
                DataTable dt = MySQL_connect.Execute($"SELECT * FROM a_stroy.organization where id_organization={ID}");
                //DataTable dt1 = MySQL_connect.Execute($"SELECT * FROM a_stroy.employee where id={ID} && C_O=1");
                dt1 = MySQL_connect.Execute($"SELECT * FROM a_stroy.employee where id={ID} && C_O=1");
                textBox1.Text = dt.Rows[0].ItemArray[1].ToString();
                textBox2.Text = dt.Rows[0].ItemArray[2].ToString();
                textBox3.Text = dt.Rows[0].ItemArray[3].ToString();
                textBox4.Text = dt.Rows[0].ItemArray[4].ToString();
                textBox5.Text = dt.Rows[0].ItemArray[5].ToString();
                textBox6.Text = dt.Rows[0].ItemArray[6].ToString();
                textBox7.Text = dt.Rows[0].ItemArray[7].ToString();
                textBox8.Text = dt.Rows[0].ItemArray[8].ToString();
                textBox9.Text = dt.Rows[0].ItemArray[9].ToString();
                textBox10.Text = dt.Rows[0].ItemArray[10].ToString();
                textBox11.Text = dt.Rows[0].ItemArray[11].ToString();
                textBox12.Text = dt.Rows[0].ItemArray[12].ToString();
                textBox13.Text = dt.Rows[0].ItemArray[13].ToString();
                textBox14.Text = dt.Rows[0].ItemArray[14].ToString();
                textBox15.Text = dt.Rows[0].ItemArray[15].ToString();
                textBox16.Text = dt.Rows[0].ItemArray[16].ToString();
                textBox17.Text = dt.Rows[0].ItemArray[17].ToString();
                textBox18.Text = dt.Rows[0].ItemArray[18].ToString();
                textBox19.Text = dt.Rows[0].ItemArray[19].ToString();
                textBox20.Text = dt.Rows[0].ItemArray[20].ToString();
                textBox21.Text = dt.Rows[0].ItemArray[21].ToString();
                textBox22.Text = dt.Rows[0].ItemArray[22].ToString();
                textBox23.Text = dt.Rows[0].ItemArray[23].ToString();
                textBox24.Text = dt.Rows[0].ItemArray[24].ToString();
                textBox25.Text = dt.Rows[0].ItemArray[25].ToString();
                textBox26.Text = dt.Rows[0].ItemArray[26].ToString();
                textBox27.Text = dt.Rows[0].ItemArray[27].ToString();
                textBox28.Text = dt.Rows[0].ItemArray[28].ToString();
                textBox29.Text = dt.Rows[0].ItemArray[29].ToString();
                dataGridView1.DataSource = dt1;
                dataGridView1.Columns["C_O"].Visible = false;
                dataGridView1.Columns["id"].Visible = false;
                dataGridView1.Columns["id_employee"].Visible = false;
            }
            else
            {
                button1.Text = "Сохранить";
            }
        }
 
        private void button5_Click(object sender, EventArgs e)
        {
            if (IsEdit)
            {
                //dataGridView1.DataSource = ds.Tables[0];
                //DataRow row = ds.Tables[0].NewRow(); // добавляем новую строку в DataTable
                //ds.Tables[0].Rows.Add(row);
                DataRow row = dt1.NewRow();
                dt1.Rows.Add(row);
                
            }
            else
            {
                DataRow row = ds.Tables[0].NewRow(); // добавляем новую строку в DataTable
                ds.Tables[0].Rows.Add(row);
            }
            //MessageBox.Show(dataGridView1.Rows.Count.ToString());
            //MessageBox.Show(ds.Tables.Count.ToString());
            //dataGridView1.DataSource = ds.Tables[0];
            //dataGridView1.Refresh();
        }
        private void button6_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("Удалить эту строку?", "Удаление", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
            {
                foreach (DataGridViewRow row in dataGridView1.SelectedRows)// удаляем выделенные строки из dataGridView1
                {
                    dataGridView1.Rows.Remove(row);
                }
            }
        }
    }
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.08.2021, 23:03
Ответы с готовыми решениями:

Не получается обновить данные в БД
Здравствуйте. При изменени некоторых данных в форме нужно обновит данные в базе, и что то не получается. Уже второй день ошибку ищу.Вывожу...

Linq to SQL: не получается обновить данные
Не получается сделать update Офф Источник // Query the database for the row to be updated. var query = from ord in...

Обновить данные с использованием DataSet
Заполняю таблицу при помощи bindingNavigator, потом, естественно требуется обновить данные, в книжке, по которой я все это делала написано...

35
68 / 56 / 15
Регистрация: 30.01.2020
Сообщений: 332
26.08.2021, 16:52
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от xamelione25 Посмотреть сообщение
var ...
это не тип
поставьте брейкпоинт на 60 строчке и посмотрите что по факту получается
0
 Аватар для Andrey-MSK
3376 / 2262 / 388
Регистрация: 14.08.2018
Сообщений: 7,671
Записей в блоге: 4
26.08.2021, 16:54
Цитата Сообщение от HF Посмотреть сообщение
И каким образом это должно работать в запросе где требуется только 1! число.
Человек получает список сотрудников, я ему и показал как этот список получить
0
785 / 616 / 273
Регистрация: 04.08.2015
Сообщений: 1,713
26.08.2021, 16:55
xamelione25, нельзя DataTable
Цитата Сообщение от xamelione25 Посмотреть сообщение
C#
1
2
3
4
5
6
7
8
9
10
11
public DataTable Execute(string script)
        {
            using (MySqlConnection connection = new MySqlConnection(DBMySQLUtils.GetConnectionString()))
            {
                DataTable table = new DataTable();
                connection.Open();
                adapter = new MySqlDataAdapter(script, connection);
                adapter.Fill(table);
                return table;
            }
        }
пихать в запрос
Цитата Сообщение от xamelione25 Посмотреть сообщение
C#
1
2
3
4
5
var tabletemp = MySQL_connect.Execute($"SELECT id FROM a_stroy.employee WHERE id={ID} && C_O=1");
                    for (int i = 0; i < dataGridView1.RowCount; i++)
                    {
                        MySQL_connect.Execute2($"UPDATE employee SET post = '{dataGridView1.Rows[i].Cells[1].Value}', FIO = '{dataGridView1.Rows[i].Cells[2].Value}' where id={tabletemp} && C_O=1;");
                    }
0
26.08.2021, 17:00

Не по теме:

Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Человек получает список сотрудников, я ему и показал как этот список получить
Для этого нужно полностью всё переделывать, так что вряд ли это поможет)

0
26.08.2021, 17:01

Не по теме:

Цитата Сообщение от gegbot Посмотреть сообщение
Для этого нужно полностью всё переделывать, так что вряд ли это поможет)
В принципе DataAccess переделать не сложно :)

0
26.08.2021, 17:13

Не по теме:

Цитата Сообщение от Andrey-MSK Посмотреть сообщение
В принципе DataAccess переделать не сложно :)
это для вас не сложно, а судя по коду для ТС это будет некоторой проблемой)

0
HF
26.08.2021, 19:35

Не по теме:

Цитата Сообщение от gegbot Посмотреть сообщение
Для этого нужно полностью всё переделывать, так что вряд ли это поможет)
Не преувеличивайте. ТС смышлёный. И я бы переделал две вещи: 1) сделать нормальные именования, чтобы было понятно что где меняется и используется (например, имена гридов; а методы работы с БД должны возвращать понятный результат) 2) чуток переделать ООПэшно работу с формами. чтобы передача ИДов была явной и обязательной или передача специальной модели где понятно что из чего для чего берётся.
И потом будет работать.. или в режиме отладки он поймёт где ошибка и чуток переделает. Я верю в него )

0
 Аватар для xamelione25
-4 / 5 / 2
Регистрация: 04.02.2013
Сообщений: 1,861
26.08.2021, 19:50  [ТС]
HF, сложно без аналогии ... Особенно когда у тебя почти 0ые знания синтаксиса
0
HF
 Аватар для HF
1337 / 921 / 202
Регистрация: 09.09.2011
Сообщений: 2,742
Записей в блоге: 2
26.08.2021, 20:06
Цитата Сообщение от xamelione25 Посмотреть сообщение
сложно без аналогии ... Особенно когда у тебя почти 0ые знания синтаксиса
От вас сейчас ждут пока одного - в отладчике пройдите строки 60-63 и проверьте
- что у вас записано в ID переменной
- что у вас возвращается в temptable и...
- соответственно вставьте это в текстовый запрос и выполните в IDE и убедитесь что это возвращает нужный результат

я "ставлю" на то что
- 20% - ID в части случаев (в некоторых ситуациях когда например вы ничего не выбрали или кнопка нажалась без нужного результата и т.п.)
- 80% - temptable - это реально таблица, а нужно одно только значение (типа int). Соответствено запрос вообще невалидный.
0
 Аватар для xamelione25
-4 / 5 / 2
Регистрация: 04.02.2013
Сообщений: 1,861
27.08.2021, 23:01  [ТС]
HF,
Цитата Сообщение от HF Посмотреть сообщение
- что у вас записано в ID переменной
- что у вас возвращается в temptable и...
- соответственно вставьте это в текстовый запрос и выполните в IDE и убедитесь что это возвращает нужный результат
Миниатюры
Не получается обновить данные в mysql с использованием двойного условия   Не получается обновить данные в mysql с использованием двойного условия   Не получается обновить данные в mysql с использованием двойного условия  

0
HF
 Аватар для HF
1337 / 921 / 202
Регистрация: 09.09.2011
Сообщений: 2,742
Записей в блоге: 2
28.08.2021, 00:32
Первый и второй скрины идентичны. temptable ещё не определён. А собственно в нём и ожидалась проблема.

И, судя по скрину из БД - у вас ещё и данные странно лежат. Почему два раза вернулся employee=11 ? Вы его и два раза потом будете обрабатывать?
0
 Аватар для xamelione25
-4 / 5 / 2
Регистрация: 04.02.2013
Сообщений: 1,861
28.08.2021, 00:42  [ТС]
HF,
на первом скрине id вернулся = 11
на втором как вы и пишите - он либо не определен ... либо = null
на третьем у меня тот id что я выбрал - я вставил в запросе в БД и у меня вышло две строки ... так как у меня два сотрудника в БД с id = 11

Добавлено через 41 секунду
HF, вот на данный момент мне и непонятно прочему temptable = null
0
785 / 616 / 273
Регистрация: 04.08.2015
Сообщений: 1,713
28.08.2021, 10:20
Цитата Сообщение от xamelione25 Посмотреть сообщение
вот на данный момент мне и непонятно прочему temptable = null
Потому что за 3 года изучения C# у вас
Цитата Сообщение от xamelione25 Посмотреть сообщение
почти 0ые знания синтаксиса
tabletemp= null, потому что переменная еще не инициализирована. А если перейти на следующую строку, он уже не будет null. Ошибка у вас возникает из-за того, что вы помещаете объект tabletemp в запрос.
...where id={tabletemp} && C_O=1;
Раз вы пишите "id=", то вы ожидаете одно значение, а реально в tabletemp их 3, что видно из вашего скрина результата запроса.
Т.е. один из запросов неправильный.
tabletemp - это DataTable. Поэтому, если бы в нем ожидалась 1 строка, то получить значение можно так
C#
1
2
3
4
5
if(tabletemp.Rows.Count>0)
{
...
...where id={tabletemp.Rows[0].ToString()} && C_O=1;
}
0
HF
 Аватар для HF
1337 / 921 / 202
Регистрация: 09.09.2011
Сообщений: 2,742
Записей в блоге: 2
28.08.2021, 12:38
А ещё один вопрос тоже остался без ответа - что за метод Execute? Что именно он возвращает?
Если это Dapper например, то даже он не возвращает результат, а только "количество обработанных строк".
Но никак не результат. Потому что для возврата результата метод Execute должен быть как минимум Generic чтобы знать Что именно оттуда вернулось. Поэтому и предположение что и здесь то не всё верно сделано.
Кстати это как раз может доказывать почему temptable - null. Там селект а не апдейты.
0
785 / 616 / 273
Регистрация: 04.08.2015
Сообщений: 1,713
28.08.2021, 13:52
Цитата Сообщение от HF Посмотреть сообщение
А ещё один вопрос тоже остался без ответа - что за метод Execute? Что именно он возвращает?
В 23 я его процитировал.
0
HF
 Аватар для HF
1337 / 921 / 202
Регистрация: 09.09.2011
Сообщений: 2,742
Записей в блоге: 2
28.08.2021, 14:41
Цитата Сообщение от Igr_ok Посмотреть сообщение
В 23 я его процитировал.
Точно, упустил. Ну тогда всё верно. ТС даже не понял что делает. И подходит только вариант где в цикле используются данные из темптаблицы.
Надеюсь после этого то уже ТС сможет всё сделать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.08.2021, 14:41

Не могу обновить данные в MySql
добрый день скажите почему я не могу занести данные в mySql Если я вывел запрос в textBox и выполнил его и все нормально прошло....

Обновить данные mysql по выбору option
Добрый день! Столкнулся с проблемой:(, необходимо обновить данные таблицы при выборе элемента из Option,у меня есть скрипт на javascript...

Как обновить данные в таблице mysql после того, как изменяю данные в datagrid руками? Сроки горят ;c
Вывожу таблицу sql в datagrid таким образом: DB db = new DB(); BindingSource bs = new BindingSource(); ...

Не получается обновить данные в БД SQL Server при изменении данных в dataGridView
ADO.NET C# Добавлено через 2 минуты using System; using System.Collections.Generic; using System.ComponentModel; using...

PDO подготовленные запрос для update данных, не получается с текстом обновить данные
Доброго времени суток, помогите разобраться(довести до ума) с подготовленными запросами для обновления данных в базе. Есть такой запрос: ...


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

Или воспользуйтесь поиском по форуму:
36
Ответ Создать тему
Новые блоги и статьи
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
сукцессия 43. Вторая научная статья за месяц- прайминг и гатгил
anaschu 25.07.2026
две стороны одной монеты
Более приземисто - Эстафету хвоста в .cdl (деревья эстафеты в сад).
Hrethgir 24.07.2026
В будущем, после написания блока инверсии обхода дерева (эстафеты хвоста), я планирую вернуться к нашему прошлому разговору о том, обладают ли знания целеполаганием. Тогда я пришел к выводу, что. . .
Вот представьте что вам дали бессмертие.
kumehtar 24.07.2026
Вот представьте что вам дали бессмертие, ничего более не меняя. Вообще ничего, только бессмертие в нынешнем виде. Рады были бы? Что бы вы тут делали всё это время? Никакой пенсии. Никакого нового. . .
сукцессия 41
anaschu 24.07.2026
Численная верификация бифуркации в агентной модели лесной сукцессии: от одного параметра к ансамблю Автор: пользователь @Shumilov_AS | Раздел: Прикладная математика / Численные методы Кратко. . .
сукцессия 40. Ансамблевая кластерная параметризаци, часть 1.
anaschu 24.07.2026
Пр# Сопровождение научной статьи ИИ-ассистентом: подготовка публикации и калибровка агентно-ориентированной модели сукцессии микоризных систем **Полевые заметки о двухнедельной совместной работе**. . .
Теория всего 12. ВГК на планете в стратегической игре "терра"
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики 1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru