Làm cách nào để kết nối với cơ sở dữ liệu SQL Server từ JavaScript trong trình duyệt?


285

Ai đó có thể cho tôi một số mã nguồn mẫu cho biết cách kết nối với cơ sở dữ liệu SQL Server 2005 từ JavaScript cục bộ không? Tôi đang học lập trình web trên máy tính để bàn của tôi.

Hay tôi cần sử dụng bất kỳ ngôn ngữ kịch bản nào khác? Đề xuất một số lựa chọn thay thế nếu bạn có chúng, nhưng tôi hiện đang cố gắng làm điều đó với JavaScript. Máy chủ SQL của tôi được cài đặt cục bộ trên máy tính để bàn của tôi - SQL Server Management Studio 2005 và trình duyệt IE7.


16
Chắc chắn không nên làm điều này, nhưng thật tuyệt khi thấy câu trả lời nào có thể được đưa ra.
TheTXI

2
Tôi đang tìm cách kết nối với cơ sở dữ liệu từ Node.JS (triển khai javascript phía Máy chủ) và tôi đã đến đây. Bất cứ ai biết tôi nên đi đâu cho điều đó?
Roy Tinker

2
@RoyTinker: Có nút-postgres và nút-mysql.
Janus Troelsen

1
Thực tế có một cơ sở dữ liệu miễn phí mà bạn có thể sử dụng?

1
Bạn có thể viết một phụ trợ REST bằng Node.js và JavaScript và giao diện nó với JavaScript phía máy khách của bạn.
Fez Vrasta

Câu trả lời:


701

Bạn không nên sử dụng javascript của khách hàng để truy cập cơ sở dữ liệu vì một số lý do (thực tiễn xấu, vấn đề bảo mật, v.v.) nhưng nếu bạn thực sự muốn làm điều này, đây là một ví dụ:

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; 

Một cách tốt hơn để kết nối với máy chủ sql là sử dụng một số ngôn ngữ phía máy chủ như PHP, Java, .NET, cùng với các ngôn ngữ khác. Khách hàng javascript chỉ nên được sử dụng cho các giao diện.

Và có tin đồn về một truyền thuyết cổ xưa về sự tồn tại của javascript máy chủ, nhưng đây là một câu chuyện khác. ;)


323
Xin chúc mừng vì đã có khá nhiều người duy nhất ở đây thực sự cho thấy điều đó là có thể (mặc dù không được khuyến nghị).
TheTXI

6
Mặc dù điều này có thể hoạt động trên thiết lập của OP - anh ta đã nói rằng anh ta muốn học "lập trình web" - và Internet Explorer trong môi trường bảo mật thấp không phải là lập trình web.
Quentin

27
Tôi không thể hiểu tại sao bình luận này đủ điều kiện là một phiếu bầu tiêu cực. Tôi giải thích làm thế nào để làm điều đó nhưng nói với anh ta không sử dụng nó.
Fabio Vinicius Binder

26
fbinder: một số người sẽ bỏ phiếu này vì họ nghĩ rằng bất kỳ nỗ lực nào đối với kết nối cơ sở dữ liệu và truy vấn từ JavaScript là không có gì lớn (mặc dù bạn nói rõ điều đó). Nếu tôi là bạn, tôi sẽ không bận tâm đến một hoặc hai phiếu bầu tiêu cực mà bạn nhận được về điều này và chỉ cần tận hưởng nhiều phiếu bầu mà nó sẽ nhận được do đó là câu trả lời duy nhất thực sự trả lời câu hỏi được đặt ra.
TheTXI

36
Tuy nhiên, có lẽ cần lưu ý rằng câu trả lời này có thể sẽ không hoạt động đối với các trình duyệt không phải IE do sử dụng ActiveX (mặc dù áp phích ban đầu rõ ràng về việc sử dụng IE của anh ấy).
TheTXI

25

