C# Запрос на обновление БД доступа не выполняется, хотя он работает так же, как и раньше - PullRequest
1 голос
/ 05 марта 2020

Я не могу всю жизнь заставить этот запрос на обновление работать.

Появляется окно с сообщением о том, что оно обновлено, но когда я смотрю, это не так! Это пример того, как данные выглядят в этих трех полях:

Syslink = {EF45612D-6321-4D19-97A5-C9497D60D628}
CMCID = 44061
SEC_ID = {00EADB9A-6158-4D2B-85E4-E381CCB02611}

Столбцы упорядочены следующим образом: SEC_ID, SYSLINK, CMCID. В представлении «Дизайн» в Access все три из этих полей являются типами данных «Число», хотя из того, что я видел в StackOverflow, это то, что это не имеет значения при использовании AddWithValue, если я не понимаю этого.

private void buttonMove_Click(object sender, EventArgs e)
{
    try
    {
        bredConn.Open();
        OleDbCommand cmd = new OleDbCommand();
        cmd.Connection = bredConn;
        cmd.CommandText = "UPDATE Component_Section SET [SEC_SYS_COMP_ID]='@Syslink',[SEC_CMC_LINK]='@Cmcid' WHERE [SEC_ID]='@Secid'";
        cmd.Parameters.AddWithValue("@Syslink", labelDebugDestinationSYSLink.Text);
        cmd.Parameters.AddWithValue("@Cmcid", labelDebugDestinationCMC.Text);
        cmd.Parameters.AddWithValue("@Secid", labelDebugSourceSECID.Text);
        cmd.ExecuteNonQuery();
        bredConn.Close();
        MessageBox.Show("Moved", "It moved", MessageBoxButtons.OK);
    }
    catch (Exception ex)
    {

        MessageBox.Show(ex.Message, "Error: On Move", MessageBoxButtons.OK, MessageBoxIcon.Error);
        bredConn.Close();
    }
}

1 Ответ

0 голосов
/ 06 марта 2020

Во-первых, я всегда избегаю использования AddWithValue для большого числа причин Я не буду go в глубине.

Я вижу две очевидные проблемы с кодом до сих пор .

  1. Тип OleDbParameter для каждого параметра выводится из-за AddWithValue. Вместо этого используйте Add и обязательно укажите правильный тип, соответствующий типу базы данных.

  2. Использование одинарных кавычек вокруг параметров в строке запроса, таких как '@Syslink'. В лучшем случае это не нужно (OleDbParameter обрабатывает это автоматически), а в худшем случае ломается, поскольку используется в основном для сравнения строк.

Внесение этих изменений дает дополнительное преимущество, так как ваши поля Text можно преобразовать в правильный тип.

Что касается вашего текущего поведения, запрос выполняется (в противном случае возникнет исключение), но фильтр WHERE не соответствует строке, которую вы ожидаете.

Внесите вышеуказанные изменения и попробуйте снова.

...