Dani Solis Ответов: 1

Ошибка обновления умом использовать внутреннее соединение


Здравствуйте, ребята, у меня есть проблема с двумя запросами Update и Insert с помощью Inner Join.

У меня есть три таблицы отношений корабля.

Мое приложение-это C# Windows Forms, подключенная к базе данных Access.

The follow fields are type Int:

Atados

Reorden

Pc_Atado

Vol


This is my query:

private void btnAct_Click(object sender, EventArgs e)
        {
            String sql = "UPDATE tLEADS INNER JOIN (tBUNDLES INNER JOIN tLOCALES ON tBUNDLES.IdBUNDLES = tLOCALES.IdLOCALES) ON tLEADS.IdLEADS = tBUNDLES.IdBUNDLES SET tLEADS Mnbr='" + txtMaq.Text + "', Rack=" + txtRack.Text + ", Nivel='" + txtNiv.Text + "', Localizacion='" + txtLoc.Text + "', Atados=" + txtAta.Text + ", Reorden=" + txtReor.Text + ", Pcs_Atado=" + txtPcs.Text + ", Vol=" + txtVol.Text + ", WHERE IdLEADS = '" + txtBusLead.Text + "'";
            try
            {
                con.Open();
                adapter = new OleDbDataAdapter(cmd);
                if (MessageBox.Show("Esta seguro que quiere actualizar el registro ??", "ALERTA: Actualizara un registro", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning) == DialogResult.OK)
                {
                    cmd.ExecuteNonQuery();
                    MessageBox.Show("Registro actualizado correctamente...!", "Registro Actualizado", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                }
                con.Close();
                CargaDg();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                con.Close();
            }
        }
    }
Let me know you comments please.


Дэн

Что я уже пробовал:

private void btnAct_Click(object sender, EventArgs e)
        {
            String sql = "UPDATE tLEADS INNER JOIN (tBUNDLES INNER JOIN tLOCALES ON tBUNDLES.IdBUNDLES = tLOCALES.IdLOCALES) ON tLEADS.IdLEADS = tBUNDLES.IdBUNDLES SET tLEADS Mnbr='" + txtMaq.Text + "', Rack=" + txtRack.Text + ", Nivel='" + txtNiv.Text + "', Localizacion='" + txtLoc.Text + "', Atados=" + txtAta.Text + ", Reorden=" + txtReor.Text + ", Pcs_Atado=" + txtPcs.Text + ", Vol=" + txtVol.Text + ", WHERE IdLEADS = '" + txtBusLead.Text + "'";
            try
            {
                con.Open();
                adapter = new OleDbDataAdapter(cmd);
                if (MessageBox.Show("Esta seguro que quiere actualizar el registro ??", "ALERTA: Actualizara un registro", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning) == DialogResult.OK)
                {
                    cmd.ExecuteNonQuery();
                    MessageBox.Show("Registro actualizado correctamente...!", "Registro Actualizado", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                }
                con.Close();
                CargaDg();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                con.Close();
            }
        }
    }

Richard Deeming

Опубликуйте полную информацию об исключении, которое вы получаете.

1 Ответов

Рейтинг:
1

OriginalGriff

Не делай этого так! Никогда не объединяйте строки для построения команды SQL. Это оставляет вас широко открытыми для случайной или преднамеренной атаки SQL-инъекции, которая может уничтожить всю вашу базу данных. Вместо этого всегда используйте параметризованные запросы.

Когда вы объединяете строки, вы вызываете проблемы, потому что SQL получает такие команды, как:

SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
Цитата, добавленная пользователем, завершает строку в том, что касается SQL, и вы получаете проблемы. Но могло быть и хуже. Если я приду и наберу вместо этого: "x';DROP TABLE MyTable;--", то SQL получит совсем другую команду:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Которые SQL видит как три отдельные команды:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Совершенно правильный выбор
DROP TABLE MyTable;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?

И когда вы закончите обновление всего вашего приложения - потому что если вы пропустите только одно, это будет проблемой - вы вполне можете обнаружить, что ваша другая проблема исчезла в то же время.


Dani Solis

Извините

Я новичок, и правда в том, что
Я не знаю, как использовать его параметризованные запросы. То, что я делаю, - это просто школьный проект.
А если резервные копии делаются с помощью кнопки моего приложения.

Я пытаюсь с этой модификацией, но получаю ошибку:

//SQL STMT
String sql = @"UPDATE p SET p.IdLEADS=@IdLEADS, pIdBundles=@IdBUNDLES, pIdLOCALES=@IdLOCALES FROM tLEADS p INNER JOIN p INNER JOIN tBUNDLES c INNER JOIN tLOCALES e ON cIdBUNDLES = e.IdLOCALES ON p.IdLEADS = tbl.BUNDLES.IdBUNDLES WHERE IdLEADS = @IdLEADS";// (tBUNDLES INNER JOIN tLOCALES ON tBUNDLES.IdBUNDLES = tLOCALES.IdLOCALES) ON tLEADS.IdLEADS = tBUNDLES.IdBUNDLES SET tLEADS Mnbr='" + txtMaq.Text + "', Rack=" + txtRack.Text + ", Nivel='" + txtNiv.Text + "', Localizacion='" + txtLoc.Text + "', Atados=" + txtAta.Text + ", Reorden=" + txtReor.Text + ", Pcs_Atado=" + txtPcs.Text + ", Vol=" + txtVol.Text + ", WHERE IdLEADS = '" + txtBusLead.Text + "'";
cmd = new OleDbCommand(sql, con);
cmd.параметры.AddWithValue ("@Mnbr", txtMaq.Text);
cmd.параметры.AddWithValue("@Atados", txtAta.Text);
cmd.параметры.AddWithValue("@Reorden", txtReor.Text);
cmd.параметры.AddWithValue ("@Pcs_Atado", txtPcs.Text);
cmd.параметры.AddWithValue ("@Vol", txtVol.Text);
cmd.параметры.AddWithValue ("@Rack", txtRack.Text);
cmd.параметры.AddWithValue ("@Nivel", txtNiv.Text);
cmd.параметры.AddWithValue("@Localizacion", txtLoc.Text);

Дэн

OriginalGriff

Если вы не знаете, как использовать параметризованные запросы, то учитесь - и быстро.
Погуглите "таблицы Бобби" и не думайте, что это шутка...
Затем google "C# Access Parameterized queries" и начните читать...

Dani Solis

Да, я понимаю, но сейчас мне нужно решить эту проблему, это школьный проект.

Поэтому самым скромным образом прошу вашей помощи в решении описанной проблемы "синтаксическая ошибка"

Спасибо

Дэн