Điều này sẽ thực sự tồi tệ vì việc chia sẻ chuỗi kết nối của bạn sẽ mở ra trang web của bạn với rất nhiều lỗ hổng mà bạn không thể vá, bạn phải sử dụng một phương pháp khác nếu bạn muốn bảo mật. Nếu không, bạn đang mở ra một lượng lớn khán giả để tận dụng lợi thế của trang web của bạn.


7
Upvote bởi vì bạn thực sự đã giải thích lý do tại sao đó là một ý tưởng tồi
Kỹ sư đảo ngược

mẹo bảo mật có thể sử dụng và quan trọng hơn các giải pháp kỹ thuật
saber tabatabaee yazdi

9
Bỏ phiếu vì OP không hỏi đó là thực hành tốt hay xấu, họ hỏi làm thế nào. Bạn có thể chèn lý do tại sao nó có thể là một ý tưởng tồi cùng với TRẢ LỜI thực tế, nhưng chỉ nói đó là một ý tưởng tồi không xứng đáng là câu trả lời của riêng nó, đó là một nhận xét tốt nhất.
Rung lắc

1
Điều gì sẽ xảy ra nếu bạn chỉ viết một cái gì đó đằng sau tường lửa an toàn để giao tiếp với máy chủ tại chỗ, điều này có còn tệ không?
Bryan Bryce

Chỉnh sửa cho tôi nếu tôi sai nhưng nếu người dùng được cung cấp chỉ đọc và bạn quản lý bảng nào họ có thể truy cập, nó an toàn về mặt kỹ thuật cho đến khi có gì đó thay đổi, phải không? Tôi cũng không khuyên tho trừ khi toàn bộ DB chứa thông tin không nhạy cảm. Có thể đặt thông tin nhạy cảm trong một DB khác. Tôi có thể tưởng tượng điều này hữu ích cho một trang web tĩnh không có thông tin nhạy cảm. Nếu cần auth, có thể sử dụng oautj2 async trên máy chủ khác.
Joe Flack

11

Một mã làm việc hoàn hảo ..

    <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

Dịch vụ web

SQL 2005+ hỗ trợ các Dịch vụ web gốc mà bạn gần như có thể sử dụng mặc dù tôi không đề xuất nó, vì các rủi ro bảo mật mà bạn có thể gặp phải. Tại sao tôi nói gần như vậy . Javascript không phải là bản địa SOAP, vì vậy sẽ thực sự phức tạp hơn một chút để thực hiện nó. Bạn sẽ phải gửi và nhận SOAP qua XmlHttpRequest. Kiểm tra google cho khách hàng Javascript SOAP.


5

Chơi với JavaScript trong HTA Tôi không gặp may với driver={SQL Server};...chuỗi kết nối, nhưng DSN có tên là OK:
Tôi đã thiết lập TestDSN và nó đã kiểm tra OK, sau đó var strConn= "DSN=TestDSN";hoạt động, vì vậy tôi đã tiếp tục thử nghiệm cho mục đích học tập và thử nghiệm nội bộ của mình.

Máy chủ của chúng tôi có một số trường hợp đang chạy, ví dụ như server1 \ devserver1 \ Test , điều này khiến mọi thứ trở nên khó khăn hơn một chút khi tôi đã lãng phí thời gian để quên thoát \như \\:)
Sau một số kết thúc server=server1;instanceName=devtrong chuỗi kết nối, cuối cùng tôi đã nhận được điều này một để làm việc:
var strConn= "Provider=SQLOLEDB;Data Source=server1\\dev;Trusted_Connection=Yes;Initial Catalog=MyDatabase;"

Sử dụng thông tin đăng nhập Windows thay vì cung cấp người dùng / pwd, tôi thấy một trò giải trí thú vị là khám phá sự tinh tế của Integrated Security = truev Integrated Security = SSPIv Trusted_Connection=Yes- xem Sự khác biệt giữa Bảo mật tích hợp = Bảo ​​mật tích hợp và Bảo mật tích hợp = SSPI

