Jak połączyć się z bazą danych SQL Server z JavaScript w przeglądarce?

285

Czy ktoś może mi podać przykładowy kod źródłowy pokazujący, jak lokalnie połączyć się z bazą danych SQL Server 2005 z poziomu JavaScript? Uczę się programowania sieciowego na moim pulpicie.

Czy muszę używać innego języka skryptowego? Zaproponuj jakieś alternatywy, jeśli je masz, ale teraz próbuję to zrobić za pomocą JavaScript. Mój SQL Server jest zainstalowany lokalnie na moim pulpicie - SQL Server Management Studio 2005 i przeglądarka IE7.

Ciesz się kodowaniem
źródło
16
Zdecydowanie nie jest to zalecane, ale fajnie jest zobaczyć, jakie odpowiedzi mogą z tego wyniknąć.
TheTXI
2
Chcę połączyć się z bazą danych z Node.JS (implementacja javascript po stronie serwera) i przybyłem tutaj. Czy ktoś wie, gdzie powinienem po to pójść?
Roy Tinker,
2
@RoyTinker: Istnieje węzeł-postgres i węzeł-mysql.
Janus Troelsen
1
Czy istnieje darmowa baza danych, z której można skorzystać?
1
Możesz napisać backend REST używając Node.js i JavaScript i połączyć go z JavaScriptem po stronie klienta.
Fez Vrasta

Odpowiedzi:

701

Nie powinieneś używać klienta javascript do uzyskiwania dostępu do baz danych z kilku powodów (złe praktyki, problemy bezpieczeństwa itp.), Ale jeśli naprawdę chcesz to zrobić, oto przykład:

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; 

Lepszym sposobem połączenia się z serwerem sql byłoby użycie jakiegoś języka po stronie serwera, np. PHP, Java, .NET. Klient javascript powinien być używany tylko dla interfejsów.

Są pogłoski o starożytnej legendzie o istnieniu javascript serwera, ale to już inna historia. ;)

Fabio Vinicius Binder
źródło
323
Gratulujemy bycia właściwie jedyną osobą, która faktycznie pokazuje, że jest to możliwe (choć nie jest to zalecane).
TheTXI
6
Chociaż może to działać w konfiguracji PO - powiedział, że chce nauczyć się „programowania internetowego” - a Internet Explorer w środowisku o niskim poziomie bezpieczeństwa nie jest programowaniem internetowym.
Quentin
27
Nie rozumiem, dlaczego ten komentarz kwalifikuje się jako głos negatywny. Wyjaśniam, jak to zrobić, ale każę mu nie używać.
Fabio Vinicius Binder
26
fbinder: niektórzy zagłosują na to, ponieważ uważają, że każda próba połączenia z bazą danych i zapytania z JavaScript jest dużym nie-nie (nawet jeśli wyraźnie to stwierdzasz). Gdybym był tobą, nie miałbym nic przeciwko jednemu lub dwóm negatywnym głosom, które na to dostaniesz, i po prostu cieszę się z większej liczby głosów, które otrzymasz, ponieważ jest to jedyna odpowiedź, która faktycznie odpowiada na postawione pytanie.
TheTXI
36
Należy jednak prawdopodobnie zauważyć, że ta odpowiedź prawdopodobnie nie zadziała w przeglądarkach innych niż IE z powodu korzystania z ActiveX (nawet jeśli oryginalny plakat wyraźnie mówił o jego użyciu IE).
TheTXI
25

Byłoby to naprawdę złe, ponieważ udostępnianie ciągu połączenia otwiera witrynę na tak wiele luk, że nie można po prostu załatać, musisz użyć innej metody, jeśli chcesz, aby była bezpieczna. W przeciwnym razie otwierasz się przed ogromną publicznością, aby skorzystać z witryny.

Allen Walker
źródło
7
Głosuj, bo tak naprawdę wyjaśniłeś, dlaczego to zły pomysł
Reversed Engineer
wskazówki bezpieczeństwa bardziej użyteczne i ważne niż rozwiązania techniczne
szabla tabatabaee yazdi
9
Oddaj głos, ponieważ OP nie zapytał, czy to dobra czy zła praktyka, zapytali, jak to zrobić. Możesz wstawić, dlaczego może to być zły pomysł w trakcie ODPOWIEDZI, ale samo stwierdzenie, że jest to zły pomysł, nie zasługuje na własną odpowiedź, to w najlepszym razie komentarz.
Wobbles,
1
Co się stanie, jeśli piszesz coś za bezpieczną zaporą ogniową w celu połączenia z serwerem lokalnym?
Bryan Bryce
Popraw mnie, jeśli się mylę, ale jeśli podany użytkownik jest tylko do odczytu, a ty zarządzasz, do których tabel mają dostęp, jest to technicznie bezpieczne, dopóki coś się nie zmieni, nie? Nie radzę też, chyba że cała baza danych zawierała poufne informacje. Może umieścić poufne informacje w innym DB. Mogę sobie wyobrazić, że jest to przydatne w przypadku statycznej witryny internetowej bez żadnych poufnych informacji. Jeśli potrzebujesz uwierzytelnienia, możesz użyć asautacji oautj2 na innym serwerze.
Joe Flack
11

Idealny działający kod ..

    <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
źródło
10

usługi internetowe

