none
Instrucción DELETE en conflicto con la restricción REFERENCE en GridView1_RowDeleting RRS feed

  • Pregunta

  • Buenas, apelo a los que saben de esto :)

    Busque bastante por internet pero no aparece nada con referencia a lo que necesito/quiero.

    Tengo una tarea de administracion de perfiles que se cargan en un gridview. Habilito las funciones para editar y eliminar. Me funciona bien esto, el problema es cuando quiero borrar uno de los item y esta referenciado en otra tabla. Ahi no quiero que se pueda borrar pero me muestra un error y no me permite capturar el error. hay forma de atajarlo?

               

    protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
        {
            try
            {

    //chequeo si existe algun usuario con el perfil y si existe no lo borro, sino lo brro

                int x = Convert.ToInt32(this.GridView1.DataKeys[e.RowIndex].Values["per_id"].ToString());
                SqlDataSource2.SelectParameters["per_id"].DefaultValue = x.ToString();
                SqlDataSource2.DataSourceMode = SqlDataSourceMode.DataReader;
                SqlDataReader consulta1 = (SqlDataReader)SqlDataSource2.Select(DataSourceSelectArguments.Empty);
                if (consulta1.Read())
                {
                    Label2.Text = "El perfil no puede ser borrado ya que usuarios lo poseen";
                    return;
                }
                else
                {
                    SqlDataSource2.DeleteParameters["per_id"].DefaultValue = x.ToString();
                    int xx = SqlDataSource1.Delete();
                    GridView1.DataBind();

                }

            }
            catch(Exception ex)
            {
                Label2.Text = ex.Message;
            }

    Desde ya muchas gracias por todos los aportes.


    claudio di lorenzo

    jueves, 25 de agosto de 2016 0:09

Respuestas

  • Bueno, no podia quedarme con la duda y me puse a leer y releer y Encontre una solucion (No se si es la mejor pero tome lo que Leandro Tuttini puso en otra pregunta

    Como ejecutar un boton dentro de un gridview

    Asi que agregue un templateField con un boton dentro y utilice el RowCommand. 

    Tal vez a alguien le sirva cuando quieran borrar pero puede existir un constraint del registro que quieren borrar y no les tire un error el Gridview_RowDeleting ().

     

    En el gridview Agregue:

    OnRowCommand="GridView1_RowCommand" 

    Mas abajo agregue un templateField

    <asp:TemplateField HeaderText="Borrar">
                    <ItemTemplate>
                        <asp:Button ID="Button2" runat="server" CommandName="BOO" Text="Borrar" CommandArgument="<%# ((GridViewRow)Container).RowIndex%>"/>
                    </ItemTemplate>
                </asp:TemplateField>

    Y en el .cs  agregue lo siguiente :

    protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e) { if (e.CommandName == "BOO") { try { int Index = Convert.ToInt32(e.CommandArgument); //Aca tomo el indice del Gridview int x = Convert.ToInt32(this.GridView1.DataKeys[Index].Values["per_id"].ToString());

    //con el indice obtenido antes, obtengo el id del registro que quiero chequear para ver si borro SqlDataSource2.SelectParameters["per_id"].DefaultValue = x.ToString(); SqlDataSource2.DataSourceMode = SqlDataSourceMode.DataReader; SqlDataReader consulta1 = (SqlDataReader)SqlDataSource2.Select(DataSourceSelectArguments.Empty); if (consulta1.Read()) { Label2.Text = "El perfil no puede ser borrado ya que hay usuarios que lo poseen"; return; } else { string s = System.Configuration.ConfigurationManager.ConnectionStrings["NombreConexion"].ConnectionString; using (SqlConnection conn = new SqlConnection(s)) { conn.Open(); string query = "DELETE FROM NombreTabla WHERE per_id = @per_id"; SqlCommand cmd = new SqlCommand(query, conn); cmd.Parameters.AddWithValue("@per_id", x); cmd.ExecuteNonQuery(); } GridView1.DataBind(); } } catch (SqlException ex) { Label2.Text = ex.Message; } } }


    En fin. Muchas gracias Leandro porque veo muchos aportes tuyos y me van sacando de mas de un apriete :)


    claudio di lorenzo


    • Marcado como respuesta claudio75 viernes, 26 de agosto de 2016 0:34
    • Editado claudio75 viernes, 26 de agosto de 2016 0:36 mejorar la visualizacion del link
    viernes, 26 de agosto de 2016 0:34

Todas las respuestas

  • hola

    para que usas el SqlDataSource, prque no lo haces directo con codigo ado.net

    porque si defines el codigo con la siguiente estructura

    int x = Convert.ToInt32(this.GridView1.DataKeys[e.RowIndex].Values["per_id"].ToString());

    using (SqlConnection conn = new SqlConnection("<connection string>")) { conn.Open(); string query = "DELETE FROM NombreTabla WHERE per_id = @per_id"; SqlCommand cmd = new SqlCommand(query, conn); cmd.Parameters.AddWithValue("@per_id", x); cmd.ExecuteNonQuery(); }


    como veras es mucho mas simple el codigo, no se usa el SqlDataSource si vas a implementar esto en el evento del gridview

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta claudio75 jueves, 25 de agosto de 2016 22:02
    • Desmarcado como respuesta claudio75 jueves, 25 de agosto de 2016 22:58
    jueves, 25 de agosto de 2016 2:29
  • Leandro, probe como me decis pero da un error.

    "La acción de eliminar no es compatible con el origen de datos 'SqlDataSource1' a menos que se especifique DeleteCommand."

    El aspx quedo asi: 

    <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:casita %>" 
            SelectCommand="SELECT [per_id], [per_descripcion] FROM [perfiles]"
            UpdateCommand="UPDATE perfiles SET per_descripcion = @per_descripcion WHERE (per_id = @per_id)" 
            InsertCommand="INSERT INTO perfiles(per_descripcion) VALUES (@per_descripcion)" >
            <%--DeleteCommand="DELETE FROM perfiles WHERE per_id=@per_id">--%>
    <%--        <DeleteParameters>
                <asp:Parameter Name="per_id" />
            </DeleteParameters>--%>
            <InsertParameters>
                <asp:ControlParameter ControlID="TextBoxPerfil" Name="per_descripcion" PropertyName="Text" />
            </InsertParameters>
            <UpdateParameters>
                <asp:Parameter Name="per_descripcion" />
                <asp:Parameter Name="per_id" />
            </UpdateParameters>
        </asp:SqlDataSource>

    y para el cs quedo asi

     protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
        {
            try
            {
                int x = Convert.ToInt32(this.GridView1.DataKeys[e.RowIndex].Values["per_id"].ToString());
                SqlDataSource2.SelectParameters["per_id"].DefaultValue = x.ToString();
                SqlDataSource2.DataSourceMode = SqlDataSourceMode.DataReader;
                SqlDataReader consulta1 = (SqlDataReader)SqlDataSource2.Select(DataSourceSelectArguments.Empty);
                if (consulta1.Read())
                {
                    Label2.Text = "El perfil no puede ser borrado ya que hay usuarios que lo poseen";
                    return;
                }
                else
                {
                    string s = System.Configuration.ConfigurationManager.ConnectionStrings["casita"].ConnectionString;
                    using (SqlConnection conn = new SqlConnection(s))
                    {
                        conn.Open();
                        string query = "DELETE FROM perfiles WHERE per_id = @per_id";
                        SqlCommand cmd = new SqlCommand(query, conn);
                        cmd.Parameters.AddWithValue("@per_id", x);
                        cmd.ExecuteNonQuery();
                    }
                    GridView1.DataBind();
                }
               
            }
            catch (SqlException ex)
            {
                Label2.Text = ex.Message;
            }
        }


    claudio di lorenzo


    • Editado claudio75 jueves, 25 de agosto de 2016 23:08 probando...
    jueves, 25 de agosto de 2016 22:03
  • Bueno, no podia quedarme con la duda y me puse a leer y releer y Encontre una solucion (No se si es la mejor pero tome lo que Leandro Tuttini puso en otra pregunta

    Como ejecutar un boton dentro de un gridview

    Asi que agregue un templateField con un boton dentro y utilice el RowCommand. 

    Tal vez a alguien le sirva cuando quieran borrar pero puede existir un constraint del registro que quieren borrar y no les tire un error el Gridview_RowDeleting ().

     

    En el gridview Agregue:

    OnRowCommand="GridView1_RowCommand" 

    Mas abajo agregue un templateField

    <asp:TemplateField HeaderText="Borrar">
                    <ItemTemplate>
                        <asp:Button ID="Button2" runat="server" CommandName="BOO" Text="Borrar" CommandArgument="<%# ((GridViewRow)Container).RowIndex%>"/>
                    </ItemTemplate>
                </asp:TemplateField>

    Y en el .cs  agregue lo siguiente :

    protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e) { if (e.CommandName == "BOO") { try { int Index = Convert.ToInt32(e.CommandArgument); //Aca tomo el indice del Gridview int x = Convert.ToInt32(this.GridView1.DataKeys[Index].Values["per_id"].ToString());

    //con el indice obtenido antes, obtengo el id del registro que quiero chequear para ver si borro SqlDataSource2.SelectParameters["per_id"].DefaultValue = x.ToString(); SqlDataSource2.DataSourceMode = SqlDataSourceMode.DataReader; SqlDataReader consulta1 = (SqlDataReader)SqlDataSource2.Select(DataSourceSelectArguments.Empty); if (consulta1.Read()) { Label2.Text = "El perfil no puede ser borrado ya que hay usuarios que lo poseen"; return; } else { string s = System.Configuration.ConfigurationManager.ConnectionStrings["NombreConexion"].ConnectionString; using (SqlConnection conn = new SqlConnection(s)) { conn.Open(); string query = "DELETE FROM NombreTabla WHERE per_id = @per_id"; SqlCommand cmd = new SqlCommand(query, conn); cmd.Parameters.AddWithValue("@per_id", x); cmd.ExecuteNonQuery(); } GridView1.DataBind(); } } catch (SqlException ex) { Label2.Text = ex.Message; } } }


    En fin. Muchas gracias Leandro porque veo muchos aportes tuyos y me van sacando de mas de un apriete :)


    claudio di lorenzo


    • Marcado como respuesta claudio75 viernes, 26 de agosto de 2016 0:34
    • Editado claudio75 viernes, 26 de agosto de 2016 0:36 mejorar la visualizacion del link
    viernes, 26 de agosto de 2016 0:34