Foros del Web » Programación para mayores de 30 ;) » .NET »

Update embebido

Estas en el tema de Update embebido en el foro de .NET en Foros del Web. Pues en la label me pone perfectamente los servicios seleccionados. Con su # correspondiente. y me los kita si le doy al check del servicio. ...

  #61 (permalink)  
Antiguo 11/05/2005, 04:21
Avatar de Nombela  
Fecha de Ingreso: abril-2005
Mensajes: 611
Antigüedad: 19 años, 10 meses
Puntos: 1
Increible pero cierto

Pues en la label me pone perfectamente los servicios seleccionados. Con su # correspondiente. y me los kita si le doy al check del servicio. Eso esta perfecto.

Lo que no me va es lo de actualizar, no me saca la sql ni na.
lo tengo asi:

string sql=String.Empty;
int i=0;
while (i< arr.Length)
{
if (i==0)
{
sql = " where UsServIdServ==" + arr[i];
}
else
{
sql += " and UsServIdServ==" + arr[i];
}
i+=1;
}
sql = "Delete from UsuariosServicios " + sql + " and UsServIdUs=" + ComboLogin.SelectedItem.Value;
myCommand.Connection.Open();
myCommand.CommandText = sql;
Response.Write(sql);
myCommand.Connection.Close();
i=0;
while (i< arr.Length)
{
if ((ViewState["identificadores"]).ToString().IndexOf(arr[i].ToString())!=-1)
{

}
else
{
myCommand.CommandText = " Insert into UsuariosServicios (UsServIdServ,UsServIdUs) values(" + arr[i] +"," + ComboLogin.SelectedItem.Value +")";
}
i+=1;
}
myCommand.Connection.Open();
//Response.Write(myCommand.CommandText);
myCommand.Connection.Close();
  #62 (permalink)  
Antiguo 11/05/2005, 04:29
Avatar de Jose_minglein2  
Fecha de Ingreso: noviembre-2004
Mensajes: 2.344
Antigüedad: 20 años, 3 meses
Puntos: 8
Pero te llega a entrar en la función????Has ejecutado paso a paso comprobando el valor de sql en cada momento??En un principio no veo ningún problema, excepto una cosa rara:

where UsServIdServ==????
Seguro que en sql server hay que poner ==?????

yo trabaje un tiempo con sql server y los where los ponía con un sólo =,

Asegurate de que te entra en la función, puedes hacer

response.write("<script>window.alert('Ha entrado');</script>")

al principio de la misma para saberlo
  #63 (permalink)  
Antiguo 11/05/2005, 04:38
Avatar de Nombela  
Fecha de Ingreso: abril-2005
Mensajes: 611
Antigüedad: 19 años, 10 meses
Puntos: 1
Lo del == me di cuenta pronto pero hay algo estraño, aki:

if (Convert.ToString(ViewState["identificadores"]).IndexOf(arr[Convert.ToInt16(i)])!=-1)
{
Response.Write("HOLA");
}
else
{
myCommand.CommandText = " Insert into UsuariosServicios (UsServIdServ,UsServIdUs) values(" + arr[i] +"," + ComboLogin.SelectedItem.Value +")";
}

me entra en el response.write("hola") cosa que por lo que he entendido no deberia entrar.
A parte la sql me la saca asi:
Delete from UsuariosServicios where UsServIdServ= and UsServIdServ=7 and UsServIdServ=5 and UsServIdServ=2 and UsServIdServ=6 and UsServIdServ=3 and UsServIdUs=3

me los anida todos.
  #64 (permalink)  
Antiguo 11/05/2005, 04:48
Avatar de Jose_minglein2  
Fecha de Ingreso: noviembre-2004
Mensajes: 2.344
Antigüedad: 20 años, 3 meses
Puntos: 8
if (Convert.ToString(ViewState["identificadores"]).IndexOf(arr[Convert.ToInt16(i)])!==-1)

Perdón las comparaciones en c# van con ==, pero las de SQL no, recuerda, otra cosa, que me acabo de dar cuenta, el delete sería con <>, puesto que tienes que eliminar los que se han quitado, perdón

