จะเชื่อมต่อกับฐานข้อมูล SQL Server จาก JavaScript ในเบราว์เซอร์ได้อย่างไร?


285

ใครช่วยให้ฉันตัวอย่างซอร์สโค้ดแสดงวิธีการเชื่อมต่อกับฐานข้อมูล SQL Server 2005 จาก JavaScript ภายในเครื่องได้ไหม ฉันกำลังเรียนรู้การเขียนโปรแกรมเว็บบนเดสก์ท็อปของฉัน

หรือฉันจำเป็นต้องใช้ภาษาสคริปต์อื่น ๆ แนะนำทางเลือกบางอย่างถ้าคุณมี แต่ตอนนี้ฉันพยายามทำด้วย JavaScript SQL Server ของฉันติดตั้งในเครื่องบนเดสก์ท็อปของฉัน - เบราว์เซอร์ SQL Server Management Studio 2005 และ IE7


16
ไม่แนะนำอย่างแน่นอนให้คุณทำเช่นนี้ แต่ก็ยินดีที่ได้เห็นว่าคำตอบอาจเกิดจากอะไร
TheTXI

2
ฉันกำลังมองหาการเชื่อมต่อกับฐานข้อมูลจาก Node.JS (การใช้งานจาวาสคริปต์ฝั่งเซิร์ฟเวอร์) และฉันมาถึงที่นี่ ใครรู้ว่าฉันควรจะไปเพื่ออะไร
Roy Tinker

2
@RoyTinker: มี node-postgres และ node-mysql
Janus Troelsen

1
จริงๆแล้วมีฐานข้อมูลฟรีหรือเปล่าที่คุณสามารถใช้ได้?

1
คุณสามารถเขียนแบ็กเอนด์ REST โดยใช้ Node.js และ JavaScript และเชื่อมต่อกับ JavaScript ฝั่งไคลเอ็นต์ของคุณ
Fez Vrasta

คำตอบ:


701

คุณไม่ควรใช้จาวาสคริปต์ของลูกค้าเพื่อเข้าถึงฐานข้อมูลด้วยเหตุผลหลายประการ (การปฏิบัติที่ไม่ดีปัญหาด้านความปลอดภัย ฯลฯ ) แต่ถ้าคุณต้องการทำสิ่งนี้จริง ๆ นี่คือตัวอย่าง:

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; 

วิธีที่ดีกว่าในการเชื่อมต่อกับเซิร์ฟเวอร์ sql คือการใช้ภาษาฝั่งเซิร์ฟเวอร์เช่น PHP, Java, .NET และอื่น ๆ จาวาสคริปต์ไคลเอ็นต์ควรใช้สำหรับอินเตอร์เฟสเท่านั้น

และมีข่าวลือเกี่ยวกับตำนานโบราณเกี่ยวกับการมีอยู่ของเซิร์ฟเวอร์จาวาสคริปต์ แต่นี่เป็นอีกเรื่องหนึ่ง ;)


323
ขอแสดงความยินดีกับการเป็นคนเดียวที่สวยที่แสดงให้เห็นว่าเป็นไปได้จริง ๆ (แม้ว่าจะไม่แนะนำ)
TheTXI

6
ขณะนี้สามารถใช้งานการตั้งค่า OP ได้ - เขาบอกว่าเขาต้องการเรียนรู้ "การเขียนโปรแกรมเว็บ" - และ Internet Explorer ในสภาพแวดล้อมที่มีความปลอดภัยต่ำไม่ใช่การเขียนโปรแกรมเว็บ
Quentin

27
ฉันไม่เข้าใจว่าทำไมความคิดเห็นนี้จึงมีคุณสมบัติเป็นการลงคะแนนเชิงลบ ฉันอธิบายวิธีทำ แต่บอกให้เขาไม่ใช้
Fabio Vinicius Binder

26
fbinder: บางคนจะออกเสียงลงคะแนนเพราะพวกเขาคิดว่าความพยายามในการเชื่อมต่อฐานข้อมูลและการสืบค้นจาก JavaScript นั้นเป็นเรื่องที่ไม่ต้องทำเลย (แม้ว่าคุณจะระบุไว้อย่างชัดเจนก็ตาม) ถ้าฉันเป็นคุณฉันจะไม่รังเกียจคะแนนโหวตติดลบที่คุณได้รับเพียงหนึ่งหรือสองคะแนนและสนุกกับการโหวตมากมายที่จะได้รับเนื่องจากเป็นคำตอบเดียวที่ตอบคำถามจริง ๆ
TheTXI

36
ควรสังเกตว่าคำตอบนี้อาจไม่ทำงานสำหรับเบราว์เซอร์ที่ไม่ใช่ IE เนื่องจากการใช้ ActiveX (แม้ว่าผู้โพสต์ดั้งเดิมจะชัดเจนเกี่ยวกับการใช้ IE ของเขา)
TheTXI

25

