I have a indexed column in my ms-sql table that doesn't allow for duplicates. I wrote a add page that works fine. I use the sqldatasource_inserted method to catch the sql error. When trying to wirte the edit page, I don't get the error thrown. If I click on Update, it will NOT update the database with the new value, but it won't throw an error either. It will actually throw the "Updated" text. I would like to let the user know that it hasn't been updated due to the fact that they used something that has already been used.I am using a sqldatasource to bind a gridview and use the standard editing capabilities.Do I have to look somewhere else other than the datasources updated event? I assumed that this was the proper area because with the detailsview, I use the inserted event of the datasource and that works fine.Here is my code-behind for the page (removed most comments to reduce size):public partial class Inventory_Companies : System.Web.UI.Page{ // instantiate a variable to use as a trigger to help handle multiple errors protected bool isvalid = false; protected string form_desc = "company"; protected string required_fields = "company name";
protected void Page_Load(object sender, EventArgs e) { lblError.Text = ""; lblError.BackColor = System.Drawing.Color.Transparent; }
protected void SqlDataGridView1_Updated(object sender, SqlDataSourceStatusEventArgs e) { // if the exception isn't null there is a problem if (e.Exception != null) { // create a new sql exception so that we can get the error code SqlException ex = e.Exception as SqlException; if (ex != null) { // start building the error because we know we will need it at this point lblError.Text = "<font color=red>"; // check to see if it is because of the unique constraint on the table in the db if (ex.Number == 2627) { // if it is. Let them know that they can't use a duplicate value lblError.Text += "The " + required_fields + " for the " + form_desc + " is already in use.<br>"; lblError.Text += "Try again using a different name."; } else { // if not, we need to let them know we don't know why and show them the error given lblError.Text += "There was an unknown error updating the " + form_desc + ".<br>"; lblError.Text += "Please contact the Information Services department and give them this error"; lblError.Text += "<br>" + e.Exception.Message.ToString() + "<br>"; } // end the label text and set the background to a more noticable color lblError.Text += "</font>"; lblError.BackColor = System.Drawing.Color.Linen; e.ExceptionHandled = true; // let the compiler know we handled the error } } else { // no sql errors, so set the trigger to check for the gridview row update for more errors isvalid = true; } }
protected void SqlDataGridView1_Deleted(object sender, SqlDataSourceStatusEventArgs e) { // if e is not null, then there is an error and we have to deal with it if (e.Exception != null) { // set the error text and background color. Also tell the compiler that we handled the error lblError.Text = "<font color=red>"; lblError.Text += "There was an unknown error deleting the device.<br>"; lblError.Text += "Please contact the Information Services department and give them this error"; lblError.Text += "<br>" + e.Exception.Message.ToString() + "<br>"; lblError.Text += "</font>"; lblError.BackColor = System.Drawing.Color.Linen; e.ExceptionHandled = true; } else { // no errors, so we can set the trigger to let the gridview check for more asp.net related errors isvalid = true; } }
protected void GridView1_RowUpdated(object sender, GridViewUpdatedEventArgs e) { // if the trigger hasn't been tripped, we can check for errors, otherwise we already have sql errors that we dealt with if (isvalid) { // if exception isn't null, there is an error if (e.Exception != null) { // set the text to let them know and display the actual error message so they can let us know the error lblError.Text = "<font color=red>There was a problem updating the " + form_desc + ". Recheck your information."; lblError.Text += "<br>Error: " + e.Exception.Message.ToString() + "</font>"; lblError.BackColor = System.Drawing.Color.Linen; // change to a more noticable color e.ExceptionHandled = true; // tell the compiler that we took care of the error, so it doesn't have to } else { lblError.Text = "<font color=black>Updated</font>"; } } else { // When an exception occurs, keep the DetailsView control in insert mode. e.KeepInEditMode = true; } }
protected void GridView1_RowDeleted(object sender, GridViewDeletedEventArgs e) { // if trigger hasn't been triggered, there were no sql errors, so we can check for asp.net errors if (isvalid) { // if exception isn't null, then there are errors if (e.Exception != null) { // set the label to tell them there was something wrong and display the message lblError.Text = "<font color=red>There was an error deleting the " + form_desc + " . Please contact Information Services."; lblError.Text += "<br>Error: " + e.Exception.Message.ToString() + "</font>"; lblError.BackColor = System.Drawing.Color.Linen; e.ExceptionHandled = true; } } }}