Ошибка SQL 137, состояние 2, класс 15, приложение SQL не работает - PullRequest
0 голосов
/ 26 февраля 2019

Я программирую кнопку для приложения C #, где показывает, затем позволяет пользователю изменить детали (например, номер телефона, адрес), а затем он заменяет ее старыми значениями в базе данных SQL, я не уверенесли что-то не так с написанным мною кодом SQL или это связано с кодом C #.Также я очень плохо знаком с кодированием;поэтому мне очень жаль, если мой код смущает вас.Строка подключения ---

    <connectionStrings>
    <add name="connstrng" connectionString="Data Source=DESKTOP-MJ61J7L\SQLEXPRESS;Initial Catalog=Econtact;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False"/>
  </connectionStrings>

Класс, называемый ContactClass ----

class contactClass
{
    //getter and setter properties
    //acts as data carrier in our application

    public int ContactID { get; set; }

    public string FirstName { get; set; }

    public string LastName { get; set; }

    public string ContactNo { get; set; }

    public string Address { get; set; }

    public string Gender { get; set; }

public bool Update(contactClass c)
    {
        bool isSuccess = false;
        SqlConnection conn = new SqlConnection(myconnstrng);
        try
        {
            string sql = "UPDATE tbl_contact SET FirstName=@FirstName, LastName=@LastName, ContactNo=@ContactNo, Address=@Address, Gender=@Gender WHERE ContactID=@ContactID";
            SqlCommand cmd = new SqlCommand(sql, conn);
            cmd.Parameters.AddWithValue("@FirstName", c.FirstName);
            cmd.Parameters.AddWithValue("@LastName", c.LastName);
            cmd.Parameters.AddWithValue("@ContactNo", c.ContactNo);
            cmd.Parameters.AddWithValue("@Address", c.Address);
            cmd.Parameters.AddWithValue("@Gender", c.Gender); 
            cmd.Parameters.AddWithValue("@ContactID", c.ContactID);
            //open database connection
            conn.Open();

            int row = cmd.ExecuteNonQuery();

            if (row != 0)
            {
                isSuccess = true;
            }
            else
            {
                isSuccess = false;
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
        }
        finally
        {
            conn.Close();
        }
        Console.WriteLine(isSuccess);
        return isSuccess;
    }

Кнопка обновления (при нажатии)

private void btnUpdate_Click(object sender, EventArgs e)
    {
        c.FirstName = txtboxFirstName.Text;
        c.LastName = txtboxLastName.Text;
        c.ContactNo = txtboxPhonenumber.Text;
        c.Address = txtboxAddress.Text;
        c.Gender = cmbGender.Text;
        //update data in the database
        bool success = c.Update(c);
        if(success==true)
        {
            MessageBox.Show("Contact has been successfully updated.");
        }
        else
        {
            MessageBox.Show("Unsuccesfull");
        }
     }  

Также (на всякий случай) данные извлекаются из базы данных sql

private void dgvContactList_RowHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
    {
        //get data grid view and load it into textboxes
        //identify which row mouse is clicked
        int rowIndex = e.RowIndex;
        txtBoxContactID.Text = dgvContactList.Rows[rowIndex].Cells[0].Value.ToString();
        txtboxFirstName.Text = dgvContactList.Rows[rowIndex].Cells[1].Value.ToString();
        txtboxLastName.Text = dgvContactList.Rows[rowIndex].Cells[2].Value.ToString();
        txtboxPhonenumber.Text = dgvContactList.Rows[rowIndex].Cells[3].Value.ToString();
        txtboxAddress.Text = dgvContactList.Rows[rowIndex].Cells[4].Value.ToString();
        cmbGender.Text = dgvContactList.Rows[rowIndex].Cells[5].Value.ToString();
    }

Ответы [ 4 ]

0 голосов
/ 28 февраля 2019

Я добавил c.ContactID = int.Parse(txtBoxContactID.Text); в мою функцию btn_UpdateClick.Спасибо за советы и советы, ребята.

0 голосов
/ 26 февраля 2019

Вы должны объявить все переменные.Здесь вы пропустили переменную "@ContactID"

cmd.Parameters.AddWithValue("@ContactID", c.ContactID)
0 голосов
/ 26 февраля 2019

Вы забыли добавить переменную ContactId.Вам также следует использовать операторы USING, поскольку текущий код не освобождает ресурсы должным образом, например:

private static void ExecuteSqlCommand(string queryString,
string connectionString)
{
    using (SqlConnection connection = new SqlConnection(
           connectionString))
    {
        try
        {
            using(var command = new SqlCommand(queryString, connection))
            {
            command.Connection.Open();
            var result = command.ExecuteNonQuery();
            // Do whats needed with the result.
            }
        }
        catch (InvalidOperationException)
        {
            //log and/or rethrow or ignore
        }
        catch (SqlException)
        {
            //log and/or rethrow or ignore
        }
        catch (ArgumentException)
        {
            //log and/or rethrow or ignore
        }
    }
}

Это не безупречный пример, но достаточно для начала работы.

0 голосов
/ 26 февраля 2019

Вы забыли указать значение для параметра @ContactID.

Решение:

cmd.Parameters.AddWithValue("@ContactID", c.ContactID);

В стороне: есть веская причина дляникогда не используйте AddWithValue: он может использовать тип object вместо более конкретного типа, который вы ожидаете использовать, что может вызвать проблемы с обнаружением записей, которые не найдены, или значения параметров не сохранены правильно.

Переписанная (улучшенная) версия:

cmd.Parameters.Add("@ContactID", SqlDbType.Int).Value = c.ContactID;

Это относится ко всем параметрам SQL, лучше всегда использовать этот стиль передачи параметров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...