¿Cómo conectarse a la base de datos de SQL Server desde JavaScript en el navegador?

285

¿Alguien puede darme un código fuente de muestra que muestre cómo conectarse a una base de datos SQL Server 2005 desde JavaScript localmente? Estoy aprendiendo programación web en mi escritorio.

¿O necesito usar algún otro lenguaje de script? Sugiera algunas alternativas si las tiene, pero ahora estoy tratando de hacerlo con JavaScript. Mi SQL Server está instalado localmente en mi escritorio: SQL Server Management Studio 2005 y el navegador IE7.

Disfruta codificando
fuente
16
Definitivamente no es recomendable que hagas esto, pero es bueno ver qué respuestas pueden surgir.
TheTXI
2
Estoy buscando conectarme a una base de datos desde Node.JS (implementación de JavaScript del lado del servidor) y llegué aquí. Alguien sabe a dónde debo ir para eso?
Roy Tinker
2
@RoyTinker: hay node-postgres y node-mysql.
Janus Troelsen
1
¿Existe una base de datos gratuita que pueda usar?
1
Puede escribir un backend REST usando Node.js y JavaScript e interactuar con su JavaScript del lado del cliente.
Fez Vrasta

Respuestas:

701

No debe usar javascript del cliente para acceder a las bases de datos por varias razones (malas prácticas, problemas de seguridad, etc.), pero si realmente desea hacerlo, aquí hay un ejemplo:

var connection = new ActiveXObject("ADODB.Connection") ;

var connectionstring="Data Source=<server>;Initial Catalog=<catalog>;User ID=<user>;Password=<password>;Provider=SQLOLEDB";

connection.Open(connectionstring);
var rs = new ActiveXObject("ADODB.Recordset");

rs.Open("SELECT * FROM table", connection);
rs.MoveFirst
while(!rs.eof)
{
   document.write(rs.fields(1));
   rs.movenext;
}

rs.close;
connection.close; 

Una mejor manera de conectarse a un servidor sql sería utilizar algún lenguaje del lado del servidor como PHP, Java, .NET, entre otros. El javascript del cliente debe usarse solo para las interfaces.

Y hay rumores de una antigua leyenda sobre la existencia del servidor javascript, pero esta es otra historia. ;)

Carpeta Fabio Vinicius
fuente
323
Felicitaciones por ser la única persona aquí que realmente demuestra que es posible (aunque no recomendado).
TheTXI
66
Si bien esto podría funcionar en la configuración del OP, dijo que quería aprender "programación web", e Internet Explorer en un entorno de baja seguridad no es programación web.
Quentin
27
No entiendo por qué este comentario califica como un voto negativo. Le explico cómo hacerlo, pero le digo que no lo use.
Fabio Vinicius Binder
26
fbinder: algunas personas rechazarán esto porque piensan que cualquier intento de conectividad a la base de datos y consultas desde JavaScript es un gran no-no (a pesar de que lo dices con bastante claridad). Si yo fuera usted, no me importaría los uno o dos votos negativos que obtenga sobre esto y simplemente disfrute de los numerosos votos positivos que recibirá debido a que es la única respuesta que realmente responde a la pregunta planteada.
TheTXI
36
Sin embargo, probablemente debería tenerse en cuenta que esta respuesta probablemente no funcionará para navegadores que no sean IE debido al uso de ActiveX (aunque el póster original fue explícito sobre su uso de IE).
TheTXI
25

Esto sería realmente malo porque compartir su cadena de conexión abre su sitio web a tantas vulnerabilidades que no puede simplemente parchear, tiene que usar un método diferente si desea que sea seguro. De lo contrario, se está abriendo a una gran audiencia para aprovechar su sitio.

Allen Walker
fuente
77
Vota porque realmente explicaste por qué es una mala idea
Ingeniero invertido
consejos de seguridad más útiles e importantes que las soluciones técnicas
saber tabatabaee yazdi
9
Voto negativo porque el OP no preguntó si era buena o mala práctica, preguntaron cómo. Puede insertar por qué puede ser una mala idea a lo largo de una RESPUESTA real, pero solo decir que es una mala idea no merece ser su propia respuesta, es un comentario en el mejor de los casos.
tambalea el
1
¿Qué sucede si solo está escribiendo algo detrás de un firewall seguro para interactuar con un servidor local? ¿Sigue siendo malo?
Bryan Bryce
Corríjame si me equivoco, pero si el usuario proporcionado es de solo lectura y usted administra a qué tablas puede acceder, es técnicamente seguro hasta que algo cambie, ¿no? Tampoco lo recomendaría a menos que toda la base de datos contuviera información no confidencial. Podría poner información confidencial en otra base de datos. Me imagino que esto será útil para un sitio web estático sin información confidencial. Si necesita autenticación, podría usar oautj2 async en otro servidor.
Joe Flack el
11

Un código de trabajo perfecto.

    <script>
    var objConnection = new ActiveXObject("adodb.connection");
    var strConn = "driver={sql server};server=QITBLRQIPL030;database=adventureworks;uid=sa;password=12345";
    objConnection.Open(strConn);
    var rs = new ActiveXObject("ADODB.Recordset");
    var strQuery = "SELECT * FROM  Person.Address";
    rs.Open(strQuery, objConnection);
    rs.MoveFirst();
    while (!rs.EOF) {
        document.write(rs.fields(0) + "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;");
        document.write(rs.fields(1) + "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;");
        document.write(rs.fields(2) + "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    ");
        document.write(rs.fields(3) + "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    ");
        document.write(rs.fields(4) + "<br/>");
        rs.movenext();
    }