นี่จะเป็นสิ่งที่ไม่ดีจริง ๆ เนื่องจากการแบ่งปันสตริงการเชื่อมต่อของคุณเปิดเว็บไซต์ของคุณไปยังช่องโหว่มากมายที่คุณไม่สามารถแก้ไขได้เพียงแค่คุณต้องใช้วิธีการอื่นหากคุณต้องการความปลอดภัย ไม่เช่นนั้นคุณจะเปิดรับผู้ชมจำนวนมากเพื่อใช้ประโยชน์จากไซต์ของคุณ


7
โหวตขึ้นเพราะคุณอธิบายว่าทำไมมันเป็นความคิดที่ไม่ดี
วิศวกรที่กลับรายการ

เคล็ดลับความปลอดภัยสามารถใช้งานได้และสำคัญกว่าโซลูชันทางเทคนิค
saber tabatabaee yazdi

9
ลงคะแนนเพราะ OP ไม่ได้ถามว่ามันเป็นการปฏิบัติที่ดีหรือไม่ดีพวกเขาถามว่า คุณสามารถแทรกสาเหตุที่อาจเป็นความคิดที่ไม่ดีในคำตอบที่แท้จริง แต่เพียงแค่บอกว่ามันเป็นความคิดที่ไม่ดีไม่สมควรที่จะเป็นคำตอบของตัวเองมันเป็นความคิดเห็นที่ดีที่สุด
Wobbles

1
ถ้าคุณเพิ่งเขียนบางสิ่งที่อยู่หลังไฟร์วอลล์ที่ปลอดภัยเพื่อเชื่อมต่อกับเซิร์ฟเวอร์ในสถานที่สิ่งนี้ก็ยังไม่ดี
ไบรอัน Bryce

แก้ไขให้ถูกต้องหากฉันผิด แต่ถ้าผู้ใช้ให้เป็นแบบอ่านอย่างเดียวและคุณจัดการตารางที่พวกเขาสามารถเข้าถึงได้มันจะปลอดภัยทางเทคนิคจนกว่าจะมีบางสิ่งเปลี่ยนแปลงใช่ไหม? ฉันจะไม่แนะนำเช่นนั้นเว้นแต่ว่า DB ทั้งหมดมีข้อมูลที่ไม่ละเอียดอ่อน สามารถใส่ข้อมูลที่ละเอียดอ่อนในฐานข้อมูลอื่น ฉันสามารถจินตนาการได้ว่าสิ่งนี้มีประโยชน์สำหรับเว็บไซต์ที่ไม่มีข้อมูลที่ละเอียดอ่อน หากต้องการรับรองความถูกต้องสามารถใช้ oautj2 async บนเซิร์ฟเวอร์อื่น
Joe Flack

11

รหัสการทำงานที่สมบูรณ์แบบ ..

    <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

บริการเว็บ

SQL 2005+ รองรับ WebServices ดั้งเดิมที่คุณเกือบจะใช้ได้แม้ว่าฉันจะไม่แนะนำเพราะความเสี่ยงด้านความปลอดภัยที่คุณอาจเผชิญ ผมใช้คำว่าทำไมเกือบ Javascript นั้นไม่ใช่ SOAP เนทีฟดังนั้นมันจะซับซ้อนกว่านี้เล็กน้อยในการสร้างมันขึ้นมา คุณจะต้องส่งและรับ SOAP XmlHttpRequestผ่าน ตรวจสอบ google สำหรับลูกค้า Javascript SOAP


5

การเล่นกับ JavaScript ใน HTA ฉันไม่มีโชคกับdriver={SQL Server};...สตริงการเชื่อมต่อ แต่ DSN ชื่อนั้นก็โอเค:
ฉันตั้งค่าTestDSNและทำการทดสอบ OK แล้วจึงใช้var strConn= "DSN=TestDSN";งานได้ดังนั้นฉันจึงทำการทดลองเพื่อการทดสอบและเรียนรู้ภายใน บริษัท

เซิร์ฟเวอร์ของเรามีหลายกรณีการทำงานเช่นserver1 \ devและserver1 \ Testซึ่งทำให้สิ่งเล็กน้อยที่ยุ่งยากมากขึ้นตามที่ฉันจัดการเพื่อให้เสียเวลาบางลืมที่จะหลบหนี\เป็น\\:)
หลังจากที่บางปลายตายกับserver=server1;instanceName=devในสตริงการเชื่อมต่อที่ฉันได้ในที่สุดนี้ หนึ่งในการทำงาน:
var strConn= "Provider=SQLOLEDB;Data Source=server1\\dev;Trusted_Connection=Yes;Initial Catalog=MyDatabase;"

การใช้ข้อมูลประจำตัวของ Windows แทนที่จะให้ผู้ใช้ / pwd ฉันพบว่าการเบี่ยงเบนที่น่าสนใจคือการค้นหารายละเอียดปลีกย่อยของIntegrated Security = truev Integrated Security = SSPIv Trusted_Connection=Yes- ดูความแตกต่างระหว่าง Integrated Security = True และ Integrated Security = SSPI

ระวังว่า RecordCount จะกลับมาเหมือน-1ใช้ชนิดadOpenForwardOnlyเริ่มต้น หากคุณกำลังทำงานกับชุดผลลัพธ์ขนาดเล็กและ / หรือไม่คำนึงถึงหน่วยความจำทั้งหมดในครั้งเดียวให้ใช้rs.Open(strQuery, objConnection, 3); (3 = adOpenStatic)และสิ่งนี้จะให้ผลที่ถูกต้องrs.RecordCount


