Foros del Web » Programando para Internet » ASP Clásico »

Que es mejor insertar utilizando RECORDSET o INSERT

Estas en el tema de Que es mejor insertar utilizando RECORDSET o INSERT en el foro de ASP Clásico en Foros del Web. Hola, Tengo una pagina web en asp y sql server 2000. Ahora mismo tengo 260000 usuarios dados de alta. La pagina va un poco lenta ...

  #1 (permalink)  
Antiguo 19/04/2005, 03:57
Avatar de silvia1977  
Fecha de Ingreso: abril-2005
Mensajes: 54
Antigüedad: 19 años, 2 meses
Puntos: 0
Que es mejor insertar utilizando RECORDSET o INSERT

Hola,

Tengo una pagina web en asp y sql server 2000. Ahora mismo tengo 260000 usuarios dados de alta. La pagina va un poco lenta y estoy optimizando consultas. Cuando un usuario se da de alta en el sistema utilizo un RECORDSET, o sea,

Set rs = CreateObject("ADODB.RECORDSET")
rs.Cursortype = 1
rs.LockType = 3

rs.open "SELECT * FROM usuarios", conexionBD

rs.Addnew
rs("us_nombre") = Request.Form("nombre")
.....
rs.Update
rs.Close

pero muchas veces en esta linea se para rs.open "SELECT * FROM usuarios", conexionBD y les dice a los usuarios que se dan de alta "Tiempo de espera agotado" y eso que tengo en esa pagina <% Server.ScriptTimeout=90000 %>

Entonces mi pregunta es ¿Para insertar o modificar datos de usuarios es mejor utilizar un RECORDSET o INSERT y UPDATE?

por ejemplo:
insertar = "INSERT INTO usuarios (nombre) VALUES (" & Request.Form("nombre") & ")"
Set rs=conexionBD.Execute(insertar)

Espero que me ayudeis porque tengo que optimizar las consultas de la web porque va super lenta!!!

Gracias
  #2 (permalink)  
Antiguo 19/04/2005, 05:16
Avatar de moNTeZIon  
Fecha de Ingreso: enero-2005
Ubicación: Lliçà de Munt - BCN
Mensajes: 1.625
Antigüedad: 19 años, 5 meses
Puntos: 9
Hola.
No te puedo dar una respuesta muy profunda sobre el tema, aunque desde que empecé con el asp, hace unos añitos, siempre he utilizado:

Conn.Execute(strSQL)

Así de pronto yo te diría que si es más rápido, ya que para hacer UPDATES, INSERTS, etc. no necesitas un recordset, y por tanto, supongo que mejorrá el tiempo de proceso al no tener que instanciar un objeto como es un Recordset.

A ver si alguien puede dar una respuesta más tecnica.

Suerte!
  #3 (permalink)  
Antiguo 19/04/2005, 05:43
Avatar de silvia1977  
Fecha de Ingreso: abril-2005
Mensajes: 54
Antigüedad: 19 años, 2 meses
Puntos: 0
Muchas gracias por tu ayuda pero necesito más opiniones pues casi toda la pagina esta hecha con recordsets y he de cambiar muchas paginas y quiero asegurarme antes.

¡Venga a ver que opinan los demas!

Gracias de nuevo, si te enteras de algo mas me avisas.
__________________
Silvia - Castellón :arriba:
  #4 (permalink)  
Antiguo 19/04/2005, 05:45
Avatar de silvia1977  
Fecha de Ingreso: abril-2005
Mensajes: 54
Antigüedad: 19 años, 2 meses
Puntos: 0
Una preguntita: Tu los recordsets donde los utilizas?
__________________
Silvia - Castellón :arriba:
  #5 (permalink)  
Antiguo 19/04/2005, 05:56
Avatar de silvia1977  
Fecha de Ingreso: abril-2005
Mensajes: 54
Antigüedad: 19 años, 2 meses
Puntos: 0
Es que me dicen que utilizando recordsets al insertar usuarios te ahorras los fallos que te puede dar un insert cuando un usuario pone en algun campo un comilla y el insert falla porque se piensa que termina ahi.

Una solucion seria hacer un replace de las comillas por nada pero entonces le modificas al usuario el campo por ejemplo usuario_nick y no lo dejas como el lo queria con sus comillas...