Y con respecto a lo último, también me acabo de dar cuenta, como el primer valor de la cadena que se devuelve es '#' el arr[0] es null, por eso te lo pone así, entonces quedaría:


int i=1;
while (i< arr.Length)
{
if (i==1)
{
sql = " where UsServIdServ<>" + arr[i];
}
else
{
sql += " and UsServIdServ<>" + arr[i];
}
i+=1;
}

Suerte, que estamos ya en el final
  #65 (permalink)  
Antiguo 11/05/2005, 05:04
Avatar de Nombela  
Fecha de Ingreso: abril-2005
Mensajes: 611
Antigüedad: 19 años, 10 meses
Puntos: 1
esto me keda

El delete me lo hace bien pero el insert solo me pone uno aunke kiera insertar varios.

i=0;
while (i< arr.Length)
{
if (Convert.ToString(ViewState["identificadores"]).IndexOf(arr[Convert.ToInt16(i)])!=-1)
{
//Response.Write("HOLA");
}
else
{
myCommand.CommandText = " Insert into UsuariosServicios (UsServIdServ,UsServIdUs) values (" + arr[i] +"," + ComboLogin.SelectedItem.Value +")";
}
i+=1;
}
myCommand.Connection.Open();
Response.Write(myCommand.CommandText);
myCommand.Connection.Close();
  #66 (permalink)  
Antiguo 11/05/2005, 05:08
Avatar de Jose_minglein2  
Fecha de Ingreso: noviembre-2004
Mensajes: 2.344
Antigüedad: 20 años, 3 meses
Puntos: 8
Claro, porque, sólo se queda con el último valor,

MyCommand.CommandText="";
i=1;
while (i< arr.Length)
{
if (Convert.ToString(ViewState["identificadores"]).IndexOf(arr[Convert.ToInt16(i)])!=-1)
{
//Response.Write("HOLA");
}
else
{
myCommand.CommandText += " Insert into UsuariosServicios (UsServIdServ,UsServIdUs) values (" + arr[i] +"," + ComboLogin.SelectedItem.Value +");";
}
i+=1;
}
myCommand.Connection.Open();
Response.Write(myCommand.CommandText);
myCommand.Connection.Close();

Si te das cuenta despúes de cada SQL he puesto un ;, esto es para MySQL para separar instrucciones, no se si con SQL Server será igual
  #67 (permalink)  
Antiguo 11/05/2005, 05:28
Avatar de Nombela  
Fecha de Ingreso: abril-2005
Mensajes: 611
Antigüedad: 19 años, 10 meses
Puntos: 1
Ya esta

FUnciona perfectamente, muchas gracias por toda la ayuda prestada, para lo que haga falta ya sabeis.

Gracias
  #68 (permalink)  
Antiguo 11/05/2005, 05:31
Avatar de Jose_minglein2  
Fecha de Ingreso: noviembre-2004
Mensajes: 2.344
Antigüedad: 20 años, 3 meses
Puntos: 8
Me alegro de que funcione,
  #69 (permalink)  
Antiguo 11/05/2005, 08:09
Avatar de Nombela  
Fecha de Ingreso: abril-2005
Mensajes: 611
Antigüedad: 19 años, 10 meses
Puntos: 1
ultimo detalle

Para que todo funcione a la perfeccion necesito pasar cuando clicka en el boton de actualizar onclick="javascript:__doPostBack('Guardar',documen t.getElementById('text').value);" 3 valores, antes lo hacia asi:

Response.Redirect("MenuadministradorUsu.aspx?Oku=1 &Nombre="+Request.QueryString["Nombre"].ToString()+"&Id="+Request.QueryString["id"].ToString()+"&mod="+ComboLogin.SelectedItem.Value) ;
pero ahora no puedo xq me actualiza 2 veces la pagina.

Gracias.
  #70 (permalink)  
