Comment se connecter à la base de données SQL Server à partir de JavaScript dans le navigateur?

285

Quelqu'un peut-il me donner un exemple de code source montrant comment se connecter localement à une base de données SQL Server 2005 à partir de JavaScript? J'apprends la programmation Web sur mon bureau.

Ou dois-je utiliser un autre langage de script? Suggérez des alternatives si vous les avez, mais j'essaie maintenant de le faire avec JavaScript. Mon SQL Server est installé localement sur mon bureau - SQL Server Management Studio 2005 et le navigateur IE7.

Profitez du codage
la source
16
Certainement pas recommandé de le faire, mais c'est agréable de voir quelles réponses peuvent en sortir.
TheTXI
2
Je cherche à me connecter à une base de données de Node.JS (implémentation de Javascript côté serveur) et je suis arrivé ici. Quelqu'un sait où je dois aller pour ça?
Roy Tinker
2
@RoyTinker: Il y a node-postgres et node-mysql.
Janus Troelsen
1
Existe-t-il une base de données gratuite que vous pouvez utiliser?
1
Vous pouvez écrire un backend REST en utilisant Node.js et JavaScript et l'interfacer avec votre JavaScript côté client.
Fez Vrasta

Réponses:

701

Vous ne devez pas utiliser le javascript client pour accéder aux bases de données pour plusieurs raisons (mauvaise pratique, problèmes de sécurité, etc.) mais si vous voulez vraiment le faire, voici un exemple:

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; 

Une meilleure façon de se connecter à un serveur SQL serait d'utiliser un langage côté serveur comme PHP, Java, .NET, entre autres. Le javascript client ne doit être utilisé que pour les interfaces.

Et il y a des rumeurs d'une ancienne légende sur l'existence du serveur javascript, mais c'est une autre histoire. ;)

Fabio Vinicius Binder
la source
323
Félicitations d'être à peu près la seule personne ici qui montre que c'est possible (bien que ce ne soit pas recommandé).
TheTXI
6
Bien que cela puisse fonctionner sur la configuration du PO - il a dit qu'il voulait apprendre la «programmation Web» - et Internet Explorer dans un environnement à faible sécurité n'est pas de la programmation Web.
Quentin
27
Je ne comprends pas pourquoi ce commentaire est considéré comme un vote négatif. Je lui explique comment le faire mais lui dis de ne pas l'utiliser.
Fabio Vinicius Binder
26
fbinder: certaines personnes voteront contre parce qu'elles pensent que toute tentative de connectivité à une base de données et d'interrogation à partir de JavaScript est un grand non (même si vous le dites assez clairement). Si j'étais vous, cela ne me dérangerait pas du ou des deux votes négatifs que vous obtenez à ce sujet et je profite simplement des nombreux votes positifs qu'il recevra car c'est la seule réponse qui répond réellement à la question posée.
TheTXI
36
Il convient toutefois de noter que cette réponse ne fonctionnera probablement pas pour les navigateurs non IE en raison de l'utilisation d'ActiveX (même si l'affiche originale était explicite sur son utilisation d'IE).
TheTXI
25

Ce serait vraiment mauvais à faire, car le partage de votre chaîne de connexion ouvre votre site Web à tant de vulnérabilités que vous ne pouvez pas simplement corriger, vous devez utiliser une méthode différente si vous voulez qu'il soit sécurisé. Sinon, vous vous ouvrez à un large public pour profiter de votre site.

Walker Allen
la source
7
Votez parce que vous avez en fait expliqué pourquoi c'était une mauvaise idée
Ingénieur inversé
conseils de sécurité plus utilisables et importants que les solutions techniques
saber tabatabaee yazdi
9
Voter contre parce que le PO n'a pas demandé si c'était une bonne ou une mauvaise pratique, ils ont demandé comment. Vous pouvez insérer pourquoi il peut s'agir d'une mauvaise idée le long d'une RÉPONSE réelle, mais simplement dire que c'est une mauvaise idée ne mérite pas d'être sa propre réponse, c'est au mieux un commentaire.
Wobbles
1
Que se passe-t-il si vous écrivez simplement quelque chose derrière un pare-feu sécurisé pour interfacer avec un serveur local, est-ce toujours mauvais?
Bryan Bryce
Corrigez-moi si je me trompe, mais si l'utilisateur fourni est en lecture seule et que vous gérez à quelles tables il peut accéder, c'est techniquement sûr jusqu'à ce que quelque chose change, non? Je ne le conseillerais pas non plus, sauf si la base de données entière contenait des informations non sensibles. Pourrait mettre des informations sensibles dans une autre base de données. Je peux imaginer que cela soit utile pour un site Web statique sans informations sensibles. Si besoin d'authentification, pourrait utiliser async oautj2 sur un autre serveur.
Joe Flack
11

Un code de travail parfait ..

    <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
la source
10

services Web

