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

Funcion para conexion a la base de datos...

Estas en el tema de Funcion para conexion a la base de datos... en el foro de ASP Clásico en Foros del Web. Hola, tengo la función está que les dejo para conectarme a la base de datos, cuando creo un RS de esta forma anda: set RS ...
  #1 (permalink)  
Antiguo 19/05/2005, 20:31
 
Fecha de Ingreso: marzo-2005
Mensajes: 1.418
Antigüedad: 19 años, 2 meses
Puntos: 9
Funcion para conexion a la base de datos...

Hola, tengo la función está que les dejo para conectarme a la base de datos, cuando creo un RS de esta forma anda:

set RS = Server.CreateObject("ADODB.RecordSet")
RS.Open "SELECT * FROM Productos", connect_to("Tienda")

Pero si hago esto otro:

set RS = connect_to("Tienda").Execute("SELECT * FROM Productos")

Me da este error:

Se requiere un objeto: '[string: "Provider=MSDASQL.1;E"]

Por que puede ser?

Les dejo la función. Saludos. Suerte!

function connect_to(database)

ruta = Server.MapPath(database&".mdb")

set conn = Server.CreateObject("ADODB.Connection")
conn.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & ruta

connect_to = conn

end function
  #2 (permalink)  
Antiguo 20/05/2005, 10:01
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 5 meses
Puntos: 98
Bueno, no estoy seguro que esto funcione, pero una función en el sentido extricto, te debería regresar un valor, de tal manera que trata lo siguiente

objConn = connect_to("Tienda")

set RS = ObjConn("Tienda").Execute("SELECT * FROM Productos")

Pero para el caso es lo mismo, particularmente no entiendo por qué hacer una función para una conexión.

En este mismo foro me parece que hay una función de Lexus, busca en sus mensajes

Salu2,
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #3 (permalink)  
Antiguo 20/05/2005, 11:37
 
Fecha de Ingreso: marzo-2005
Mensajes: 1.418
Antigüedad: 19 años, 2 meses
Puntos: 9
Hola U Goldman, hice lo que me probaste y me sigue dando el mismo error. Y lo de la función de conexion me evita tener que escribir siempre lo mismo. La guardo en un archivo, junto con otras funciones que utilizo en la mayoria de las paginas, y luego en cada una de las paginas en las que necesito la conexion hago un include. Pero si no encuentro la solución para este error, voy a tener que escribir en cada una de las paginas el string de la conexion, ya que generalmente establezco el RS de esa forma.
Saludos U Goldman, muchas gracias.
  #4 (permalink)  
Antiguo 20/05/2005, 11:41
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 5 meses
Puntos: 98
Pues hazte una conexion normal en un archivo y llamala a nivel de include y listo, la ocupas donde quieras

Salu2,
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #5 (permalink)  
Antiguo 20/05/2005, 12:05
 
Fecha de Ingreso: marzo-2005
Mensajes: 1.418
Antigüedad: 19 años, 2 meses
Puntos: 9
Si, eso voy a hacer, gracias U Goldman. Pero lo que pasa es que no siempre esa conexion va a ser necesaria, porque en el mismo include tnego varias funciones generales, por lo tanto si no lo agrego a una función, siempre que haga el include de esa página me va a conectar a la base de datos, y hay veces que no va a ser necesario. Por eso lo bueno era ponerla en una función y llamarla cuando sea necesario. La otra es poner en un archivo unicamente la conexion, pero no se si hacer un include por un par de lineas de código. Tu que piensas? Ah por cierto, encontré la función de Lexus que mencionaste, y me daba exactamente el mismo error. Saludos U Goldman.
  #6 (permalink)  
Antiguo 20/05/2005, 14:04
Avatar de Neuron_376  
Fecha de Ingreso: abril-2005
Mensajes: 1.051
Antigüedad: 19 años, 2 meses
Puntos: 2
Hola!

Prueba asi.. tienes error logico.

function connect_to(database)

ruta = Server.MapPath(database&".mdb")

set conn = Server.CreateObject("ADODB.Connection")
conn.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & ruta

set connect_to = conn

end function

set RS = connect_to("Tienda").Execute("SELECT * FROM Productos")

Si eso aun marca error, prueba asi...

set conn = connect_to(database)

set RS = conn.Execute("SELECT * FROM Productos")

Bueno, por lo menos en cuestion de como pasar el valor del objeto con eso se arregla, no mire si tienes otros errorcillos.

Y bueno, si es muy util tener una funcion que te hace todo el trabajo de la conexion, no comparto contigo tener la base de datos como variable, pero es posible porque yo uso DSN y no lo necesito, pero me parece bien que tengas esa funcion central.

