При обновлении таблицы Oracle из C# иногда вносятся изменения, а иногда затрагиваются 0 строк. - PullRequest
0 голосов
/ 31 января 2020

Я создаю инструмент на своей работе, который позволяет мне напрямую обновлять некоторые значения в базе данных. Вот кусок кода, который работает как шарм. Я создал соединение и команду на глобальном уровне.

private void btnChangeLanguage_Click(object sender, RoutedEventArgs e)
        {
            if(cbxGroupsList.SelectedIndex != -1 && cbxLanguages.SelectedIndex != -1)
            {
                try
                {
                    command.Parameters.Clear();
                    //Creating Parameters
                    command.Parameters.Add("p_Languages", cbxLanguages.SelectedItem.ToString().Substring(1, 5));
                    command.Parameters.Add("p_Group", cbxGroupsList.SelectedItem.ToString());
                    //Creating the query with the previously created parameters
                    command.CommandText = "UPDATE USERS SET LANG = :p_Language WHERE USER_ID = :p_Group";
                    command.CommandType = CommandType.Text;

                    //Executing the update comand
                    int rowsAffected = command.ExecuteNonQuery();

                    //If there are no problems, update the status label
                    UpdateStatusBar(rowsAffected);
                }
                catch (Exception error)
                {
                    lblStatus.Content = error;
                    Console.WriteLine(error);
                }
            }

        }

Этот код выполняется должным образом. Запись обновляется, и функция ExecuteNonQuery () возвращает значение 1.

Проблема заключается в том, что при выполнении следующего кода функция ExecutenonQuery () возвращает значение 0, что означает, что данные не были обновлены. (это не было обновлено, я проверил непосредственно в базе данных).

private void btnChangeGroup_Click(object sender, RoutedEventArgs e)
        {

            //Clearing the status label
            ClearStatusMessage();

            //Making sure the values are not empty
            if ((txtEmpID.Text != "" || txtEmpID.Text == "EMP ID...") && cbxGroups.SelectedIndex != -1)
            {
                try
                {
                    //PARAMETERS== name of parameter, parameter data type, parameter value, direction of parameter. 
                    command.Parameters.Clear();
                    command.Parameters.Add("p_EmpID", txtEmpID.Text);
                    command.Parameters.Add("p_UserID", cbxGroups.SelectedItem.ToString());
                    command.CommandType = CommandType.Text;

                    //Creating the query with the previously created parameters

                    command.CommandText ="UPDATE WEB_ACCESS SET USER_ID = :p_UserID WHERE EMP_ID = :p_EmpID";
                    //Executing the update comand
                    int rowsAffected = command.ExecuteNonQuery();

                    //If there are no problems, update the status label
                    UpdateStatusBar(rowsAffected);


                }
                catch (Exception error)
                {
                    lblStatus.Content = error;
                    Console.WriteLine(error);
                }
            }
            else
            {
                lblStatus.Content = "Do not leave anything blank please";
            }
        }

Как видите, я делаю то же самое в обеих кнопках. Единственный способ заставить вторую кнопку работать так, как я ожидал, - передать значения непосредственно в строку с помощью строки. Функция Format ()

command.CommandText = string.Format("UPDATE WEB_ACCESS SET USER_ID = '{0}' WHERE EMP_ID = '{1}'", cbxGroups.SelectedItem.ToString(), txtEmpID.Text);

Я пробовал несколько вещей и не могу заставить ее работать передавая параметры, как я хотел бы. Есть идеи, что я делаю не так? Заранее спасибо

Отредактированный сеанс: обратите внимание, как я заказал объявление параметров

 private void btnUnlockAccount_Click(object sender, RoutedEventArgs e)
        {
            ClearStatusMessage();

            string hashForPwA = "E1-62-52-39-EB-68-DE-75-DD-49";

            if (txtUnlockEmpID.Text != "")
            {
                try
                {
                    command.Parameters.Clear();

                    //Creating Parameters
                    command.Parameters.Add(new OracleParameter("p_UserPass", hashForPwA));
                    command.Parameters.Add(new OracleParameter("p_Access", "A"));
                    command.Parameters.Add(new OracleParameter("p_EmpID",txtUnlockEmpID.Text));
                    command.CommandType = CommandType.Text;
                    //Creating the query with the previously created parameters
                    command.CommandText = "UPDATE WEB_ACCESS SET USER_PASS = :p_UserPass, ACCESS_STATUS = :p_Access WHERE USER_ID = :p_EmpID";


                    //Executing the update comand
                    int rowsAffected = command.ExecuteNonQuery();

                    //If there are no problems, update the status label
                    UpdateStatusBar(rowsAffected);
                }
                catch (Exception error)
                {
                    lblStatus.Content = error;
                    Console.WriteLine(error);
                }
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...