Pregunta

Tengo un par de preguntas sobre VBScript y ASP Classic:

  1. ¿Cuál es la forma preferida de acceder a una base de datos de MS SQL Server en VBScript/ASP?

  2. ¿Cuáles son las mejores prácticas con respecto a separar el modelo de la vista del controlador?

  3. ¿Alguna otra cosa que deba saber sobre VBScript o ASP?

Si no lo has notado, soy nuevo en la codificación VBScript.Me doy cuenta de que los números 2 y 3 son una especie de preguntas gigantes sobre "agujeros negros" que son demasiado generales, así que no crean que espero aprender todo lo que hay que saber sobre esas dos preguntas desde aquí.

¿Fue útil?

Solución

ADO es una excelente manera de acceder a una base de datos en VBScript/Classic ASP.

Dim db: Set db = Server.CreateObject("ADODB.Connection")
db.Open "yourconnectionstring -> see connectionstrings.com"
Dim rs: Set rs = db.Execute("SELECT firstName from Employees")
While Not rs.EOF
    Response.Write rs("firstName")
    rs.MoveNext
Wend
rs.Close

Más información aquí: http://www.technowledgebase.com/2007/06/12/vbscript-how-to-create-an-ado-connection-and-run-a-query/

Una advertencia es que si devuelve un campo MEMO en un conjunto de registros, asegúrese de seleccionar solo UN campo MEMO a la vez y asegúrese de que sea la ÚLTIMA columna de su consulta.De lo contrario te encontrarás con problemas.(Referencia: http://lists.evolt.org/archive/Week-of-Mon-20040329/157305.html )

Otros consejos

Tuve que alejarme de mi PC cuando vi la primera respuesta y todavía me preocupa que haya sido aprobada por tanta gente.Es un ejemplo atroz del peor tipo de código ASP, el tipo que garantizaría que su sitio sea inyectable con SQL y, si continúa usando este código en todo el sitio, se pueda piratear a una pulgada de su vida útil.

¡Este NO es el tipo de código que deberías darle a alguien nuevo en la codificación ASP, ya que pensará que es la forma profesional de codificar en el lenguaje!

  1. NUNCA revele una cadena de conexión en su código, ya que contiene el nombre de usuario y la contraseña de su base de datos.Utilice un archivo UDL en su lugar, o al menos una constante que pueda declararse en otro lugar y usarse en todo el sitio.

  2. Ya no existe ninguna buena excusa para utilizar SQL en línea para cualquier operación en un entorno web.Utilice un procedimiento almacenado: nunca se pueden enfatizar lo suficiente los beneficios de seguridad.Si realmente no puede hacer eso, considere los parámetros en línea como la segunda mejor opción...SQL en línea dejará su sitio abierto a la inyección de SQL, la inyección de malware y el resto.

  3. La declaración tardía de variables puede provocar una codificación descuidada.Utilice la "opción explícita" y declare las variables en la parte superior de la función.Esta es una mejor práctica en lugar de una verdadera WTF, pero es mejor comenzar como desea continuar.

  4. No hay pistas para la base de datos sobre qué tipo de conexión es: ¿es solo para lectura o el usuario actualizará los registros?La conexión se puede optimizar y la base de datos puede manejar el bloqueo de manera muy eficiente si se le dice de manera efectiva qué esperar.

  5. La conexión de la base de datos no se cierra después de su uso y el objeto del conjunto de registros no se destruye por completo.

ASP sigue siendo un lenguaje potente, a pesar de que mucha gente sugiere pasar a .NET: con buenas prácticas de codificación se puede escribir un sitio ASP que sea fácil de mantener, escalable y rápido, pero DEBES asegurarte de utilizar todos los métodos disponibles para hacerlo. Para que su código sea eficiente, DEBE mantener buenas prácticas de codificación y un poco de previsión.Un buen editor también será de ayuda; prefiero PrimalScript, que encuentro más útil para un codificador ASP que cualquiera de los últimos productos de MS que parecen estar muy centrados en .NET.

Además, ¿de dónde proviene el campo "MEMO"?¿Es esta la nomenclatura de Access o quizás MySQL?Lo pregunto porque estos campos se han llamado campos TEXTO o NTEXT en MS-SQL durante una década.

Recuerda programar en el lenguaje en lugar de programar en él.El hecho de que esté utilizando un conjunto de herramientas limitado no significa que tenga que programar como si fuera 1999.

Estoy de acuerdo con JasonS sobre las clases.Es cierto que no puedes hacer cosas como la herencia, pero puedes fingirla fácilmente.

Class Dog
    Private Parent

    Private Sub Class_Initialize()
        Set Parent = New Animal
    End Sub

    Public Function Walk()
        Walk = Parent.Walk
    End Function

    Public Function Bark()
        Response.Write("Woof! Woof!")
    End Function
End Class

En mis proyectos una página ASP tendrá lo siguiente:INC-APP-CommonIncludes.asp: incluye cosas como mis bibliotecas generales (acceso a bases de datos, funciones de archivos, etc.), configura la seguridad e incluye archivos de configuración (como cadenas de conexión, ubicaciones de directorios, etc.) y clases comunes (Usuario, Permiso). , etc) y está incluido en cada página.