Suerte!!
__________________
NeuronaNet.com... la idea correcta.
http://www.NeuronaNet.com
  #7 (permalink)  
Antiguo 20/05/2005, 14:08
Avatar de Neuron_376  
Fecha de Ingreso: abril-2005
Mensajes: 1.051
Antigüedad: 19 años, 2 meses
Puntos: 2
Anexo:

Y respecto al include, haz un include donde tengas solo funciones de bases de datos y ahi la metes, ese sera tal vez al principio un include pequeño, pero conforme avazces es mas funciones sera mas grande, y no tiene nada de malo hacer un include pequeño cuando saber que lo usaras en muchos puntos.
__________________
NeuronaNet.com... la idea correcta.
http://www.NeuronaNet.com
  #8 (permalink)  
Antiguo 20/05/2005, 14:09
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 5 meses
Puntos: 98
La verdad yo no veo ninguna diferencia, finalmente pasas por todas las etapas de la creación de un objeto, es exactamente lo mismo que si solamente tienes una constante con la conexión e instancias el objeto pasándole esa constante, terminas de usarla, la destruyes, no tiene caso complicarse la vida con una función que te devuelve un objeto conexión..IMHO

Salú!
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #9 (permalink)  
Antiguo 20/05/2005, 14:20
Avatar de Neuron_376  
Fecha de Ingreso: abril-2005
Mensajes: 1.051
Antigüedad: 19 años, 2 meses
Puntos: 2
Hola!

De la constante no entendí...

De la conexion, la verdad me resulta mejor tener una funcion, donde..

1. on error resume next
2. crear objeto
3. verificar error
4. regresar un objeto totalmente valido.

Son como 10 lineas de codigo ahorrado por pagina

Ademas que los parametros como USR PWD DSN, etc, esos si estan en una constante APLICATTION (para que todos las compartan y nocargar constantes para cada usuario) que solo debo pasarle a esta funcion para crear conexiones segun el nivel de permisos del punto de la pagina, ejemplo: PUBLIC, ATENCIO_A_CLIENTES, ADMINISTRADOR.

Resulta mas practico, y se vuelve muy util cuando tienes un sistema grande.

Ahi es donde radica su uso.
La verdad es que es ahi donde radica su uso
__________________
NeuronaNet.com... la idea correcta.
http://www.NeuronaNet.com
  #10 (permalink)  
Antiguo 20/05/2005, 14:26
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 5 meses
Puntos: 98
Código:
const 	strConnect = "Provider=SQLOLEDB.1;"&_
	             "Persist Security Info=True;"&_
				 "User ID=DBO;Password=ForosDelWeb;Initial Catalog=MyDB;Data Source=MyServer"
Esto deberá estar en un include

Después donde quieras utilizar

Set Oconn = Server.createObject("ADODB.Connection")
Oconn.Open strConnect

Dos lineas de codigo y te evitas el uso de funciones que hacen lo mismo...

Editando: Al destruir me referia obvio a la conexion, no a la constante, reitero, no tiene caso hacer una funcion para este proposito...a menos que por ejemplo, la base de datos variara. Mis $0.02

Salu2,
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway

Última edición por u_goldman; 20/05/2005 a las 14:35
  #11 (permalink)  
Antiguo 20/05/2005, 14:50
 
Fecha de Ingreso: marzo-2005
Mensajes: 1.418
Antigüedad: 19 años, 2 meses
Puntos: 9
Bueno, antes que nada muchas gracias a los dos por responderme como lo han hecho. Siempre son de mucha ayuda. El código que me pasaste Neuron funciona correctamente. También quiero agregar que me parece totalmente válido el argumento que presentas Neuron para utlilizar funciones de conexion. Pero también me gusto muchísimo la idea que presentó U Goldman de guardar en una constante la cadena de conexión y hacer un include con eso. La verdad que no se por cual decidirme, pero eso es bueno, porque las dos soluciones me parecen efectivas.
No tengo palabras para agradecerles sus respuestas, por ahi piensan que exagero, pero para alguien que recién comienza en esto de ASP y la programación, es realmente muy instructivo y da muchas ganas de seguir aprendiendo y seguir programando.
Saludos.
  #12 (permalink)  
Antiguo 20/05/2005, 15:04
 
Fecha de Ingreso: marzo-2005
Mensajes: 1.418
Antigüedad: 19 años, 2 meses
Puntos: 9
Hola, acabo de probar como lo harías tu U Goldman, me arroja el error que se espera una constante literal. Por qué será?
  #13 (permalink)  