Que piensas?
__________________
Silvia - Castellón :arriba:
  #6 (permalink)  
Antiguo 19/04/2005, 06:17
Avatar de trasgukabi  
Fecha de Ingreso: septiembre-2004
Mensajes: 2.749
Antigüedad: 19 años, 9 meses
Puntos: 18
al hacer un conn.execute te evitas la carga para el servidor de crear un recordset.
  #7 (permalink)  
Antiguo 19/04/2005, 07:49
Avatar de silvia1977  
Fecha de Ingreso: abril-2005
Mensajes: 54
Antigüedad: 19 años, 2 meses
Puntos: 0
Muchas gracias, pues voy a cambiar todos los recordset de mi pagina por insert y update. Pero entonces cuando es bueno utilizar un recordset? No lo tengo claro...
__________________
Silvia - Castellón :arriba:
  #8 (permalink)  
Antiguo 19/04/2005, 08:09
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 4 meses
Puntos: 146
Cuando quieras trabajar con un cursor de datos debes usar un recordset, cuando solo vas a hacer alguna edición a la tabla, usa un execute, ahora si ya no nos importa separar el trabajo en dos capas y deseas utilizar los recordsets y sus métodos puedes hacer uso de transacciones a nivel de ASP, las cuales no puedes utilizar con Executes.

Mira, dicen por ahí que las reglas del negocio deben estar encapsuladas en algún objeto que sea independiente de la BD's. Si esta utilizando transacciones en Sql-Server por mencionar un ejemplo, si de pronto necesitas trasladar tu sitio a Informix o Access o a la que quieras, necesariamente deberás modificar por lo menos la sintaxis de tus transacciones o en el caso de access, quitar dicha lógica. Si utilizas los recordset, la lógica estará en tu aplicación y será independiente de la BD's.
Por otro lado, lo del ahorro del objeto recorser en memoria, tambien en cierto. El que es "incorrecto" mezclar la capa de datos con la de presentación y reglas del negocio, pues también es cierto, así que más que nada ve los recordset como una alternativa a trabajar de una forma diferente, dependiendo de las circunstancias.

Saludos
  #9 (permalink)  
Antiguo 19/04/2005, 09:56
Avatar de silvia1977  
Fecha de Ingreso: abril-2005
Mensajes: 54
Antigüedad: 19 años, 2 meses
Puntos: 0
Error al transformar recordset a insert

Hola,

Como os he dicho estoy actualizando mi pagina web tranformando los recordsets en inserts. Pues resulta que ahora cuando un usuario se da de alta sale un error que dice:

Microsoft][ODBC SQL Server Driver][SQL Server]Error de sintaxis al convertir una cadena de caracteres a datetime.

Yo ahora inserto asi:

fecha_nac = Request.Form( "fdia" ) & "/" & Request.Form( "fmes" ) & "/" & Request.Form( "fanyo" )

usu="INSERT INTO usuarios (US_NOMBRE, US_FECNAC) VALUES ( '" & nombre & "', " & fecha_nac & ")"
Set rs = conexionBD.Execute(usu)

y el campo US_FECNAC es datetime. Como puedo insertarlo sin que me de ese error que antes con el recordset no me daba.

He probado a hacer convert(varchar(10), fecha_nac) pero me dice que no coinciden los tipos...

Ayudarme por favor
__________________
Silvia - Castellón :arriba:
  #10 (permalink)  
Antiguo 19/04/2005, 10:14
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 4 meses
Puntos: 146
Basicamente, faltan los apostrofes.

http://www.databasejournal.com/featu...le.php/2191631
  #11 (permalink)  
Antiguo 19/04/2005, 10:15
Avatar de moNTeZIon  
Fecha de Ingreso: enero-2005
Ubicación: Lliçà de Munt - BCN
Mensajes: 1.625
Antigüedad: 19 años, 5 meses
Puntos: 9
Cita:
Iniciado por silvia1977

usu="INSERT INTO usuarios (US_NOMBRE, US_FECNAC) VALUES ( '" & nombre & "', " & fecha_nac & ")"
Set rs = conexionBD.Execute(usu)
OK. Prueba a insertar así:

usu="INSERT INTO usuarios (US_NOMBRE, US_FECNAC) VALUES ( '" & nombre & "', #" & fecha_nac & "#)"

Creo recordar que era con almohadilla para fechas en SQL Server.
  #12 (permalink)  
