Come connettersi al database SQL Server da JavaScript nel browser?


285

Qualcuno può darmi un codice sorgente di esempio che mostra come connettersi a un database SQL Server 2005 da JavaScript localmente? Sto imparando la programmazione Web sul mio desktop.

O devo usare un altro linguaggio di scripting? Suggerisci alcune alternative se le hai, ma ora sto provando a farlo con JavaScript. Il mio SQL Server è installato localmente sul mio desktop - SQL Server Management Studio 2005 e browser IE7.


16
Decisamente sconsigliato di farlo, ma è bello vedere quali risposte possono derivarne.
TheXI

2
Sto cercando di connettermi a un database da Node.JS (implementazione di javascript sul lato server) e sono arrivato qui. Qualcuno sa dove dovrei andare per quello?
Roy Tinker,

2
@RoyTinker: c'è node-postgres e node-mysql.
Janus Troelsen,

1
In realtà c'è un database gratuito che puoi usare?

1
È possibile scrivere un backend REST utilizzando Node.js e JavaScript e interfacciarlo con JavaScript lato client.
Fez Vrasta,

Risposte:


701

Non dovresti usare il javascript del client per accedere ai database per diversi motivi (cattive pratiche, problemi di sicurezza, ecc.) Ma se vuoi davvero farlo, ecco un esempio:

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; 

Un modo migliore per connettersi a un server sql sarebbe usare un linguaggio lato server come PHP, Java, .NET, tra gli altri. Il client JavaScript deve essere utilizzato solo per le interfacce.

E ci sono voci di un'antica leggenda sull'esistenza di javascript sul server, ma questa è un'altra storia. ;)


323
Congratulazioni per essere praticamente l'unica persona qui che in realtà dimostra che è possibile (anche se non raccomandato).
TheXI

6
Mentre questo potrebbe funzionare sull'impostazione del PO - ha detto che voleva imparare la "programmazione web" - e Internet Explorer in un ambiente a bassa sicurezza non è la programmazione web.
Quentin,

27
Non capisco perché questo commento si qualifichi come voto negativo. Spiego come farlo ma gli dico di non usarlo.
Fabio Vinicius Binder,

26
fbinder: alcune persone lo voteranno perché pensano che qualsiasi tentativo di connettività al database e query da JavaScript sia un grande no-no (anche se lo affermi abbastanza chiaramente). Se fossi in te, non mi dispiacerebbe l'uno o due voti negativi che ottieni su questo e godrei solo dei numerosi voti positivi che riceverà perché è l'unica risposta che risponde effettivamente alla domanda posta.
TheXI

36
Dovrebbe probabilmente essere notato, tuttavia, che questa risposta probabilmente non funzionerà per i browser non IE a causa dell'uso di ActiveX (anche se il poster originale era esplicito sul suo uso di IE).
TheXI

25

Questo sarebbe davvero brutto da fare perché la condivisione della stringa di connessione apre il tuo sito Web a così tante vulnerabilità che non puoi semplicemente rattoppare, devi usare un metodo diverso se vuoi che sia sicuro. Altrimenti ti stai aprendo a un vasto pubblico per sfruttare il tuo sito.


7
Votazione perché in realtà hai spiegato perché è una cattiva idea
Reversed Engineer

suggerimenti per la sicurezza più utilizzabili e importanti delle soluzioni tecniche
sabre tabatabaee yazdi

9
Votano perché l'OP non ha chiesto se fosse una buona o cattiva pratica, hanno chiesto come. Puoi inserire il motivo per cui potrebbe essere una cattiva idea insieme a una vera RISPOSTA, ma solo dire che è una cattiva idea non merita di essere la sua risposta, è un commento al massimo.
Wobbles,

1
Che cosa succede se stai scrivendo qualcosa dietro un firewall sicuro per l'interfaccia con un server locale, è ancora male?
Bryan Bryce,

Correggimi se sbaglio, ma se l'utente fornito è di sola lettura e gestisci a quali tabelle possono accedere, è tecnicamente sicuro fino a quando qualcosa non cambia, no? Non lo consiglierei neanche a meno che l'intero DB non contenga informazioni non sensibili. Potrebbe inserire informazioni riservate in un altro DB. Posso immaginare che ciò sia utile per un sito Web statico senza informazioni sensibili. Se necessario, auth, potrebbe utilizzare oautj2 async su un altro server.
Joe Flack,

11

Un codice di lavoro perfetto ..

    <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>

10

servizi web