Antiguo 20/05/2005, 15:10
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 5 meses
Puntos: 98
mmmmhhh, puede ser, en realidad el prefijo const salio de la manga en este momento, quitaselo y dejalo como una variable, que mas da?
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #14 (permalink)  
Antiguo 20/05/2005, 15:39
Avatar de Neuron_376  
Fecha de Ingreso: abril-2005
Mensajes: 1.051
Antigüedad: 19 años, 2 meses
Puntos: 2
De acuerdo!!

const strConnect = "Provider=SQLOLEDB.1;"&_
"Persist Security Info=True;"&_
"User ID=DBO;Password=ForosDelWeb;Initial Catalog

Ese metodo como dices me parece totalmente valido, pero por ejemplo, ese tipo de constantes las pondrias en Aplicattion como mencione antes, porque ya que son constantes estaticas para toda tu funcionalidad, la pones en Aplicattion para tener siempre en memoria solamente una copia. Eso lo hace mas eficiente, y si, yo tambien manejo esa clase de constantes.

Pero la funciona hace mucho mas que solo la conexion, ejemplo:

Dim Oconn
on error resume next 'Esto previene un error de conexion por cualquier motivo

Set Oconn = Server.createObject("ADODB.Connection")
Oconn.Open Aplicattion("CadenaConexion")

if OConn.Errors.Count > 0 then
set Oconn = nothing
Oconn = NULL
end if

set functionConn = Oconn

end function

Esta funcion no esta solamente creando una conexion y despreocupandose, sino que esta creando una conexion, verificando si hay error, etc, tambien se base en tu opcion de la constante, sin embargo en mi caso las constantes estan en APLICATTION porque ahi es mas eficiente, y mi cadena de conexion es tipo DSN, por lo demas es totalmente igual.

__________________
NeuronaNet.com... la idea correcta.
http://www.NeuronaNet.com

Última edición por Neuron_376; 20/05/2005 a las 16:09
  #15 (permalink)  
Antiguo 20/05/2005, 15:52
Avatar de Neuron_376  
Fecha de Ingreso: abril-2005
Mensajes: 1.051
Antigüedad: 19 años, 2 meses
Puntos: 2
Por cierto..

El error de la constante es porque tiene &, ponla totalmente lineal y funcionara...

const strConnect = "Provider=SQLOLEDB.1; Persist Security Info=True;User ID=DBO;Password=ForosDelWeb;Initial Catalog"

Asi debe de funcionar, es que en cuestion de constantes no acepta nada que no sea totalmente lineal.
__________________
NeuronaNet.com... la idea correcta.
http://www.NeuronaNet.com
  #16 (permalink)  
Antiguo 20/05/2005, 16:09
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 5 meses
Puntos: 98
Es cierto

Pero vuelvo a la misma, es hacer las cosas dos veces...pues si el argumento es el error handler, necesitaras validar en tu codigo que el objeto que estas tratando de crear mediante la funcion no sea nulo, a mi parecer hay muchas cosas de hacer las cosas y quizas bajo otra plataforma esto sea aceptable, pero me parece que esta demas en ASP, yo tambien suelo hacer eso de almacenar el string en el global.asa, pero como algunos proyectos no lo tienen, lo hago en un include.

Salu2,
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #17 (permalink)  
Antiguo 20/05/2005, 16:12
Avatar de Neuron_376  
Fecha de Ingreso: abril-2005
Mensajes: 1.051
Antigüedad: 19 años, 2 meses
Puntos: 2
Bien.

Todo es valido..., mientras funcione bien, pues adelante, ahi estan los comentarios
__________________
NeuronaNet.com... la idea correcta.
http://www.NeuronaNet.com
  #18 (permalink)  
Antiguo 20/05/2005, 17:10
 
Fecha de Ingreso: marzo-2005
Mensajes: 1.418
Antigüedad: 19 años, 2 meses
Puntos: 9
E-X-C-E-L-E-N-T-E!!, totalmente de acuerdo con lo que han dicho. Y si hay algo que me gusta en esto de programación es que hay diferentes formas de hacer la misma cosa y siempre funcionando bien. Como dije antes me parecen tan válidas las dos alternativas que sinceramente no se cuál usar.
Por cierto Neuron, sacandole el & si funcionaba la constante. Sino ya para probar la había guardado en una variable como dijo U Goldman, y mucho mejor aún está guardada en el global.asa.
Saludos y MUCHAS GRACIAS A LOS DOS!
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 22:49.