Antiguo 19/04/2005, 10:33
Avatar de silvia1977  
Fecha de Ingreso: abril-2005
Mensajes: 54
Antigüedad: 19 años, 2 meses
Puntos: 0
Al final era asi:

usu="INSERT INTO usuarios (US_NOMBRE, US_FECNAC) VALUES ( '" & nombre & "', '" & fecha_nac & "')"
Set rs = conexionBD.Execute(usu)

Con las comillas, lo bueno es que lo probe asi antes de escribir aqui para preguntar pero se ve que tenia en cache lo antiguo y me seguia dando error.

Bueno muchas gracias por ayudarme chicos, mañana más. He acabado por hoy mi jornada laboral.

Me gusta este foro.

Chao.
__________________
Silvia - Castellón :arriba:
  #13 (permalink)  
Antiguo 19/04/2005, 10:55
Avatar de AlZuwaga
Colaborador
 
Fecha de Ingreso: febrero-2001
Ubicación: 34.517 S, 58.500 O
Mensajes: 14.550
Antigüedad: 23 años, 3 meses
Puntos: 535
Cita:
Es que me dicen que utilizando recordsets al insertar usuarios te ahorras los fallos que te puede dar un insert cuando un usuario pone en algun campo un comilla y el insert falla porque se piensa que termina ahi.

Una solucion seria hacer un replace de las comillas por nada pero entonces le modificas al usuario el campo por ejemplo usuario_nick y no lo dejas como el lo queria con sus comillas...
No, la solución es hacer el replace de un solo apóstrofe por dos de ellos seguidos:

Código:
usuario = Replace(request.form("usuario"), "'", "''")
__________________
...___...
  #14 (permalink)  
Antiguo 19/04/2005, 11:33
Avatar de pablinweb  
Fecha de Ingreso: julio-2003
Mensajes: 283
Antigüedad: 20 años, 10 meses
Puntos: 0
perdón que me meta un poco tarde y tal vez ya cambiaste todo pero en lugar de usar "SELECT * FROM usuarios" y cargar los 260000 registros en memoria podrias usar "SELECT * FROM usuarios where 1 = 2" y luego usar el addnew.
Yo estoy de acuerdo en que es mejor utilizar recordsets porque mejora un poco el problema de datos, guardar la fecha actual es tan simple como cualquier otro dato rs("Fecha") = now y te olvidas del formato y de las comillas y de que se yo cuanto y tambien como alguien ha dicho si en algún momento cambias de motor de bd no tienes problemas con t-sql
  #15 (permalink)  
Antiguo 19/04/2005, 11:46
Avatar de Pachangero  
Fecha de Ingreso: marzo-2005
Mensajes: 102
Antigüedad: 19 años, 2 meses
Puntos: 0
Saludos

La verdad en mi opinión prefiero utilizar mejor INSERT porque me ha dado mejores resultados que el RECORDSET en cuanto al manejo de archivos.

Y pues que bueno que ya se resolvio tu problema.

Suerte
  #16 (permalink)  
Antiguo 19/04/2005, 11:58
Avatar de pablinweb  
Fecha de Ingreso: julio-2003
Mensajes: 283
Antigüedad: 20 años, 10 meses
Puntos: 0
Cita:
Iniciado por Pachangero
Saludos

La verdad en mi opinión prefiero utilizar mejor INSERT porque me ha dado mejores resultados que el RECORDSET en cuanto al manejo de archivos.
y que tiene que ver el manejo de archivos con el recordset?
  #17 (permalink)  
Antiguo 19/04/2005, 12:45
Avatar de Neuron_376  
Fecha de Ingreso: abril-2005
Mensajes: 1.051
Antigüedad: 19 años, 2 meses
Puntos: 2
Bueno

-----------------------------------
Escrito por silvia1977

Tengo una pagina web en asp y sql server 2000. Ahora mismo tengo 260000 usuarios dados de alta. La pagina va un poco lenta y estoy optimizando consultas. Cuando un usuario se da de alta en el sistema utilizo un RECORDSET, o sea,
-----------------------------------

Pasos de los dos metodos:

Recordset:

1. Crear objeto // Set rs = CreateObject("ADODB.RECORDSET")
rs.Cursortype = 1
rs.LockType = 3

