none
Base de datos y c# RRS feed

  • Pregunta

  • En mi base de datos tengo una tabla con solo un atributo y quiero modificarlo desde c#, pero cada vez que intento hacerlo me modifica todas las filas que tengo. ¿Como puedo limitar a que solo me modifique una linea?.

    ¿Puedo asociarlo con alguna otra tabla?

    jueves, 27 de febrero de 2020 17:43

Todas las respuestas

  • Hola Katsa

    Parece que falta un poco de información en tu pregunta.

    Te contesto lo que entendí:

    Para modificar una sola fila (con UPDATE en un SqlCommand, supongo) tenes que agregar una cláusula WHERE, por ejemplo:

    UPDATE Tabla SET campo = "lo que sea"

    WHERE Id = "el Id de la fila que quieras modificar"

    Si no es esto, por favor explicame un poco mejor que es lo que necesitas

    Saludos

    Pablo

    jueves, 27 de febrero de 2020 18:16
  • Tengo mi tabla Operadores (son datos de prueba)

    Pero como se aprecia solo tengo un campo, y quiero modificarlo desde c# el problema es que no tengo otro dato para hacerlo. Y necesito que se modifique solo una fila por ejemplo "a"

    Anteriormente me comentaron que quitando el WHERE, pero cuando lo hice se modificaron todas las filas. 

    ¿Puedo llamar desde otra tabla para hacer esto?


    • Editado Katsa jueves, 27 de febrero de 2020 18:36
    • Propuesto como respuesta Pablo RubioModerator viernes, 28 de febrero de 2020 19:11
    jueves, 27 de febrero de 2020 18:35
  • No se "llama" desde otra tabla, si tenes que modificar una tabla, haces UPDATE a esa misma tabla

    La instrucción SQL sería:

    UPDATE Operadores

    SET Nombre = 'El nombre que sea'

    WHERE idOperador = 4

    Creo que también podría ser 

    WHERE Nombre = 'a'

    pero se usa más y es más normal usar como filtro el id

    jueves, 27 de febrero de 2020 19:07
  • Lo intentare con el id . 

    Este es mi procedure de moficar, el cual llamo a mi código en c#, y todo lo estoy pasando por parametros.

    create procedure modi (
    				@Lote varchar(1000),
                    @Folio varchar(1000),
                    @AvisoEmbarque varchar(1000),
                    @Contrato varchar(1000),
                    
                    @Marca varchar(1000),
                    @PlacasCaja varchar(1000),
                    @Modelo varchar(1000),
                    @NumeroEco varchar(1000),
                    @Placas varchar(1000),
                    @Color varchar(1000),
                    @Transportadora varchar(1000),
                    
    				
    
                    @Provee varchar(1000),
                    @Concepto varchar(1000),
                    
    				@Producto varchar(1000),
                    @Tipo varchar(1000),
                    @NTipo varchar(100),
                    @Observaciones varchar(1000)
    				)
    as
    begin
    	
    	  UPDATE Entrada set Lote= @Lote, AvisoEmbarque= @AvisoEmbarque, Contrato= @Contrato where Folio = @Folio;
    	  UPDATE Entrada set Folio=@Folio where Lote= @Lote;
          UPDATE Camion set PlacasCaja = @PlacasCaja, Modelo= @Modelo, NumeroEco=@NumeroEco, Marca = @Marca, 
    	  Color=@Color, Transportadora=@Transportadora where  Placas= @Placas;
    	  UPDATE Camion set Marca = @Marca where Modelo = @Modelo
          UPDATE Proveedores set Concepto = @Concepto where Provee=@Provee;
          UPDATE Productos set Tipo= @Tipo, NTipo=@NTipo, Observaciones= @Observaciones where Producto = @Producto;
    end


    jueves, 27 de febrero de 2020 19:20
  • Si, en el WHERE pone el id (en todos), que es único, no las variables que pusiste en el SP.

    Me llama la atención bastante, que tengas que hacer tantos UPDATE ... o sea, me pregunto, tenes bien hecho la parte de la aplicación en donde haces los INSERT ? Me da la impresión que si si, no tendrías que hacer tantos UPDATE ... no se, quizás me equivoco.

    jueves, 27 de febrero de 2020 19:35
  • Entonces Cambiare todos por los id. Estaba investigando y en cualquier documento y/o página decía que no se puede hacer solo un UPDATE por todas las tablas, que tenia que ser uno por tabla. Y estoy buscando un dato (que son las placas), y en base a ese dato estoy modificando los datos de las otras tablas.

    Por eso lo tengo así.

    jueves, 27 de febrero de 2020 20:28
  • Los cambie, pero aun así no modifica solo un dato, modifica todos.
    jueves, 27 de febrero de 2020 23:22
  • Hola Katsa

    Si en la consulta pones el WHERE, con un campo único como el id, debería modificar sólo la fila cuyo id es el que pusiste en el WHERE. Algo mal estás haciendo. O no pusiste el WHERE id = 4 (o el número que sea) o no se si estaras llamando al Stored Procedure con cada uno de los id y los mismos valores de reemplazo.

    No te preocupes que esto se soluciona rápido. 

    Si me pasas el código, del SP, y de donde lo invocas (y cuántas veces lo invocas y con cuáles valores), podré ver que es lo que está fallando.

    Si queres, para que veas que te digo la verdad acerca del WHERE, usa tu SQL Server Management Studio, y allí proba una consulta básica, para que veas como funciona el UPDATE con WHERE (sobre los datos que mostraste de la tabla Operadores):

    UPDATE Operadores SET Nombre = 'Raul Perez' WHERE idOperador = 4

    Vas a ver que el Nombre para el idOperador 4 pasa de ser 'a' a ser 'Raul Perez', ese y sólo ese, no los demás

    Ahora, como yo "pretendo" (no lo soy tanto) ser más prolijo, en lugar de escribir la consulta en una sola linea, la escribo así:

    UPDATE Operadores

    SET Nombre = 'Raul Perez'

    WHERE idOperador = 4

    Seguimos hasta que lo resuelvas

    Saludos

    viernes, 28 de febrero de 2020 1:05
  • Estuve viendo más detenidamente el Procedure (SP o Stored Procedure) como lo mostraste antes, y creo que por ahí puede andar parte del problema.

    Primero, me parece que tendrías que tener un SP para cada una de las tablas, si no tenes que poner muchos parámetros y se presta más a confusión y errores.

    Esto, por ejemplo:

    UPDATE Entrada set Lote= @Lote, AvisoEmbarque= @AvisoEmbarque, Contrato= @Contrato where Folio = @Folio;

    Debería ser:

    UPDATE Entrada set Lote= @Lote, AvisoEmbarque= @AvisoEmbarque, Contrato= @Contrato WHERE idEntrada = @idEntrada;

    Y tendrías que declarar el parámetro @idEntrada, que es uno para cada fila, o sea, tendrías que invocar el SP una vez por cada fila que quieras modificar, pero con el idEntrada distinto

    Esto, de la tabla Camion

    UPDATE Camion set PlacasCaja = @PlacasCaja, Modelo= @Modelo, NumeroEco=@NumeroEco, Marca = @Marca, 
    	  Color=@Color, Transportadora=@Transportadora where  Placas= @Placas;

    Lo mismo, pero con WHERE idCamion = @idCamion, y tenes que declarar el parámetro idCamion

    Te digo de hacer un solo SP por cada tabla, porque son muchos parámetros, y se da mucho lugar a confusión si vas a tener un SP con 50 parámetros.

    Otra cosa, es uno y sólo un UPDATE por tabla, porque veo ahí que pusiste 2 para la tabla Entrada.

    Y así, con cada tabla, armas un SP, pero agregando el WHERE con el id de cada uno al final igualado al parámetro id de cada uno, que no es el mismo en todas las tablas, por ejemplo:

    Para la tabla Entrada, sería:

    WHERE idEntrada = @idEntrada;

    Para la tabla Camion, sería:

    WHERE idCamion = @idCamion;

    ETC.

    Por favor anda avisandome hasta donde avanzamos así se por donde seguimos 

    viernes, 28 de febrero de 2020 1:58
  • Lo mando todo por parametros por que en mi aplicación de c# comparo un campo con otro para ver que pertenezcan a un mismo registro aunque esten en tablas diferentes. Por ese motivo no lo estoy comparando con el id, tendría que poner el UPDATE de cada fila y eso no es lo mas favorable para la aplicación, ya que si lo mando a llamar por medio del id me lo pide en el código de c# y no es el caso.
    viernes, 28 de febrero de 2020 15:45
  • No entiendo muy bien, pero en el WHERE tenes que usar el id o cualquier otro campo cuyo valor sea único en la tabla, y si, es un UPDATE por fila, si es que queres que modifique una sola fila. 

    Me imagino que en la aplicación tenes en memoria cargada la tabla principal al menos, podes incluir en ese List<> o DataTable el campo id así podes hacer los UPDATE, salvo que uses otro campo único.

    Bueno, no se si pudiste resolver al final, cualquier cosa no dudes en preguntar.

    Saludos

    viernes, 28 de febrero de 2020 16:25
  • No aun no he podido, y si los estoy comparando con otro campo que es unico, pero lo que se me ocurrio es hacer otro campo en la tabla operador en donde pueda comparar el nombre aunque solo lo utilice para ello. 

    Muchas gracias por su apoyo. 


    • Editado Katsa viernes, 28 de febrero de 2020 16:34
    viernes, 28 de febrero de 2020 16:34