System.Data.SqlClient.SQLException: ‘Недопустимое имя столбца’Project_ID_Backend’.’

#c#

#c#

Вопрос:

Я написал это приложение на C #, которое действует как база данных для отслеживания проектов и заметок по проектам. У меня все работало нормально, но затем мне нужно было изменить столбец ProjectID, чтобы он не был целочисленным значением (идентификатор проекта начинается с букв), поэтому мне пришлось добавить новый столбец, чтобы иметь возможность принять это.

Я сохранил старый идентификатор проекта и переименовал его в «Project_ID_Backend», чтобы мой код все еще работал. (У меня это написано так, что если идентификатор проекта был больше 0, все могло произойти.

Теперь всякий раз, когда я нажимаю на datagridview, я получаю сообщение об ошибке. Раньше это работало так, что при нажатии на datagridview содержимое этой строки в таблице автоматически заполняло текстовые поля, что упрощало внесение изменений в записи.

 using System;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.Data;
using System.Collections.Generic;

namespace SFTool
{
    public partial class MainForm : Form
{
    public MainForm()
    {
        InitializeComponent();
    }

    SqlConnection con = new SqlConnection("my connection string here");

    public int ProjectIDBackend;
    public int NoteID;

    private void MainForm_Load(object sender, System.EventArgs e)
    {
        // load in sql data to the data grid view
        GetProjectsDataset();


        // load notes database into the notesDataGridView
        GetNotesDataset();


        PopulateListBoxes();
       
    }

    private void PopulateListBoxes()
    {
        List<string> ProjectStatusList = new List<string>();
        ProjectStatusList.Add("Working");
        ProjectStatusList.Add("Submitted");
        ProjectStatusList.Add("Reviewed");
        ProjectStatusList.Add("Completed");

        projectStatusListBox.DataSource = ProjectStatusList;


        List<string> ProjectTypeList = new List<string>();
        ProjectTypeList.Add("New build");
        ProjectTypeList.Add("MAC");
        ProjectTypeList.Add("Decom");

        projectTypeListBox.DataSource = ProjectTypeList;
    }

    private void GetNotesDataset()
    {
        SqlCommand cmd = new SqlCommand("SELECT * FROM sfNotes", con);

        DataTable dtNotes = new DataTable();

        con.Open();

        SqlDataReader sdr = cmd.ExecuteReader();
        dtNotes.Load(sdr);
        con.Close();

        notesDataGridView.DataSource = dtNotes;

        // Automatically resizes the columns to fit the data grid view
        notesDataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
        notesDataGridView.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None;
    }

    private void GetProjectsDataset()
    {
        
        SqlCommand cmd = new SqlCommand("SELECT Project_ID AS 'Project ID', First_Name AS 'First Name', Last_Name AS 'Last Name', Project_Type AS 'Type', Project_Status AS 'Project Status', Last_Updated AS 'Last Updated', Last_Updated_By AS 'Last Updated By', Project_ID_Backend AS 'P.ID Backend'  "  
                                        "FROM sfProjects", con);

        DataTable dt = new DataTable();

        con.Open();

        SqlDataReader sdr = cmd.ExecuteReader();
        dt.Load(sdr);
        con.Close();

        dataGridView.DataSource = dt;

        // Automatically resizes the columns to fit the data grid view
        dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
        dataGridView.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None;
    }

    private void insertButton_Click(object sender, EventArgs e)
    {
        // allow user to insert data into the database, or create new records
        if (IsValid())
        {
            SqlCommand cmd = new SqlCommand("INSERT INTO sfProjects VALUES (@Project_ID, @FirstName, @LastName, @Project_Type, @Project_Status, @Last_Updated, @Last_Updated_By)", con);
            cmd.CommandType = CommandType.Text;

            cmd.Parameters.AddWithValue("@Project_ID", projectIDTextBox.Text);
            cmd.Parameters.AddWithValue("@FirstName", firstNameTextBox.Text); // maps @FirstName to the firstName textbox
            cmd.Parameters.AddWithValue("@LastName", lastNameTextBox.Text);
            cmd.Parameters.AddWithValue("@Project_Type", projectTypeListBox.SelectedItem);
            cmd.Parameters.AddWithValue("@Last_Updated", DateTime.Now);
            cmd.Parameters.AddWithValue("@Last_Updated_By", System.Environment.MachineName);
            cmd.Parameters.AddWithValue("@Project_Status", projectStatusListBox.SelectedItem);

            con.Open();
            cmd.ExecuteNonQuery();
            con.Close();
            MessageBox.Show("New record has been successfully added to the database", "Saved", MessageBoxButtons.OK, MessageBoxIcon.Information);

            // now update/REFRESH the database so it shows the new record
            GetProjectsDataset();

            // reset form controls
            ResetFormControls();
        }
    }

    // data validation. (Make sure name is never empty)
    private bool IsValid()
    {
        if (firstNameTextBox.Text == string.Empty)
        {
            MessageBox.Show("First Name is required.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            return false;
        }

        // else return true (it is valid)
        return true; 
    }

    private bool IsNotesValid()
    {
        if (notesProjectIDTextBox.Text == string.Empty)
        {
            MessageBox.Show("Project ID is required in order to assign a note to a project.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            return false;
        }

        // else return true (it is valid/Project ID was provided)
        return true;
    }


    private void resetButton_Click(object sender, EventArgs e)
    {
        // resets, or clears, the textboxes 
        ResetFormControls();

        GetProjectsDataset();

        GetNotesDataset();
    }

    private void ResetFormControls()
    {
        ProjectIDBackend = 0; // resets value of projectID after clicking reset

        projectIDTextBox.Clear();
        firstNameTextBox.Clear();
        lastNameTextBox.Clear();
        projectTypeListBox.ClearSelected();
        projectStatusListBox.ClearSelected();
        notesProjectIDTextBox.Clear();
        notesTextBox.Clear();
        searchProjectsTextBox.Clear();

        projectIDTextBox.Focus();
    }

    private void dataGridView_CellClick(object sender, DataGridViewCellEventArgs e)
    {
        // WHen you click on a row in the data grid, the textboxes will automatically populate with that rows values

        ProjectIDBackend = Convert.ToInt32(dataGridView.SelectedRows[0].Cells[7].Value);

        projectIDTextBox.Text = dataGridView.SelectedRows[0].Cells[0].Value.ToString();
        firstNameTextBox.Text = dataGridView.SelectedRows[0].Cells[1].Value.ToString();
        lastNameTextBox.Text = dataGridView.SelectedRows[0].Cells[2].Value.ToString();
        projectTypeListBox.SelectedItem = dataGridView.SelectedRows[0].Cells[3].Value.ToString();
        projectStatusListBox.SelectedItem = dataGridView.SelectedRows[0].Cells[4].Value.ToString();


        // Filter the notes grid to only show notes for the row the user clicks 
        SqlCommand cmd = new SqlCommand("SELECT * FROM sfNotes WHERE Project_ID_Backend= @Project_ID_Backend", con);
        cmd.CommandType = CommandType.Text;

        cmd.Parameters.AddWithValue("@Project_ID_Backend", this.ProjectIDBackend); 

        con.Open();
        cmd.ExecuteNonQuery();
        con.Close();



        DataTable dtF = new DataTable();

        con.Open();

        SqlDataReader sdr = cmd.ExecuteReader();
        dtF.Load(sdr);
        con.Close();

        notesDataGridView.DataSource = dtF;

        // Automatically resizes the columns to fit the data grid view
        notesDataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
        notesDataGridView.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None;

        

    }

    private void updateButton_Click(object sender, EventArgs e)
    {
        
        if (ProjectIDBackend > 0)
        {
            SqlCommand cmd = new SqlCommand("UPDATE sfProjects SET Project_ID= @Project_ID, First_Name= @First_Name, Last_Name= @Last_Name, Project_Type= @Project_Type, Project_Status= @Project_Status, Last_Updated= @Last_Updated, Last_Updated_By= @Last_Updated_By WHERE Project_ID= @Project_ID", con);
            cmd.CommandType = CommandType.Text;

            cmd.Parameters.AddWithValue("@Project_ID", projectIDTextBox.Text);
            cmd.Parameters.AddWithValue("@First_Name", firstNameTextBox.Text);
            cmd.Parameters.AddWithValue("@Last_Name", lastNameTextBox.Text);
            cmd.Parameters.AddWithValue("@Project_Type", projectTypeListBox.SelectedItem);
            cmd.Parameters.AddWithValue("@Project_Status", projectStatusListBox.SelectedItem);
            cmd.Parameters.AddWithValue("@Last_Updated", DateTime.Now);
            cmd.Parameters.AddWithValue("@Last_Updated_By", System.Environment.MachineName);
            cmd.Parameters.AddWithValue("@Project_ID_Backend", this.ProjectIDBackend);

           


            con.Open();
            cmd.ExecuteNonQuery();
            con.Close();

            MessageBox.Show("Record is successfully updated", "Updated", MessageBoxButtons.OK, MessageBoxIcon.Information);

            // now update/REFRESH the database so it shows the new record
            GetProjectsDataset();

            // reset form controls
            ResetFormControls();

        }
        else
        {
            MessageBox.Show("Please select a record to update", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);

        }
    }

    private void deleteButton_Click(object sender, EventArgs e)
    {
        // Confirm user wants to delete by asking "Are you sure?"
        var confirmDelete = MessageBox.Show("Are you sure you want to delete this record? This action cannot be undone.",
                                 "Confirm Delete",
                                 MessageBoxButtons.YesNo, 
                                 MessageBoxIcon.Warning);

        if (confirmDelete == DialogResult.Yes)
        {
            if (ProjectIDBackend > 0)
            {
                SqlCommand cmd = new SqlCommand("DELETE FROM sfProjects WHERE Project_ID_Backend= @Project_ID_Backend", con);
                cmd.CommandType = CommandType.Text;

                cmd.Parameters.AddWithValue("@Project_ID_Backend", this.ProjectIDBackend); // Project_ID equals "this" ProjectID that I clicked on

                con.Open();
                cmd.ExecuteNonQuery();
                con.Close();

                MessageBox.Show("Record is successfully deleted from the system", "Updated", MessageBoxButtons.OK, MessageBoxIcon.Information);

                // now update/REFRESH the database so it shows the new record
                GetProjectsDataset();

                // reset form controls
                ResetFormControls();
            }
            else
            {
                MessageBox.Show("Please select a record to delete", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        else
        {

        }

        
    }

    private void notesButton_Click(object sender, EventArgs e)
    {
        // Addes note into the database
        if (IsNotesValid())
        {
            SqlCommand cmd = new SqlCommand("INSERT INTO sfNotes VALUES (@Project_ID, @Notes, @Note_Created, @Note_Created_By)", con);
            cmd.CommandType = CommandType.Text;

            cmd.Parameters.AddWithValue("@Project_ID", notesProjectIDTextBox.Text); // maps @Project_ID to the notesProjectID textbox
            cmd.Parameters.AddWithValue("@Notes", notesTextBox.Text);
            cmd.Parameters.AddWithValue("@Note_Created", DateTime.Now);
            cmd.Parameters.AddWithValue("@Note_Created_By", System.Environment.MachineName);


            con.Open();
            cmd.ExecuteNonQuery();
            con.Close();
            MessageBox.Show("New note has been successfully added to the database for Project ID "   this.ProjectIDBackend, "Saved", MessageBoxButtons.OK, MessageBoxIcon.Information);

            // now update/REFRESH the database so it shows the new record
            GetProjectsDataset();
            GetNotesDataset();

            // reset form controls
            ResetFormControls();
        }

    }

    private void notesDataGridView_CellClick(object sender, DataGridViewCellEventArgs e)
    {
        // WHen you click on a row in the data grid, the textboxes will automatically populate with that rows values
      
         NoteID = Convert.ToInt32(notesDataGridView.SelectedRows[0].Cells[0].Value);

         notesProjectIDTextBox.Text = notesDataGridView.SelectedRows[0].Cells[1].Value.ToString();
         notesTextBox.Text = notesDataGridView.SelectedRows[0].Cells[2].Value.ToString();
       
    
    }

    private void removeNote_Click(object sender, EventArgs e)
    {
        // Confirm user wants to delete by asking "Are you sure?"
        var confirmDelete = MessageBox.Show("Are you sure you want to delete this note? This action cannot be undone.",
                                 "Confirm Delete",
                                 MessageBoxButtons.YesNo,
                                 MessageBoxIcon.Warning);

        if (confirmDelete == DialogResult.Yes)
        {
            if (NoteID > 0)
            {
                SqlCommand cmd = new SqlCommand("DELETE FROM sfNotes WHERE Note_ID= @Note_ID", con);
                cmd.CommandType = CommandType.Text;

                cmd.Parameters.AddWithValue("@Note_ID", this.NoteID); // @Note_ID equals "this" NoteID that I clicked on

                con.Open();
                cmd.ExecuteNonQuery();
                con.Close();

                MessageBox.Show("Note is successfully deleted from the system", "Updated", MessageBoxButtons.OK, MessageBoxIcon.Information);

                // now update/REFRESH the database so it shows the new record
                GetProjectsDataset();
                GetNotesDataset();

                // reset form controls
                ResetFormControls();
            }
            else
            {
                MessageBox.Show("Please select a note to delete", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        else
        {

        }
    }

    private void searchProjectsButton_Click(object sender, EventArgs e)
    {
        SqlCommand cmd = new SqlCommand("SELECT * FROM sfProjects WHERE Project_ID= @Project_ID", con);
        cmd.CommandType = CommandType.Text;

        cmd.Parameters.AddWithValue("@Project_ID", searchProjectsTextBox.Text); // maps @Project_ID to the search projects textbox
        
        con.Open();
        cmd.ExecuteNonQuery();
        con.Close();

   

        DataTable dtS = new DataTable();

        con.Open();

        SqlDataReader sdr = cmd.ExecuteReader();
        dtS.Load(sdr);
        con.Close();

        dataGridView.DataSource = dtS;

        // Automatically resizes the columns to fit the data grid view
        dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
        dataGridView.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None;

        // reset form controls
        ResetFormControls();
    }

    private void searchNotesButton_Click(object sender, EventArgs e)
    {
        SqlCommand cmd = new SqlCommand("SELECT * FROM sfNotes WHERE Project_ID= @Project_ID", con);
        cmd.CommandType = CommandType.Text;

        cmd.Parameters.AddWithValue("@Project_ID", searchNotesTextBox.Text); // maps @Project_ID to the search projects textbox

        con.Open();
        cmd.ExecuteNonQuery();
        con.Close();



        DataTable dtS = new DataTable();

        con.Open();

        SqlDataReader sdr = cmd.ExecuteReader();
        dtS.Load(sdr);
        con.Close();

        notesDataGridView.DataSource = dtS;

        // Automatically resizes the columns to fit the data grid view
        notesDataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
        notesDataGridView.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None;

        // reset form controls
        ResetFormControls();
    }
}
}
  

Это раздел, в котором возникает ошибка:

 // Filter the notes grid to only show notes for the row the user clicks 
        SqlCommand cmd = new SqlCommand("SELECT * FROM sfNotes WHERE Project_ID_Backend= @Project_ID_Backend", con);
        cmd.CommandType = CommandType.Text;

        cmd.Parameters.AddWithValue("@Project_ID_Backend", this.ProjectIDBackend); 

        con.Open();
        cmd.ExecuteNonQuery();
        con.Close();
  

РЕШЕНИЕ: Проблема заключалась в том, что я не «обновил» базу данных в SSMS после ее сохранения.

Комментарии:

1. Сообщение об исключении сообщает вам, что в таблице базы данных SQL нет столбца с именем «Project_ID_Backend». Вы проверили схему таблицы в самой таблице DB и внесли какие-либо изменения?

2. Подобное исключение SQL сообщает вам, в чем проблема, и я бы вернулся и дважды проверил основы. Во время выполнения в базе данных, к которой вы подключены, нет столбца с именем Project_ID_Backend в таблице sfNotes. * Вы работаете с несколькими базами данных? * Вы подключены к правильной базе данных и просматриваете ее? * Внесли ли вы изменения в столбец в правильной базе данных? * вы уверены, что созданная схема такая же, в имени столбца нет опечаток?

3. @Luke, Вау, это было все, что было. Я действительно добавил этот столбец в базу данных и проверил несколько раз. Проблема заключалась в том, что я не «обновил» базу данных в SSMS после ее сохранения.

4. @Kajin случается с лучшими из людей 😉 — кроме того, я не думаю, что именно обновление устранило вашу проблему (при условии, что вы используете SSMS). Транзакция происходит при сохранении, обновление просто обновляет ваше представление. Я предполагаю, что вы забыли сохранить в первый раз.

5. @Luke, ну, если это так, то ты, должно быть, прав! Я мог бы поклясться, что сохранил его в первый раз. Спасибо за помощь в любом случае! 🙂

Ответ №1:

Проверьте документацию об исключении: https://learn.microsoft.com/en-us/dotnet/api/system.data.sqlclient.sqlexception?view=dotnet-plat-ext-3.1

Исключение, которое возникает, когда SQL Server возвращает предупреждение или ошибку.

И послание:

Получает сообщение, описывающее текущее исключение

Таким образом, исключение указывает на то, что запрос был выполнен в базе данных, и это сообщение является тем, что вернула база данных. Это наводит меня на мысль об одной из двух вещей.

  1. Неправильная строка подключения

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

  1. Вы передаете ожидающую транзакцию

Вы запустили скрипт в транзакции, которую вы не фиксировали.

Откройте Management Studio и подключитесь к базе данных, к которой подключается ваше приложение. Попробуйте выполнить запрос.

Также проверьте профиль, который вы создаете / запускаете приложение. Возможно, это релиз, и вы преобразовали строку подключения