Modules/ModuleName/page.vb.asp: algo así como un código detrás de la página.Incluye clases BO, BLL y DAL específicas de la página y configura los datos requeridos para la página/recibe los datos del formulario enviado, etc.

Modules/ModuleName/Display/INC-DIS-Page.asp: muestra los datos configurados en page.vb.asp.

Haciendo eco de algunas ideas y agregando algunas mías:

1) La mejor manera de acceder a la base de datos sería abstraerla en un componente COM de algún tipo al que se accede desde VBScript.

2) Si realmente lo desea, puede escribir el controlador en VBScript y luego acceder a él en la página.Se parecería a un patrón de controlador de página y no a un controlador frontal que vería en ASP.NET MVC o MonoRail.

3) ¿Por qué te haces esto a ti mismo?La mayoría de las herramientas necesarias para realizar este tipo de trabajo ya ni siquiera están disponibles.

AX: Asp Xtreme Evolution es un marco MVC para ASP clásico

Hay algunos intentos de crear marcos de prueba para ASP:aspUnit es bueno, pero ya no se mantiene.

Hace unos meses vi una muestra de cómo hacer el tuyo propio.El ejemplo utilizó nUnit para llamar funciones en el sitio web para pruebas automáticas.Creo que lo saqué aquí (mi línea está defectuosa así que no puedo verificarla)

En el número 2, creo que tienes algunas opciones...

1) Puede utilizar componentes COM desarrollados en VB6 o similares para separar parte de su lógica empresarial de su interfaz de usuario.

2) Puedes crear clases en VBScript.No existe el concepto de herencia y faltan otras características más avanzadas en la implementación, pero puedes encapsular la lógica en clases que ayuden a reducir la espaguedad de tu aplicación.Mira esto: http://www.4guysfromrolla.com/webtech/092399-1.shtml

Estoy de acuerdo con @Cirieno en que no sería prudente utilizar la respuesta seleccionada en el código de producción, por todas las razones que menciona.Dicho esto, si tiene un poco de experiencia, esta respuesta es un buen punto de partida en cuanto a los conceptos básicos.

En mi experiencia con ASP, preferí escribir la capa de acceso a mi base de datos usando VB, compilándola en una DLL y haciendo referencia a la DLL a través de VBScript.Es difícil depurar directamente a través de ASP, pero fue una buena manera de encapsular todo el código de acceso a datos fuera del código ASP.

Muy en el pasado, cuando VBScript/ASP todavía estaba bien, trabajé en una compañía de servicios públicos con una envidación de DB muy mixta, solía jurar por este sitio web: http://www.connectionstrings.com/

@michealpryor lo hizo bien

He estado estancado construyendo en ASP y siento tu dolor.

1) La mejor manera de realizar consultas en SQL Server es mediante consultas parametrizadas;esto ayudará a prevenir ataques de inyección SQL.

Tutorial (no es mi blog):
http://www.nomadpete.com/2007/03/23/classic-asp-what-is-still-alive-and-parametised-queries/

2) No he visto nada sobre MVC específicamente orientado a ASP, pero definitivamente estoy interesado porque es algo que me está costando entender.Generalmente trato de contener al menos cosas que son similares a vistas y cosas que son similares a controladores en funciones separadas.Supongo que podrías escribir código en archivos separados y luego usar las inclusiones del lado del servidor para volver a unirlos.

3) Probablemente provengas de un idioma que tiene más funciones integradas.Al principio, puede parecer que faltan algunas cosas, pero a menudo es sólo cuestión de escribir muchas más líneas de código de las que estás acostumbrado.

También para el acceso a la base de datos tengo un conjunto de funciones: GetSingleRecord, GetRecordset y UpdateDatabase que tienen una función similar a la que Michael menciona anteriormente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top