Я создаю инструмент на своей работе, который позволяет мне напрямую обновлять некоторые значения в базе данных. Вот кусок кода, который работает как шарм. Я создал соединение и команду на глобальном уровне.
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);
}
}
}