SQL 2005+ obsługuje natywne usługi WebServices, których można prawie użyć, chociaż nie sugerowałbym tego, z powodu zagrożeń bezpieczeństwa, z którymi możesz się spotkać. Dlaczego powiedziałem prawie . Cóż, JavaScript nie jest rodzimym protokołem SOAP, więc zrobienie go byłoby nieco bardziej skomplikowane. Będziesz musiał wysyłać i odbierać SOAP przez XmlHttpRequest. Sprawdź w Google dla klientów Javascript SOAP.

Robert Koritnik
źródło
5

Grając w JavaScript w HTA, nie miałem szczęścia z driver={SQL Server};...ciągiem połączenia, ale nazwana DSN była OK:
skonfigurowałem TestDSN i przetestowałem OK, a potem działałemvar strConn= "DSN=TestDSN"; , więc kontynuowałem eksperymenty na potrzeby wewnętrznych testów i uczenia się.

Nasz serwer ma kilka uruchomionych instancji, np. Server1 \ dev i server1 \ Test, co sprawiło, że sprawy stały się nieco trudniejsze, ponieważ udało mi się zmarnować trochę czasu, zapominając o ucieczce \jako \\:)
Po kilku ślepych zaułkach z server=server1;instanceName=devciągami połączeń, w końcu dostałem jeden do pracy:
var strConn= "Provider=SQLOLEDB;Data Source=server1\\dev;Trusted_Connection=Yes;Initial Catalog=MyDatabase;"

Korzystając z poświadczeń systemu Windows zamiast dostarczania użytkownika / pwd, odkryłem, że ciekawą rozrywką było odkrywanie subtelności Integrated Security = truev Integrated Security = SSPIv Trusted_Connection=Yes- patrz Różnica między zintegrowanymi zabezpieczeniami = True a zintegrowanymi zabezpieczeniami = SSPI

Uważaj, aby RecordCount powróci, -1jakbyś używał domyślnego typu adOpenForwardOnly . Jeśli pracujesz z małymi zestawami wyników i / lub nie przeszkadza ci cała pamięć w tym samym czasie, użyj rs.Open(strQuery, objConnection, 3); (3 = adOpenStatic), a to da prawidłowy wynikrs.RecordCount

AjV Jsy
źródło
4

Jak powiedziano wcześniej, nie należy tego robić przy użyciu Javascript po stronie klienta, ale istnieją ramy dla bezpieczniejszego wdrażania tego, co chcesz.

Nodejs to framework, który pozwala kodować połączenia z serwerem w javascript, więc spójrz na Nodejs i prawdopodobnie dowiesz się nieco więcej o komunikacji z bazami danych i pobieraniu potrzebnych danych.

Shiri
źródło
3

(przepraszam, to była bardziej ogólna odpowiedź na temat backendów SQL - nie przeczytałem odpowiedzi na temat funkcji WebServices programu SQL Server 2005. Chociaż ta funkcja jest nadal uruchamiana przez HTTP, a nie bezpośrednio przez gniazda, więc zasadniczo zbudowali mini serwer WWW do serwera bazy danych, więc ta odpowiedź to kolejna droga, którą możesz wybrać.)

Możesz także łączyć się bezpośrednio za pomocą gniazd (google „javascript sockets”) i bezpośrednio w tym momencie mam na myśli użycie pliku Flash do tego celu, chociaż HTML5 ma Web Sockets jako część specyfikacji, która, jak sądzę, pozwala zrobić to samo.

Niektóre osoby powołują się na problemy z bezpieczeństwem, ale jeśli poprawnie zaprojektowałeś uprawnienia do bazy danych, teoretycznie powinieneś mieć dostęp do bazy danych z dowolnego interfejsu, w tym OSQL, i nie mieć naruszenia bezpieczeństwa. Problem bezpieczeństwa dotyczyłby wtedy, gdy nie łączysz się przez SSL.

Wreszcie jestem pewien, że to wszystko jest teoretyczne, ponieważ nie sądzę, aby istniały jakieś biblioteki JavaScript do obsługi protokołów komunikacyjnych dla SSL lub SQL Server, więc jeśli nie będziesz w stanie samodzielnie rozwiązać tych problemów, byłoby to możliwe. lepiej wybrać drogę między serwerem a językiem skryptowym po stronie serwera między przeglądarką a bazą danych.

Kev
źródło
2
Dobrze powiedziane. Nie ma nic złego w dostępie do bazy danych bezpośrednio od klienta (tj. Każdego grubego klienta, jaki kiedykolwiek powstał), a nie za pośrednictwem usługi internetowej. Jeśli używasz uwierzytelniania systemu Windows i dobrej warstwy bezpieczeństwa, nie ma w tym nic złego
Nick.McDermaid
1

Nie sądzę, że można połączyć się z serwerem SQL z javascripts po stronie klienta. Musisz wybrać język po stronie serwera, aby budować aplikacje internetowe, które mogą wchodzić w interakcje z bazą danych i używać javascript tylko po to, aby interfejs użytkownika był lepszy do interakcji.

możesz wybrać dowolny język skryptowy po stronie serwera, w zależności od preferencji językowych:

  • PHP
  • ASP.Net
  • Ruby On Rails
Vikram
źródło
1
To była jedna z jedynych prawdziwych odpowiedzi, jakie mogłem znaleźć. Jakie opcje ASP.net powinienem badać? Czego więcej oprócz sterowników Microsoft potrzebuję?
Rachael
potencjalnie możesz użyć ADO.Net lub Entity Framework / LinqToSql - którekolwiek z nich.
Vikram