none
Como borrar un registro de 2 tablas de datos sqlServer al mismo tiempo RRS feed

  • Pregunta

  • Hola buenas como lo dice el titulo como puedo borrar 2 o mas información de 2 base de datos tablas diferentes al mimo tiempo apretando un botón. vb

    ej: tengo una tabla para registrar clientes para login, otra tabla donde se almacena información, y atreves de un combobox veo el listado de todos los clientes registrados, y al seleccionar 1 y presionar un botón se borre dicho cliente de ambas tablas, tanto login como la que almacena la información.

    Lo que hice algo bien simple que me funciona pero solo borra 1 tabla pero no la otra, intente duplicar el código y agregar el nombre de la otra tabla pero no medio.

    Con3.Open()

            Dim cmd As New SqlCommand("DELETE FROM MEMB_INFO WHERE memb___id='" & CUENTAS.Text & "'", Con3)

    cmd.ExecuteNonQuery()

            Con3.Close()

    gracias de ante mano.

    martes, 10 de marzo de 2020 5:30

Respuestas

  • Tiene que ir con espacios en blanco en lugar de las comillas simples:

    Dim adaptador As New SqlDataAdapter("select * from " + My.Settings.nametabla + " WHERE ...

    • Marcado como respuesta pedro557 martes, 10 de marzo de 2020 23:53
    martes, 10 de marzo de 2020 20:09

Todas las respuestas

  • Podrías simplemente poner los dos DELETE en la consulta separados con punto y coma:

    ... New SqlCommand("DELETE FROM MEMB_INFO WHERE ...; DELETE FROM otraTabla WHERE ...", Con3)

    pero asegúrate de que parametrizas la sentencia en lugar de concatenar el valor de CUENTAS.Text. Al concatenarlo, tu código se vuelve vulnerable ante ataques de inyección de SQL (piensa en lo que ocurriría si el usuario teclea un trozo de SQL en el textbox CUENTAS -- podría hacer "de todo" con tu base de datos).

    martes, 10 de marzo de 2020 11:56
  • gracias por tu respuesta pero no uso  TextBox si no un combobox, ahora en las dos tablas tengo dos id diferentes no son iguales como hago referencia a uno y otro  de igual forma ya que ocuparan el mismo combobox, el nombre del usuario sera el mismo en ambas tablas pero los id no.

    DELETE FROM MEMB_INFO WHERE memb___id='" & CUENTAS.Text  &

    DELETE FROM Character WHERE AccountID='" & CUENTAS.Text & 

    gracias y espero puedas darme otro consejo amigo.

    martes, 10 de marzo de 2020 15:55
  •  no uso  TextBox si no un combobox

    Si es un ComboBox, no uses el .Text. El .Text solo te devuelve el valor del ComboBox cuando el usuario lo ha tecleado a mano. Pero si el usuario ha seleccionado un valor de la lista desplegable, entonces el .Text llega vacio, y lo que tienes que usar es el .SelectedItem.

    Por supuesto, el .SelectedItem sera un tipo complejo (y no un sencillo string) si es que originalmente cargaste el combo con datos complejos, por lo que antes de usarlo tendras que hacerle un cast al tipo correcto (el mismo que hayas usado cuando lo cargaste de datos) y luego acceder a las propiedades de ese tipo.

    Haz todo eso primero con un bloque de codigo completamente separado de la consulta SQL, metiendo el resultado en variables. Pon un punto de ruptura con el debugger y ejecutalo, cerciorandote de que en las variables te llegan los valores correctos segun lo que has seleccionado en el combo. Y una vez que hayas validado que esa parte te funciona bien, entonces ya es muy sencillo, basta con que tomes esas dos variables y las metas (respectivamente) en cada uno de los "where" de las dos "delete".

    martes, 10 de marzo de 2020 16:10
  • Buen dia, usa procedimiento almacenados.

    Primero lo creas en tu base de datos de esta forma:

    USE NOMBREBASEDEDATOS;  
    GO  
    CREATE PROCEDURE HumanResources.uspGetEmployeesTest2   
        @BorrarUsuario int,   
    
    AS   
    
        SET NOCOUNT ON;  
    
    	DELETE FROM MEMB_INFO WHERE memb___id= @BorrarUsuario 
    
    	DELETE FROM TABLA2 WHERE memb___id= @BorrarUsuario 
     
    GO  

    Después para ejecutarlo desde tu aplicación, ve el siguiente ejemplo:

            public void Insertar(IDUsuario int)
            {
                SqlDatabase dbSQL = DatabaseFactory.CreateDatabase("ConnectionString") as SqlDatabase;
                DbCommand cmd = dbSQL.GetStoredProcCommand("HumanResources.uspGetEmployeesTest2");
                try
                {
                    dbSQL.AddInParameter(cmd, "@BorrarUsuario", DbType.String, IDUsuario);
                    dbSQL.ExecuteNonQuery(cmd);
                }
                catch (SqlException sqlEx)
                {
                    ApplicationException errorSQL = new ApplicationException(sqlEx.Message);
                    errorSQL.Source = "HumanResources.uspGetEmployeesTest2";
                    throw errorSQL;
                }
                catch (Exception ex)
                {
                    ApplicationException errorSistema = new ApplicationException(ex.Message);
                    errorSistema.Source = "HumanResources.uspGetEmployeesTest2";
                    throw errorSistema;
                }
                finally
                {
                    //cmd.Connection.Close();
                    dbSQL = null;
                    cmd = null;
                }
            }

    Te aviso, no lo compile. Así que puede que si lo copias y lo pegas tal vez tendrás que depurarlo un poco. PEro con gusto te puedo ayudar si hay algún error.

    El siguiente enlace es por si quieres leer mas sobre los procedimientos almacenados

    https://docs.microsoft.com/en-us/sql/relational-databases/stored-procedures/create-a-stored-procedure?view=sql-server-ver15


    • Editado aelp martes, 10 de marzo de 2020 17:05
    martes, 10 de marzo de 2020 17:03
  • bueno ya logre solucionar el problema pero tengo otro y para no abrir un nuevo post lo dejo aquí, agrega un texbox para buscar un usuario y que me muestre su información dentro de los texbox correspondiente ya sea nombre edad etc. pero ahora si yo quiero renombrar o quiero usar una tabla diferente tendría que ir al código y cambiar los nombres de las talas cada vez, por eso hice un área de ajustes para hacer ese procedimiento sin tener que modificar el código directa mente y que se haga atreves del mismo programa. la información al marcenada quedara en

    My.Settings.nametabla pero como agrego eso al select*from lo intete asi como se muestra pero nada meda error de sintaxis

    Dim adaptador As New SqlDataAdapter("select*from'" + My.Settings.nametabla + "'WHERE AccountID='" & Form4.BuscarUser.Text & "'", cn)

    si me pueden ayudar gracias.



    • Editado pedro557 martes, 10 de marzo de 2020 20:01
    • Marcado como respuesta pedro557 martes, 10 de marzo de 2020 23:53
    • Desmarcado como respuesta pedro557 martes, 10 de marzo de 2020 23:53
    martes, 10 de marzo de 2020 19:59
  • Tiene que ir con espacios en blanco en lugar de las comillas simples:

    Dim adaptador As New SqlDataAdapter("select * from " + My.Settings.nametabla + " WHERE ...

    • Marcado como respuesta pedro557 martes, 10 de marzo de 2020 23:53
    martes, 10 de marzo de 2020 20:09
  • gracias amigo me funciona y agradezco a todos los que me respondieron. 
    martes, 10 de marzo de 2020 23:54