Antiguo 11/05/2005, 08:25
Avatar de Jose_minglein2  
Fecha de Ingreso: noviembre-2004
Mensajes: 2.344
Antigüedad: 20 años, 3 meses
Puntos: 8
No entiendo lo que quieres decir...
  #71 (permalink)  
Antiguo 11/05/2005, 08:28
Avatar de Nombela  
Fecha de Ingreso: abril-2005
Mensajes: 611
Antigüedad: 19 años, 10 meses
Puntos: 1
Explicacion

MIra yo una vez que actualizaba los datos en la base de datos hacia un response.redirect pasando unos parametros que recogia en el onload y segun lo que fuera decia se a actualizado bien, se ha borrado bien...

Pero claro ahora se actualiza con javascript:__doPostBack('Guardar',document.getElem entById('text').value); entonces no se como pasarle ademas esas variables que te digo.

me entiendes ahora???

es que me da:

Infracción de la restricción PRIMARY KEY 'PK_UsuariosServicios'. No se puede insertar una clave duplicada en el objeto 'UsuariosServicios'. Se terminó la instrucción.

Y creo que es xq intenta meter 2 veces los mismos datos xq se recarga la pagina 2 veces.
  #72 (permalink)  
Antiguo 11/05/2005, 08:48
Avatar de Jose_minglein2  
Fecha de Ingreso: noviembre-2004
Mensajes: 2.344
Antigüedad: 20 años, 3 meses
Puntos: 8
Lo primero es quitarle al linkbutton de html que hemos creado el runat server, así en teoría no debería pasar 2 veces por el server. O también puedes hacer esto, una vez que actualice todos los datos, es decir al final de la función:

Request.Form["__eventtarget"] = "";
Así te aseguras que aunque recarge 2 veces, no vuelva a entra a tu función ya que ya no vale "guardar"
  #73 (permalink)  
Antiguo 11/05/2005, 08:50
Avatar de Jose_minglein2  
Fecha de Ingreso: noviembre-2004
Mensajes: 2.344
Antigüedad: 20 años, 3 meses
Puntos: 8
Perdón, acabo de comprobar que Request.Form es de sólo Lectura, así que la segunda solución no te vale.
  #74 (permalink)  
Antiguo 11/05/2005, 08:52
Avatar de Nombela  
Fecha de Ingreso: abril-2005
Mensajes: 611
Antigüedad: 19 años, 10 meses
Puntos: 1
como hago

COmo hago entonces para que no entre 2 veces???

es que me dice que dupicidad de claves pero eso es creo cuando selecciono un servicio y lo deselecciono varias veces. es como si lo intentara insertar en vez de borrarlo.

Última edición por Nombela; 11/05/2005 a las 08:58
  #75 (permalink)  
Antiguo 11/05/2005, 09:10
Avatar de Jose_minglein2  
Fecha de Ingreso: noviembre-2004
Mensajes: 2.344
Antigüedad: 20 años, 3 meses
Puntos: 8
A coño, ya te entiendo lo que quieres decir, claro, claro, que si un elemento esta por defecto seleccionado, lo quitamos y lo ponemos, pues que se intenta insertar otra vez... Es verdad, pense en esa posibilidad pero luego se me olvidó, espera que piense un poco
  #76 (permalink)  
Antiguo 11/05/2005, 09:16
Avatar de Jose_minglein2  
Fecha de Ingreso: noviembre-2004
Mensajes: 2.344
Antigüedad: 20 años, 3 meses
Puntos: 8
Tienes 2 opciones, una es un poco digamos que incorrecta, que sería cargarnos la parte del delete y borrar TODOS los servicios del usuario y luego insertar como estabamos haciendo los que ya estén seleccionados.

Y la segunda que sería más correcta pero más pesada, es por cada elemento del array comprobar primero si existe, es decir hacerle un select, y si no existe pues añadirlo a la consulta.

Yo utilizaría la primera siempre y cuando utilices transacciones
  #77 (permalink)  
Antiguo 11/05/2005, 09:23
Avatar de Nombela  
Fecha de Ingreso: abril-2005
Mensajes: 611
Antigüedad: 19 años, 10 meses
Puntos: 1
ok