Coi chừng RecordCount sẽ quay lại như -1thể sử dụng loại adOpenForwardOnly mặc định . Nếu bạn đang làm việc với các tập kết quả nhỏ và / hoặc không rs.Open(strQuery, objConnection, 3); bận tâm đến toàn bộ bộ nhớ cùng một lúc, hãy sử dụng (3 = adOpenStatic) và điều này mang lại hiệu lựcrs.RecordCount


4

Như đã nêu trước đây, không nên thực hiện bằng Javascript phía máy khách nhưng có một khung để triển khai những gì bạn muốn một cách an toàn hơn.

Nodejs là một khung cho phép bạn mã hóa các kết nối máy chủ trong javascript, vì vậy hãy xem Nodejs và bạn có thể sẽ tìm hiểu thêm một chút về giao tiếp với cơ sở dữ liệu và lấy dữ liệu bạn cần.


3

(xin lỗi, đây là câu trả lời chung chung hơn về phụ trợ SQL - Tôi chưa đọc câu trả lời về tính năng Dịch vụ web của SQL Server 2005. Mặc dù, tính năng này vẫn chạy trên HTTP thay vì trực tiếp hơn qua ổ cắm, vì vậy về cơ bản chúng đã được xây dựng một máy chủ web mini vào máy chủ cơ sở dữ liệu, vì vậy câu trả lời này vẫn là một lộ trình khác mà bạn có thể đi.)

Bạn cũng có thể kết nối trực tiếp bằng cách sử dụng ổ cắm (google "ổ cắm javascript") và trực tiếp tại thời điểm này, ý tôi là sử dụng tệp Flash cho mục đích này, mặc dù HTML5 có Ổ cắm Web như một phần của thông số mà tôi tin rằng bạn cho phép bạn làm điều tương tự.

Một số người trích dẫn các vấn đề bảo mật, nhưng nếu bạn thiết kế quyền cơ sở dữ liệu của mình một cách chính xác, về mặt lý thuyết bạn có thể truy cập cơ sở dữ liệu từ bất kỳ giao diện người dùng nào, bao gồm OSQL và không vi phạm bảo mật. Vấn đề bảo mật sẽ là nếu bạn không kết nối qua SSL.

Tuy nhiên, cuối cùng, tôi khá chắc chắn đây chỉ là lý thuyết vì tôi không tin bất kỳ thư viện JavaScript nào tồn tại để xử lý các giao thức truyền thông cho SSL hoặc SQL Server, vì vậy trừ khi bạn sẵn sàng tự mình tìm ra những điều này. tốt hơn để đi theo con đường có một máy chủ web và ngôn ngữ kịch bản phía máy chủ ở giữa trình duyệt và cơ sở dữ liệu.


2
Nói hay lắm. Không có gì sai khi truy cập cơ sở dữ liệu trực tiếp từ máy khách (tức là mọi máy khách dày từng được tạo ra) và không thông qua dịch vụ web. Nếu bạn sử dụng xác thực windows và lớp bảo mật tốt thì không có gì sai cả
Nick.McDilyn

1

Tôi không nghĩ rằng bạn có thể kết nối với máy chủ SQL từ javascripts phía máy khách. Bạn cần chọn một số ngôn ngữ phía máy chủ để xây dựng các ứng dụng web có thể tương tác với cơ sở dữ liệu của bạn và chỉ sử dụng javascript để làm cho giao diện người dùng của bạn tốt hơn để tương tác.

bạn có thể chọn bất kỳ ngôn ngữ kịch bản phía máy chủ nào dựa trên tùy chọn ngôn ngữ của bạn:

  • PHP
  • ASP.Net
  • Viên ngọc trên tay vịn

1
Đây là một trong những câu trả lời đúng duy nhất tôi có thể tìm thấy. Tôi nên điều tra những lựa chọn nào của ASP.net? Tôi cần thêm gì nữa ngoài trình điều khiển microsoft?
Rachael

bạn có khả năng có thể sử dụng ADO.Net hoặc Entity Framework / LinqToSql - bất kỳ thứ nào trong số này thực sự.
Vikram
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.