Bagaimana cara terhubung ke database SQL Server dari JavaScript di browser?

285

Adakah yang bisa memberi saya beberapa kode sumber sampel yang menunjukkan cara terhubung ke database SQL Server 2005 dari JavaScript secara lokal? Saya belajar pemrograman web di desktop saya.

Atau apakah saya perlu menggunakan bahasa skrip lain? Sarankan beberapa alternatif jika Anda memilikinya, tetapi saya sekarang mencoba melakukannya dengan JavaScript. SQL Server saya diinstal secara lokal di desktop saya - SQL Server Management Studio 2005 dan browser IE7.

Nikmati pengkodean
sumber
16
Jelas tidak disarankan agar Anda melakukan ini, tetapi senang melihat jawaban apa yang keluar darinya.
TheTXI
2
Saya mencari untuk terhubung ke database dari Node.JS (implementasi javascript sisi-Server) dan saya tiba di sini. Adakah yang tahu ke mana saya harus pergi untuk itu?
Roy Tinker
2
@RoyTinker: Ada node-postgres dan node-mysql.
Janus Troelsen
1
Sebenarnya apakah ada database gratis yang bisa Anda gunakan?
1
Anda bisa menulis backend REST menggunakan Node.js dan JavaScript serta menghubungkannya dengan JavaScript sisi klien Anda.
Fez Vrasta

Jawaban:

701

Anda tidak boleh menggunakan javascript klien untuk mengakses database karena beberapa alasan (praktik buruk, masalah keamanan, dll.) Tetapi jika Anda benar-benar ingin melakukan ini, berikut ini sebuah contoh:

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; 

Cara yang lebih baik untuk terhubung ke server sql adalah dengan menggunakan beberapa bahasa sisi server seperti PHP, Java, .NET, antara lain. Klien javascript harus digunakan hanya untuk antarmuka.

Dan ada desas-desus tentang legenda kuno tentang keberadaan server javascript, tetapi ini adalah cerita lain. ;)

Fabio Vinicius Binder
sumber
323
Selamat telah menjadi satu-satunya orang di sini yang benar-benar menunjukkan bahwa itu mungkin (walaupun tidak disarankan).
TheTXI
6
Meskipun ini dapat bekerja pada pengaturan OP - dia mengatakan dia ingin belajar "pemrograman web" - dan Internet Explorer dalam lingkungan keamanan yang rendah bukanlah pemrograman web.
Quentin
27
Saya tidak mengerti mengapa komentar ini memenuhi syarat sebagai suara negatif. Saya menjelaskan bagaimana melakukannya tetapi katakan padanya untuk tidak menggunakannya.
Fabio Vinicius Binder
26
fbinder: beberapa orang akan memilih ini karena mereka berpikir bahwa setiap upaya konektivitas dan permintaan basis data dari JavaScript adalah tidak-tidak besar (walaupun Anda menyatakannya dengan cukup jelas). Jika saya jadi Anda, saya tidak akan keberatan satu atau dua suara negatif yang Anda dapatkan pada ini dan hanya menikmati banyak suara yang akan diterima karena itu menjadi satu-satunya jawaban yang benar-benar menjawab pertanyaan yang diajukan.
TheTXI
36
Perlu dicatat, bagaimanapun, bahwa jawaban ini mungkin tidak akan berfungsi untuk browser non-IE karena penggunaan ActiveX (walaupun poster asli secara eksplisit tentang penggunaan IE).
TheTXI
25

Ini akan sangat buruk untuk dilakukan karena berbagi string koneksi Anda membuka situs web Anda untuk begitu banyak kerentanan sehingga Anda tidak dapat dengan mudah menambal, Anda harus menggunakan metode yang berbeda jika Anda ingin aman. Kalau tidak, Anda membuka audiens yang besar untuk memanfaatkan situs Anda.

allen walker
sumber
7
Terpilih karena Anda benar-benar menjelaskan mengapa itu adalah ide yang buruk
Reversed Engineer
kiat keamanan lebih bermanfaat dan penting daripada solusi teknis
saber tabatabaee yazdi
9
Suara turun karena OP tidak bertanya apakah itu praktik yang baik atau buruk, mereka bertanya bagaimana. Anda dapat menyisipkan mengapa itu mungkin ide yang buruk di sepanjang JAWABAN yang sebenarnya, tetapi hanya mengatakan itu adalah ide yang buruk tidak pantas menjadi jawabannya sendiri, itu adalah komentar terbaik.
Goyangan
1
Bagaimana jika Anda hanya menulis sesuatu di balik firewall yang aman untuk berinteraksi dengan server di tempat, apakah ini masih buruk?
Bryan Bryce
Koreksi saya jika saya salah tetapi jika pengguna yang disediakan hanya baca, dan Anda mengelola tabel mana yang dapat mereka akses, secara teknis aman sampai ada perubahan, bukan? Saya tidak akan menyarankan Anda kecuali seluruh DB berisi info yang tidak sensitif. Bisa memasukkan info sensitif ke DB lain. Saya bisa membayangkan ini berguna untuk situs web statis tanpa info sensitif. Jika perlu auth, bisa menggunakan oautj2 async di server lain.
Joe Flack
11

Kode kerja yang sempurna ..

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

Layanan web