Voy a usar la de borrar todo primero y luego insertarlo todo. Y si me dicen algo pues ya hare lo del IF NOT EXISTS y todo eso.
Gracie Mile
  #78 (permalink)  
Antiguo 11/05/2005, 09:25
Avatar de Jose_minglein2  
Fecha de Ingreso: noviembre-2004
Mensajes: 2.344
Antigüedad: 20 años, 3 meses
Puntos: 8
Ten en cuenta el uso de transacciones, porque si por ejemplo falla la conexión con el gestor de BD por cualquier razón justo después de borrar, el resto no se ejecutará y el usuario se quedaría sin servicios asignados
  #79 (permalink)  
Antiguo 12/05/2005, 00:55
Avatar de Nombela  
Fecha de Ingreso: abril-2005
Mensajes: 611
Antigüedad: 19 años, 10 meses
Puntos: 1
Transacciones???

Tienes toda la razon xq como se corte justo ahi la conexion con la BD se le borran todos los servicios!!!!!
Que es eso de las transacciones????
  #80 (permalink)  
Antiguo 12/05/2005, 01:04
Avatar de Jose_minglein2  
Fecha de Ingreso: noviembre-2004
Mensajes: 2.344
Antigüedad: 20 años, 3 meses
Puntos: 8
En terminos generales:

Una transacción es un conjunto de instrucciones SQL, en las que o se realizan todas o no se realiza ninguna.

consta de un begintransaction

y despues un commit que guarda todo o un rollback que deshace todo.

Puedes utilizar el objeto Transaction (Ole, SQL, ODBC...), hacer un try y si todo funciona bien Commit, si hay una excepción Rollback.

Yo de momento no las he utilizado nunca. Pero en breve, me tengo que poner con ellas. Suerte.
  #81 (permalink)  
Antiguo 12/05/2005, 01:37
Avatar de neivan  
Fecha de Ingreso: febrero-2005
Mensajes: 539
Antigüedad: 20 años
Puntos: 1
yo las he utilizado en plsql y en developer
Es lo que dice jose.Cuando das el commit se guardan definitivamente,si das al rollback no las guarda,yo esto de todas formas lo di con oracle.
  #82 (permalink)  
Antiguo 12/05/2005, 02:07
Avatar de Nombela  
Fecha de Ingreso: abril-2005
Mensajes: 611
Antigüedad: 19 años, 10 meses
Puntos: 1
do_postback

Me acabo de dar cuenta de que tengo un boton en el formulario que me llama a una funcion oculta y muestra un <tr> de la table. Esa funcion hace el do_postback. La cuestion es que cuando presiono el boton, todo lo que hay en el input se pierde xq esta en el cliente.
Hay alguna forma de que no se pierda lo del input donde guardamos los servicios que presiona????
Gracias
  #83 (permalink)  
Antiguo 12/05/2005, 02:18
Avatar de neivan  
Fecha de Ingreso: febrero-2005
Mensajes: 539
Antigüedad: 20 años
Puntos: 1
Has pensado en cuando clikas ese boton pasar lo qeu tengas al servidor,con el __dopostback lo puedes dejar en uan viewstate o en un asp:label oculto ..... y eso ya se keda ahi y no se borra,si hace mas cambios y ya da al boton actualizar que pases lo que tienes y luego ala hora de hacer tus cambios en la bd coger esto mas el string que apsaste antes,el problema en esto estara en s si pasas los datos alservidor y vuleve a cambiar un servicio que habia cambiado antes lo volvera a meter en el texto.......

Que tipo de boton es ese que t e fastidia too,y si tine una funcion inportante en el formulario??
  #84 (permalink)  
Antiguo 12/05/2005, 02:21
Avatar de Nombela  
Fecha de Ingreso: abril-2005
Mensajes: 611
Antigüedad: 19 años, 10 meses
Puntos: 1
hypervinculo buton

