#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 возвращает предупреждение или ошибку.
И послание:
Получает сообщение, описывающее текущее исключение
Таким образом, исключение указывает на то, что запрос был выполнен в базе данных, и это сообщение является тем, что вернула база данных. Это наводит меня на мысль об одной из двух вещей.
- Неправильная строка подключения
Вы внесли изменения в базу данных, которая отличается от той, к которой подключено ваше приложение. Разработчик или тестовый экземпляр, который вы еще не обновили
- Вы передаете ожидающую транзакцию
Вы запустили скрипт в транзакции, которую вы не фиксировали.
Откройте Management Studio и подключитесь к базе данных, к которой подключается ваше приложение. Попробуйте выполнить запрос.
Также проверьте профиль, который вы создаете / запускаете приложение. Возможно, это релиз, и вы преобразовали строку подключения