SQL 2005+ prend en charge les WebServices natifs que vous pourriez presque utiliser, même si je ne le suggérerais pas, en raison des risques de sécurité que vous pourriez rencontrer. Pourquoi ai-je dit presque . Eh bien, Javascript n'est pas natif SOAP, il serait donc un peu plus compliqué de le faire. Vous devez envoyer et recevoir SOAP via XmlHttpRequest. Vérifiez google pour les clients Javascript SOAP.

Robert Koritnik
la source
5

Jouer avec JavaScript dans un HTA Je n'ai pas eu de chance avec une driver={SQL Server};...chaîne de connexion, mais un DSN nommé était OK:
j'ai configuré TestDSN et il a testé OK, puis a var strConn= "DSN=TestDSN";fonctionné, j'ai donc continué à expérimenter pour mes tests internes et à des fins d'apprentissage.

Notre serveur a plusieurs instances en cours d'exécution, par exemple server1 \ dev et server1 \ Test, ce qui a rendu les choses un peu plus délicates car j'ai réussi à perdre un peu de temps à oublier d'échapper au \as \\:)
Après quelques impasses avec server=server1;instanceName=devles chaînes de connexion, j'ai finalement obtenu ceci un pour travailler:
var strConn= "Provider=SQLOLEDB;Data Source=server1\\dev;Trusted_Connection=Yes;Initial Catalog=MyDatabase;"

En utilisant les informations d'identification Windows plutôt que de fournir un utilisateur / pwd, j'ai trouvé une diversion intéressante en découvrant les subtilités de Integrated Security = truev Integrated Security = SSPIv Trusted_Connection=Yes- voir Différence entre Integrated Security = True et Integrated Security = SSPI

Attention, RecordCount reviendra comme -1si vous utilisiez le type adOpenForwardOnly par défaut . Si vous travaillez avec de petits ensembles de résultats et / ou si cela ne vous dérange pas du tout en mémoire à la fois, utilisez rs.Open(strQuery, objConnection, 3); (3 = adOpenStatic) et cela donne une valeur validers.RecordCount

AjV Jsy
la source
4

Comme indiqué précédemment, cela ne devrait pas être fait en utilisant Javascript côté client, mais il existe un cadre pour implémenter ce que vous voulez de manière plus sécurisée.

Nodejs est un cadre qui vous permet de coder les connexions au serveur en javascript, alors jetez un œil à Nodejs et vous en apprendrez probablement un peu plus sur la communication avec les bases de données et la saisie des données dont vous avez besoin.

Shiri
la source
3

(désolé, c'était une réponse plus générique sur les backends SQL - je n'avais pas lu la réponse sur la fonctionnalité WebServices de SQL Server 2005. Bien que cette fonctionnalité soit toujours exécutée via HTTP plutôt que plus directement via des sockets, ils ont donc essentiellement construit un mini serveur Web dans le serveur de base de données, donc cette réponse est encore une autre voie que vous pourriez prendre.)

Vous pouvez également vous connecter directement à l'aide de sockets (google "javascript sockets") et par directement à ce stade, j'entends utiliser un fichier Flash à cet effet, bien que HTML5 ait des sockets Web dans le cadre des spécifications qui, je crois, vous permettent de faire la même chose.

Certaines personnes citent des problèmes de sécurité, mais si vous avez correctement conçu les autorisations de votre base de données, vous devriez théoriquement pouvoir accéder à la base de données à partir de n'importe quel front-end, y compris OSQL, et ne pas avoir de violation de sécurité. Le problème de sécurité serait alors si vous ne vous connectiez pas via SSL.

Enfin, je suis presque sûr que tout cela est théorique car je ne crois pas qu'il existe de bibliothèques JavaScript pour gérer les protocoles de communication pour SSL ou SQL Server, donc à moins que vous ne vouliez comprendre ces choses par vous-même, ce serait il vaut mieux suivre la voie d'un serveur Web et d'un langage de script côté serveur entre le navigateur et la base de données.

Kev
la source
2
Bien dit. Il n'y a rien de mal à accéder à une base de données directement depuis un client (c'est-à-dire tous les clients lourds jamais créés) et non via un service Web. Si vous utilisez l'authentification Windows et une bonne couche de sécurité, il n'y a rien de mal à cela
Nick.McDermaid
1

Je ne pense pas que vous puissiez vous connecter au serveur SQL à partir de javascripts côté client. Vous devez choisir un langage côté serveur pour créer des applications Web qui peuvent interagir avec votre base de données et utiliser javascript uniquement pour améliorer l'interaction avec votre interface utilisateur.

vous pouvez choisir n'importe quel langage de script côté serveur en fonction de votre préférence de langue:

  • PHP
  • ASP.Net
  • Ruby On Rails
Vikram
la source
1
C'était l'une des seules vraies réponses que j'ai pu trouver. Quelles options ASP.net devrais-je étudier? De quoi ai-je besoin en plus des pilotes Microsoft?
Rachael
vous pourriez potentiellement utiliser ADO.Net ou Entity Framework / LinqToSql - n'importe lequel d'entre eux en fait.
Vikram