SQL 2005+ mendukung layanan Web asli yang hampir dapat Anda gunakan walaupun saya tidak akan menyarankannya, karena risiko keamanan yang mungkin Anda hadapi. Kenapa aku hampir berkata . Yah Javascript bukan SOAP asli, jadi akan sedikit lebih rumit untuk membuatnya. Anda harus mengirim dan menerima sabun melalui XmlHttpRequest. Periksa google untuk klien SOAP Javascript.

Robert Koritnik
sumber
5

Bermain dengan JavaScript dalam HTA Saya tidak beruntung dengan driver={SQL Server};...string koneksi, tetapi DSN yang bernama OK:
saya mengatur TestDSN dan diuji OK, dan kemudian var strConn= "DSN=TestDSN";berhasil, jadi saya terus bereksperimen untuk pengujian di rumah dan tujuan pembelajaran.

Server kami memiliki beberapa contoh berjalan, misalnya server1 \ dev dan server1 \ Test yang membuat hal-hal sedikit lebih rumit karena saya berhasil membuang-buang waktu lupa untuk melarikan diri \sebagai \\:)
Setelah beberapa buntu dengan server=server1;instanceName=devdi koneksi string, saya akhirnya punya ini satu untuk bekerja:
var strConn= "Provider=SQLOLEDB;Data Source=server1\\dev;Trusted_Connection=Yes;Initial Catalog=MyDatabase;"

Menggunakan kredensial Windows daripada memasok pengguna / pwd, saya menemukan pengalihan yang menarik adalah menemukan seluk-beluk Integrated Security = truev Integrated Security = SSPIv Trusted_Connection=Yes- lihat Perbedaan antara Keamanan Terpadu = Benar dan Keamanan Terpadu = SSPI

Berhati-hatilah bahwa RecordCount akan kembali seolah- -1olah menggunakan tipe adOpenForwardOnly default . Jika Anda bekerja dengan set hasil kecil dan / atau tidak keberatan seluruh lot di memori sekaligus, gunakan rs.Open(strQuery, objConnection, 3); (3 = adOpenStatic) dan ini memberikan validrs.RecordCount

Ajs Jsy
sumber
4

Seperti yang dinyatakan sebelumnya itu tidak boleh dilakukan menggunakan Javascript sisi klien tetapi ada kerangka kerja untuk menerapkan apa yang Anda inginkan lebih aman.

Nodejs adalah kerangka kerja yang memungkinkan Anda untuk membuat kode koneksi server dalam javascript sehingga melihat Nodejs dan Anda mungkin akan belajar lebih banyak tentang berkomunikasi dengan database dan mengambil data yang Anda butuhkan.

Shiri
sumber
3

(maaf, ini adalah jawaban yang lebih umum tentang SQL backends - Saya belum membaca jawaban tentang fitur WebServices SQL Server 2005. Meskipun, fitur ini masih dijalankan melalui HTTP daripada lebih langsung melalui soket, jadi pada dasarnya mereka telah membangun server web mini ke server database, jadi jawaban ini masih merupakan rute lain yang bisa Anda ambil.)

Anda juga dapat terhubung secara langsung menggunakan soket (google "soket javascript") dan secara langsung pada saat ini saya maksudkan menggunakan file Flash untuk tujuan ini, meskipun HTML5 memiliki Soket Web sebagai bagian dari spesifikasi yang saya percaya memungkinkan Anda melakukan hal yang sama.

Beberapa orang mengutip masalah keamanan, tetapi jika Anda merancang izin basis data dengan benar, Anda secara teoritis harus dapat mengakses basis data dari ujung depan apa pun, termasuk OSQL, dan tidak memiliki pelanggaran keamanan. Masalah keamanan, jika Anda tidak terhubung melalui SSL.

Akhirnya, saya cukup yakin ini semua teoretis karena saya tidak percaya ada pustaka JavaScript yang ada untuk menangani protokol komunikasi untuk SSL atau SQL Server, jadi kecuali Anda bersedia untuk memikirkan hal-hal ini sendiri, itu akan menjadi lebih baik untuk pergi rute memiliki server web dan bahasa scripting sisi server di antara browser dan database.

Kev
sumber
2
Kata baik. Tidak ada yang salah dengan mengakses database langsung dari klien (yaitu setiap klien tebal yang pernah dibuat) dan tidak melalui layanan web. Jika Anda menggunakan otentikasi windows dan lapisan keamanan yang baik tidak ada yang salah dengan ini
Nick.McDermaid
1

Saya tidak berpikir Anda dapat terhubung ke SQL server dari javascripts sisi klien. Anda perlu mengambil beberapa bahasa sisi server untuk membangun aplikasi web yang dapat berinteraksi dengan database Anda dan hanya menggunakan javascript untuk membuat antarmuka pengguna Anda lebih baik untuk berinteraksi.

Anda dapat mengambil bahasa skrip sisi server berdasarkan preferensi bahasa Anda:

  • PHP
  • ASP.Net
  • Ruby On Rails
Vikram
sumber
1
Ini adalah satu-satunya jawaban yang benar yang dapat saya temukan. Opsi ASP.net apa yang harus saya selidiki? Apa lagi selain driver microsoft yang saya butuhkan?
Rachael
Anda berpotensi menggunakan ADO.Net atau Kerangka Entitas / LinqToSql - semua ini sebenarnya.
Vikram