4

ตามที่ระบุไว้ก่อนหน้านี้ไม่ควรใช้ Javascript ฝั่งไคลเอ็นต์ แต่มีกรอบสำหรับการนำสิ่งที่คุณต้องการไปใช้อย่างปลอดภัยมากขึ้น

Nodejs เป็นเฟรมเวิร์กที่อนุญาตให้คุณโค้ดการเชื่อมต่อเซิร์ฟเวอร์ใน javascript ดังนั้นให้ดูที่ Nodejs และคุณอาจเรียนรู้เพิ่มเติมเล็กน้อยเกี่ยวกับการสื่อสารกับฐานข้อมูลและการดึงข้อมูลที่คุณต้องการ


3

(ขออภัยนี่เป็นคำตอบทั่วไปเกี่ยวกับแบ็กเอนด์ SQL - ฉันไม่ได้อ่านคำตอบเกี่ยวกับฟีเจอร์ WebServices ของ SQL Server 2005 ถึงแม้ว่าฟีเจอร์นี้จะยังคงทำงานบน HTTP มากกว่าโดยตรงผ่านซ็อกเก็ต เว็บเซิร์ฟเวอร์ขนาดเล็กลงในเซิร์ฟเวอร์ฐานข้อมูลดังนั้นคำตอบนี้ยังคงเป็นอีกหนึ่งเส้นทางที่คุณสามารถทำได้)

คุณสามารถเชื่อมต่อโดยตรงโดยใช้ซ็อกเก็ต (google "javascript sockets") และโดยตรง ณ จุดนี้ฉันหมายถึงการใช้ไฟล์ Flash เพื่อจุดประสงค์นี้แม้ว่า HTML5 จะมี Web Sockets ซึ่งเป็นส่วนหนึ่งของข้อมูลจำเพาะซึ่งฉันเชื่อว่าให้คุณทำสิ่งเดียวกัน

บางคนอ้างถึงปัญหาด้านความปลอดภัย แต่ถ้าคุณออกแบบการอนุญาตฐานข้อมูลอย่างถูกต้องคุณควรจะสามารถเข้าถึงฐานข้อมูลจากส่วนหน้ารวมถึง OSQL และในทางทฤษฎีแล้วไม่มีการละเมิดความปลอดภัย ปัญหาด้านความปลอดภัยจะเป็นเช่นนั้นหากคุณไม่ได้เชื่อมต่อผ่าน SSL

ในที่สุดแม้ว่าฉันค่อนข้างแน่ใจว่าทั้งหมดนี้เป็นเชิงทฤษฎีเพราะฉันไม่เชื่อว่ามีห้องสมุด JavaScript ใด ๆ ที่มีอยู่สำหรับการจัดการโปรโตคอลการสื่อสารสำหรับ SSL หรือ SQL Server ดังนั้นถ้าคุณไม่เต็มใจที่จะคิดสิ่งเหล่านี้ออกมาเอง ดีกว่าที่จะไปเส้นทางของการมีเว็บเซิร์ฟเวอร์และภาษาสคริปต์ฝั่งเซิร์ฟเวอร์ในระหว่างเบราว์เซอร์และฐานข้อมูล


2
พูดได้ดี. ไม่มีอะไรผิดปกติกับการเข้าถึงฐานข้อมูลโดยตรงจากไคลเอนต์ (เช่นลูกค้าหนาทุกคนเคยทำ) และไม่ผ่านบริการเว็บ หากคุณใช้การรับรองความถูกต้องของ windows และเลเยอร์ความปลอดภัยที่ดีก็ไม่มีอะไรผิดปกติเกิดขึ้น
Nick.McDermaid

1

ฉันไม่คิดว่าคุณสามารถเชื่อมต่อกับเซิร์ฟเวอร์ SQL จาก javascripts ฝั่งไคลเอ็นต์ได้ คุณต้องเลือกภาษาฝั่งเซิร์ฟเวอร์เพื่อสร้างเว็บแอปพลิเคชั่นที่สามารถโต้ตอบกับฐานข้อมูลของคุณและใช้จาวาสคริปต์เท่านั้นเพื่อทำให้ส่วนต่อประสานผู้ใช้ของคุณดีขึ้น

คุณสามารถรับภาษาสคริปต์ฝั่งเซิร์ฟเวอร์ใด ๆ ตามการตั้งค่าภาษาของคุณ:

  • PHP
  • ASP.Net
  • ทับทิมบนราง

1
นี่เป็นหนึ่งในคำตอบที่แท้จริงเท่านั้นที่ฉันสามารถหาได้ ฉันควรตรวจสอบตัวเลือกใดของ ASP.net นอกเหนือจากไดรเวอร์ของ Microsoft ที่ต้องใช้แล้วยังมีอะไรอีก?
เชล

คุณอาจใช้ ADO.Net หรือ Entity Framework / LinqToSql - สิ่งเหล่านี้จริง ๆ
Vikram
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.