SQL 2005+ supporta WebServices nativi che potresti quasi utilizzare anche se non lo consiglierei, a causa dei rischi per la sicurezza che potresti dover affrontare. Perché ho detto quasi . Beh, Javascript non è nativo SOAP, quindi sarebbe un po 'più complicato realizzarlo. Dovresti inviare e ricevere SOAP tramite XmlHttpRequest. Controlla su Google i client SOAP Javascript.


5

Giocando con JavaScript in un HTA non ho avuto fortuna con una driver={SQL Server};...stringa di connessione, ma un DSN di nome era OK:
ho impostato TestDSN e testato su OK, quindi var strConn= "DSN=TestDSN";ho funzionato, quindi ho continuato a sperimentare per i miei test interni e scopi di apprendimento.

Il nostro server ha diverse istanze in esecuzione, ad esempio server1 \ dev e server1 \ Test che hanno reso le cose un po 'più complicate poiché sono riuscito a perdere un po' di tempo dimenticandomi di sfuggire a \come \\:)
Dopo alcuni vicoli ciechi con server=server1;instanceName=devnelle stringhe di connessione, alla fine ho ottenuto questo uno a lavorare:
var strConn= "Provider=SQLOLEDB;Data Source=server1\\dev;Trusted_Connection=Yes;Initial Catalog=MyDatabase;"

Usando le credenziali di Windows invece di fornire un utente / pwd, ho scoperto che un diversivo interessante era scoprire le sottigliezze di Integrated Security = truev Integrated Security = SSPIv Trusted_Connection=Yes- vedi Differenza tra sicurezza integrata = vera e sicurezza integrata = SSPI

Ricorda che RecordCount tornerà come -1se usasse il tipo adOpenForwardOnly predefinito . Se stai lavorando con piccoli set di risultati e / o non ti dispiace l'intero lotto in memoria contemporaneamente, usa rs.Open(strQuery, objConnection, 3); (3 = adOpenStatic) e questo fornisce un validors.RecordCount


4

Come affermato in precedenza, non dovrebbe essere fatto utilizzando Javascript lato client ma esiste un framework per implementare ciò che si desidera in modo più sicuro.

Nodejs è un framework che ti consente di codificare le connessioni al server in javascript, quindi dai un'occhiata a Nodejs e probabilmente imparerai qualcosa in più sulla comunicazione con i database e sull'acquisizione dei dati di cui hai bisogno.


3

(scusate, questa era una risposta più generica sui back-end SQL: non avevo letto la risposta sulla funzione WebServices di SQL Server 2005. Sebbene questa funzionalità sia ancora eseguita su HTTP anziché più direttamente tramite socket, quindi essenzialmente hanno creato un mini web server nel server di database, quindi questa risposta è ancora un'altra strada che potresti prendere.)

Puoi anche connetterti direttamente usando socket (google "socket javascript") e direttamente a questo punto intendo usare un file Flash per questo scopo, sebbene HTML5 abbia Web Socket come parte delle specifiche che credo ti facciano fare la stessa cosa.

Alcune persone citano problemi di sicurezza, ma se hai progettato correttamente le autorizzazioni del tuo database dovresti teoricamente essere in grado di accedere al database da qualsiasi front-end, incluso OSQL, e non avere una violazione della sicurezza. Il problema di sicurezza, quindi, sarebbe se non ti stessi collegando tramite SSL.

Alla fine, però, sono abbastanza sicuro che tutto ciò sia teorico perché non credo che esistano librerie JavaScript per la gestione dei protocolli di comunicazione per SSL o SQL Server, quindi a meno che tu non sia disposto a capire da solo queste cose sarebbe meglio seguire la strada per avere un server web e un linguaggio di scripting lato server tra il browser e il database.


2
Ben detto. Non c'è nulla di sbagliato nell'accedere a un database direttamente da un client (ovvero ogni client spesso mai realizzato) e non attraverso un servizio web. Se usi l'autenticazione di Windows e un buon livello di sicurezza non c'è niente di sbagliato in questo
Nick.McDermaid

1

Non credo che tu possa connetterti al server SQL da javascript sul lato client. È necessario acquisire un po 'di lingua lato server per creare applicazioni Web in grado di interagire con il database e utilizzare JavaScript solo per rendere migliore l'interfaccia utente con cui interagire.

puoi scegliere qualsiasi linguaggio di scripting lato server in base alle tue preferenze di lingua:

  • PHP
  • ASP.Net
  • Ruby On Rails

1
Questa è stata una delle uniche vere risposte che ho potuto trovare. Quali opzioni ASP.net dovrei indagare? Cosa devo aggiungere ai driver Microsoft?
Rachael,

potresti potenzialmente utilizzare ADO.Net o Entity Framework / LinqToSql - uno qualsiasi di questi in realtà.
Vikram,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.