Es un hypervinculo button que si le pinchas te muestra un text box que estaba oculto y si le vuelves a pinchar te lo vuelve a ocultar.
Es para cambiar la contraseña asi que si que es importante.
Tu ke me dices que haga???? Ke lo pase todo a un asp:label para que ahi se guarde???
  #85 (permalink)  
Antiguo 12/05/2005, 02:27
Avatar de neivan  
Fecha de Ingreso: febrero-2005
Mensajes: 539
Antigüedad: 20 años
Puntos: 1
Lo suyo para no andar cambiando nada es ver si podriamos hacer que cuando picnchas en el hipervinculo,llebe los daos al servidor y los vuelva a dejar donde estaban en el lado del cliente.

La idea entonces sera mandar como nmandas lo s datos con el boton de actualizar al servidor y luego volverlo a meter
  #86 (permalink)  
Antiguo 12/05/2005, 02:45
Avatar de Nombela  
Fecha de Ingreso: abril-2005
Mensajes: 611
Antigüedad: 19 años, 10 meses
Puntos: 1
Transacciones

Ya he conseguido implementar lo de las transacciones que me dijo Jose, aqui os lo dejo para lo que os haga falta:

private void CambiaServicios(string []arr)
{
SqlTransaction transaccion;
myConnection = new SqlConnection (connectionString);
string updateCmd;
myConnection.Open();
transaccion=myConnection.BeginTransaction();
if (ConfUsPass.Visible)
{
updateCmd = "UPDATE Usuarios SET UsNombre=@UsNombre,UsPass=@UsPass,UsMail=@UsMail,U sTelefono=@UsTelefono,UsIdPer=@UsIdPer where UsId=@UsId";
}
else
{
updateCmd = "UPDATE Usuarios SET UsNombre=@UsNombre,UsMail=@UsMail,UsTelefono=@UsTe lefono,UsIdPer=@UsIdPer where UsId=@UsId; ";
}
//myCommand.Connection.Open();
myCommand = new SqlCommand(updateCmd, myConnection);
myCommand.Transaction=transaccion;
myCommand.Parameters.Add(new SqlParameter("@UsId",
SqlDbType.Int, 4));
myCommand.Parameters["@UsId"].Value = ComboLogin.SelectedItem.Value;
myCommand.Parameters.Add(new SqlParameter("@UsNombre",
SqlDbType.NVarChar, 50));
myCommand.Parameters["@UsNombre"].Value = UsNombre.Value;
myCommand.Parameters.Add(new SqlParameter("@UsPass",
SqlDbType.NVarChar, 50));
myCommand.Parameters["@UsPass"].Value = UsPass.Value;
myCommand.Parameters.Add(new SqlParameter("@UsMail",
SqlDbType.NVarChar, 50));
myCommand.Parameters["@UsMail"].Value = UsMail.Value;
myCommand.Parameters.Add(new SqlParameter("@UsTelefono",
SqlDbType.NVarChar, 15));
myCommand.Parameters["@UsTelefono"].Value = UsTelefono.Value;
myCommand.Parameters.Add(new SqlParameter("@UsIdPer",
SqlDbType.Int, 4));
myCommand.Parameters["@UsIdPer"].Value = UsPerfil.SelectedItem.Value;
try
{
if ((ConfUsPass.Visible) && (UsPass.Value!=ConfUsPass.Value))
MsgBox1.alert("El password no es correcto");
/*else
{
//int numreg=myCommand.ExecuteNonQuery();
//updateservicios();
//Response.Redirect("MenuadministradorUsu.aspx?Oku=1 &Nombre="+Request.QueryString["Nombre"].ToString()+"&Id="+Request.QueryString["id"].ToString()+"&mod="+ComboLogin.SelectedItem.Value) ;
//Response.Redirect("Menuadministrador1.aspx?Oku=1&m od="+nombre.Text);
}*/

//myCommand.Connection.Close();

string sql=String.Empty;
/*int i=1;
while (i< arr.Length)
{
if (i==1)
{
sql = " where UsServIdServ<>" + arr[i];
}
else
{
sql += " and UsServIdServ<>" + arr[i];
}
i+=1;
}*/
//myCommand.Connection.Open();
//myCommand.CommandText = "";
sql = "Delete from UsuariosServicios WHERE (UsServIdUs = "+ComboLogin.SelectedItem.Value+");";// + sql + " and UsServIdUs=" + ComboLogin.SelectedItem.Value+";";
myCommand.CommandText += sql;
//myCommand.Connection.Close();
int i=1;
while (i< arr.Length)
{
if (Convert.ToString(ViewState["identificadores"]).IndexOf(arr[Convert.ToInt16(i)])!=-1)
{
//Response.Write("HOLA");
}
else
{
myCommand.CommandText += " Insert into UsuariosServicios (UsServIdServ,UsServIdUs) values (" + arr[i] +"," + ComboLogin.SelectedItem.Value +");";
}
i+=1;
}
//myCommand.Connection.Open();
//Response.Write(myCommand.CommandText);
int numreg1=myCommand.ExecuteNonQuery();
transaccion.Commit();
myCommand.Connection.Close();
Response.Redirect("MenuadministradorUsu.aspx?Oku=1 &Nombre="+Request.QueryString["Nombre"].ToString()+"&Id="+Request.QueryString["id"].ToString()+"&mod="+ComboLogin.SelectedItem.Value) ;
}
catch (SqlException c)
{
transaccion.Rollback();
myCommand.Connection.Close();
if (c.Number == 2627)
mensage.Text = "ERROR: Este cliente ya existe";
else
mensage.Text = "ERROR: No se ha podido añadir el registro, por favor " +
"asegurese de que todo esta correctamente escrito, gracias";
}
}