</script>
Uthaiah
fuente
10

servicios web

SQL 2005+ es compatible con los servicios web nativos que casi podría usar, aunque no lo sugeriría, debido a los riesgos de seguridad que puede enfrentar. ¿Por qué dije casi ? Bueno, Javascript no es SOAP nativo, por lo que sería un poco más complicado hacerlo. Tendría que enviar y recibir SOAP vía XmlHttpRequest. Consulte google para clientes Javascript SOAP.

Robert Koritnik
fuente
5

Al jugar con JavaScript en una HTA no tuve suerte con una driver={SQL Server};...cadena de conexión, pero un DSN con nombre estaba bien:
configuré TestDSN y probó OK, y luego var strConn= "DSN=TestDSN";funcionó, así que seguí experimentando para mis pruebas internas y para aprender.

Nuestro servidor tiene varias instancias ejecutándose, por ejemplo, server1 \ dev y server1 \ Test, lo que hizo que las cosas fueran un poco más complicadas, ya que logré perder el tiempo olvidando escapar del \as \\:)
Después de algunos callejones sin salida server=server1;instanceName=deven las cadenas de conexión, finalmente obtuve esto uno para trabajar:
var strConn= "Provider=SQLOLEDB;Data Source=server1\\dev;Trusted_Connection=Yes;Initial Catalog=MyDatabase;"

Utilizando las credenciales de Windows en lugar de proporcionar un usuario / pwd, descubrí que una diversión interesante era descubrir las sutilezas de Integrated Security = truev Integrated Security = SSPIv Trusted_Connection=Yes: consulte Diferencia entre seguridad integrada = verdadera y seguridad integrada = SSPI

Tenga en cuenta que RecordCount volverá como -1si estuviera usando el tipo predeterminado adOpenForwardOnly . Si está trabajando con pequeños conjuntos de resultados y / o no le importa todo el conjunto de la memoria a la vez, use rs.Open(strQuery, objConnection, 3); (3 = adOpenStatic) y esto le da un valor válidors.RecordCount

AjV Jsy
fuente
4

Como se indicó anteriormente, no debe hacerse usando Javascript del lado del cliente, pero hay un marco para implementar lo que desea de manera más segura.

Nodejs es un marco que le permite codificar las conexiones del servidor en JavaScript, así que eche un vistazo a Nodejs y probablemente aprenderá un poco más sobre cómo comunicarse con las bases de datos y obtener los datos que necesita.

Shiri
fuente
3

(lo siento, esta fue una respuesta más genérica sobre los backends de SQL; no había leído la respuesta sobre la función WebServices de SQL Server 2005. Aunque, esta característica aún se ejecuta a través de HTTP en lugar de hacerlo directamente a través de sockets, por lo que esencialmente han construido un mini servidor web en el servidor de la base de datos, por lo que esta respuesta es otra ruta que podría tomar).

También puedes conectarte directamente usando sockets (google "javascript sockets") y directamente en este punto me refiero a usar un archivo Flash para este propósito, aunque HTML5 tiene Web Sockets como parte de la especificación que creo te permite hacer lo mismo.

Algunas personas citan problemas de seguridad, pero si diseñaste correctamente los permisos de tu base de datos, teóricamente deberías poder acceder a la base de datos desde cualquier interfaz, incluido OSQL, y no tener una violación de seguridad. El problema de seguridad, entonces, sería si no te conectaras a través de SSL.

Finalmente, sin embargo, estoy bastante seguro de que todo esto es teórico porque no creo que existan bibliotecas de JavaScript para manejar los protocolos de comunicaciones para SSL o SQL Server, por lo que, a menos que esté dispuesto a resolver estas cosas usted mismo, sería es mejor seguir la ruta de tener un servidor web y un lenguaje de script del lado del servidor entre el navegador y la base de datos.

Kev
fuente
2
Bien dicho. No hay nada de malo en acceder a una base de datos directamente desde un cliente (es decir, cada cliente grueso jamás creado) y no a través de un servicio web. Si usa la autenticación de Windows y una buena capa de seguridad, esto no tiene nada de malo
Nick.McDermaid
1

No creo que pueda conectarse al servidor SQL desde los javascripts del lado del cliente. Debe aprender un poco del lenguaje del lado del servidor para crear aplicaciones web que puedan interactuar con su base de datos y usar JavaScript solo para mejorar la interacción de su interfaz de usuario.

puede elegir cualquier lenguaje de script del lado del servidor según su preferencia de idioma:

  • PHP
  • ASP.Net
  • Ruby on Rails
Vikram
fuente
1
Esta fue una de las únicas respuestas verdaderas que pude encontrar. ¿Qué opciones de ASP.net debería investigar? ¿Qué más, además de los controladores de Microsoft, necesito?
Rachael
potencialmente podría usar ADO.Net o Entity Framework / LinqToSql, cualquiera de estos realmente.
Vikram