2. Consulta a la base de datos para abrila // rs.open "SELECT * FROM usuarios", conexionBD

3. INSERT en blanco //
rs.Addnew
rs("us_nombre") = Request.Form("nombre")

4. UPDATE con los datos //
rs.Update

5. Cerrar la base de datos.
rs.Close


INSERT normal

1. Abrir conexion a la base de datos // conn = Server.CreateObject("....")

2. INSERT directo // conn.Execute("insert....");


Bueno, con esto lo que se mira muy rapido es que el insert directo tiene muchas ventajas tecnicas:

1. No mantiene una conexion permanente (recordset) directa a la base de datos.

2. Todo se realiza en 1 solo acceso (1 consulta tipo insert), mientras que el recordset utiliza 3 accesos (consulta, inserta, actualiza), esto es mas de 3 veces el tiempo y memoria que esta gastando en el servidor.

Es rapido mirar eso...

Lo otro que pasa, es que el RECORDSET representa una conexion abierta hacia la base de datos con todos los permisos, looks, trans que necesita cargar, esto mientras este abierto, esto puede causar fugas de memoria y bajo redimiento en el server de bases de datos, por otra parte con un conn normal, este representa solamente una via de acceso la cual no se tiene que preocupar por nada mas que darle paso a las consultas que pasamos a traves de el, lo cual ocupa menos recursos y mas seguridad.

Por eso el insert normal es 100 veces mas recomendable que el recordset, claro hay casos especiales donde usas recordset, por ejemplo cuando estas trabajando con datos Binary, y otros casos especiales.

Espero haber sido de ayuda en este tema.
  #18 (permalink)  
Antiguo 19/04/2005, 20:37
Avatar de Pachangero  
Fecha de Ingreso: marzo-2005
Mensajes: 102
Antigüedad: 19 años, 2 meses
Puntos: 0
-------------------------------
Escrito por Silvia1977

Entonces mi pregunta es ¿Para insertar o modificar datos de usuarios es mejor utilizar un RECORDSET o INSERT y UPDATE?
-------------------------------
Saludos

Unicamente respondo la pregunta que hace Silvia en el titulo de su tema, al manejo de datos.

Suerte
  #19 (permalink)  
Antiguo 20/04/2005, 01:53
Avatar de silvia1977  
Fecha de Ingreso: abril-2005
Mensajes: 54
Antigüedad: 19 años, 2 meses
Puntos: 0
Problemas con las comillas del INSERT

Me gustaria saber como puedo tratar si un usuario se da de alta en la web y pone en algun campo comilla simple ' o comilla doble "

Yo para tratar la comilla simple hago:

usuario = Replace(request.form("usuario"), "'", "")

o sea le quito la comilla, pero no entiendo porque me han dicho que haga esto:

usuario = Replace(request.form("usuario"), "'", "''")

Despues cuando alguien pone comilla doble " no se como tratarla porque yo pongo:

usuario = Replace(request.form("usuario"), """, "") pero esta mal porque me pone las lineas de debajo en modo texto (en color verde...)

Como puedo solucionar esto? Hay más caracteres que introduzca el usuario que me pueden dar error con el INSERT y debe reemplazarlos tambien?

Gracias por vuestra participacion.
__________________
Silvia - Castellón :arriba:
  #20 (permalink)  
Antiguo 20/04/2005, 02:38
Avatar de trasgukabi  
Fecha de Ingreso: septiembre-2004
Mensajes: 2.749
Antigüedad: 19 años, 9 meses
Puntos: 18
usuario = Replace(request.form("usuario"), """", "")
  #21 (permalink)  
Antiguo 20/04/2005, 03:13
Avatar de silvia1977  
Fecha de Ingreso: abril-2005
Mensajes: 54
Antigüedad: 19 años, 2 meses
Puntos: 0
Pero asi reemplazas si el usuario pone 2 comillas dobles seguidas, pero y si pone una sola? Da un error de sintaxis incorrecta... La verdad es que esto con el recordset no me pasaba...
__________________
Silvia - Castellón :arriba:
  #22 (permalink)  
Antiguo 20/04/2005, 03:19
Avatar de trasgukabi  
Fecha de Ingreso: septiembre-2004
Mensajes: 2.749
Antigüedad: 19 años, 9 meses
Puntos: 18
no, así se reemplaza a una sola comilla doble.
  #23 (permalink)  
Antiguo 20/04/2005, 03:51
Avatar de moNTeZIon  
Fecha de Ingreso: enero-2005
Ubicación: Lliçà de Munt - BCN
Mensajes: 1.625
Antigüedad: 19 años, 5 meses
Puntos: 9
La comilla simple se sustituye por doble comilla simple,para que lo interprete realmente como una comilla simple, Y no te de errores ni malos resultados cuando el usuario introduzca comillas simples en las cajas de texto.

  #24 (permalink)  
Antiguo 20/04/2005, 03:52
Avatar de silvia1977  
Fecha de Ingreso: abril-2005
Mensajes: 54
Antigüedad: 19 años, 2 meses
Puntos: 0
Gracias es cierto lo que decis
__________________
Silvia - Castellón :arriba:
  #25 (permalink)  
Antiguo 20/04/2005, 04:49
Avatar de silvia1977  
Fecha de Ingreso: abril-2005
Mensajes: 54
Antigüedad: 19 años, 2 meses
Puntos: 0
Vuelvo a tener el problema de ayer con las fechas:

INSERT INTO usuarios (US_FECNAC, FECHA_ALTA) VALUES ('19/01/1988', '20/04/2005 12:43:52 p.m.')

Microsoft OLE DB Provider for ODBC Drivers error '80040e07'

[Microsoft][ODBC SQL Server Driver][SQL Server]Error de sintaxis al convertir una cadena de caracteres a datetime.

Que es lo que ocurre ahora? Ahora si que le pongo comillas simples a las fechas...

Ayuda porfos
__________________
Silvia - Castellón :arriba:
  #26 (permalink)  
Antiguo 20/04/2005, 05:01
Avatar de trasgukabi  
Fecha de Ingreso: septiembre-2004
Mensajes: 2.749
Antigüedad: 19 años, 9 meses
Puntos: 18
INSERT INTO usuarios (US_FECNAC, FECHA_ALTA) VALUES (#19/01/1988#, #20/04/2005 12:43:52 p.m.#)
  #27 (permalink)  
Antiguo 20/04/2005, 05:08
Avatar de moNTeZIon  
Fecha de Ingreso: enero-2005
Ubicación: Lliçà de Munt - BCN
Mensajes: 1.625
Antigüedad: 19 años, 5 meses
Puntos: 9
Mira un poquito más arriba...

Cita:
Iniciado por moNTeZIon
OK. Prueba a insertar así:

usu="INSERT INTO usuarios (US_NOMBRE, US_FECNAC) VALUES ( '" & nombre & "', #" & fecha_nac & "#)"

Creo recordar que era con almohadilla para fechas en SQL Server.
  #28 (permalink)  
Antiguo 20/04/2005, 05:08
Avatar de silvia1977  
Fecha de Ingreso: abril-2005
Mensajes: 54
Antigüedad: 19 años, 2 meses
Puntos: 0
He probado con las almuadillas y me dice:

Microsoft OLE DB Provider for ODBC Drivers error '80040e14'

[Microsoft][ODBC SQL Server Driver][SQL Server]El nombre '#20' no es válido en este contexto. Sólo se permiten constantes, expresiones o variables. No se permiten nombres de columna.
__________________
Silvia - Castellón :arriba:
  #29 (permalink)  
Antiguo 20/04/2005, 05:10
Avatar de silvia1977  
Fecha de Ingreso: abril-2005
Mensajes: 54
Antigüedad: 19 años, 2 meses
Puntos: 0
Lo pongo asi:

INSERT INTO usuarios (US_FECNAC, FECHA_ALTA) VALUES (#" & fecha_nac & "#, #" & Now() & "#)
__________________
Silvia - Castellón :arriba:
  #30 (permalink)  
Antiguo 20/04/2005, 05:13
Avatar de moNTeZIon  
Fecha de Ingreso: enero-2005
Ubicación: Lliçà de Munt - BCN
Mensajes: 1.625
Antigüedad: 19 años, 5 meses
Puntos: 9
Intenta algo así:

INSERT INTO usuarios (US_FECNAC, FECHA_ALTA) VALUES (#" & CDate(fecha_nac) & "#, #" & Now() & "#)

Si no de todas formas, investiga con FormatDateTime, igual debes meter la fecha en un formto determinado.

Ya nos dirás algo
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 23:47.