ahora me keda ver como soluciono lo de que se borra el input.
  #87 (permalink)  
Antiguo 12/05/2005, 02:56
Avatar de Jose_minglein2  
Fecha de Ingreso: noviembre-2004
Mensajes: 2.344
Antigüedad: 20 años, 3 meses
Puntos: 8
Primero bien por lo de la transacción.
Efectivamente, por eso te decía al principio que tenías 2 opciones, una guardar en cada click y otra guardar al final, en este último caso, el que hemos desarrollado, era siempre y cuando no hicieses llamadas al servidor.

Tienes varias opciones:

1- Cambiar la forma de hacer la actualizaciones (en mi opinión muy costoso)

2- Deshabilitar la llamada al servidor de la función que te muestra y buscar otra solución que trabaje del lado del cliente, yo te recomiendo, para cambiar la contraseña como dices, hacerlo con un popup, es decir, en vez de un hyperlinkbutton poner un elemento html con un window.open() y así trabajar en otra ventana sin perder los datos de la actual, me entiendes???
  #88 (permalink)  
Antiguo 12/05/2005, 04:44
Avatar de Jose_minglein2  
Fecha de Ingreso: noviembre-2004
Mensajes: 2.344
Antigüedad: 20 años, 3 meses
Puntos: 8
También puede hacer un javascript que oculte o muestre la linea poniendole un id al tr
  #89 (permalink)  
Antiguo 12/05/2005, 05:07
Avatar de Nombela  
Fecha de Ingreso: abril-2005
Mensajes: 611
Antigüedad: 19 años, 10 meses
Puntos: 1
yeeeeeees

Ya esta a costado pero ya funciona perfect.

Moitas gracias de nuevo.
  #90 (permalink)  
Antiguo 12/05/2005, 05:07
Avatar de Nombela  
Fecha de Ingreso: abril-2005
Mensajes: 611
Antigüedad: 19 años, 10 meses
Puntos: 1
Cita:
Iniciado por Nombela
Ya esta a costado pero ya funciona perfect.

Moitas gracias de nuevo.

asi:

var display=(document.getElementById && document.all)? "block" : "table-row";
var inter=true;
function mostrar(nombreCapa)
{
if (inter)
{
document.getElementById(nombreCapa).style.display= display;
inter=false;
}
else
{
document.getElementById(nombreCapa).style.display= "none";
inter=true;
}
}
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:47.