如何在浏览器中从 JavaScript 连接到 SQL Server 数据库?

IT技术 javascript sql-server database-connection
2021-02-05 10:33:22

谁能给我一些示例源代码,展示如何从本地的 JavaScript 连接到 SQL Server 2005 数据库?我正在我的桌面上学习网络编程。

或者我需要使用任何其他脚本语言吗?如果你有的话,建议一些替代方案,但我现在正在尝试用 JavaScript 来做。我的 SQL Server 本地安装在我的桌面上 — SQL Server Management Studio 2005 和 IE7 浏览器。

6个回答

出于多种原因(不良做法、安全问题等),您不应该使用客户端 javascript 访问数据库,但如果您真的想这样做,这里是一个示例:

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 等。客户端 javascript 应该只用于接口。

并且有关于服务器 javascript 存在的古老传说的传言,但这是另一个故事。;)

恭喜你几乎是这里唯一一个真正证明这是可能的(虽然不推荐)。
2021-03-11 10:33:22
然而,可能应该注意的是,由于使用了 ActiveX,这个答案可能不适用于非 IE 浏览器(即使原始海报明确说明了他对 IE 的使用)。
2021-03-12 10:33:22
fbinder:有些人会否决这个,因为他们认为任何对数据库连接和从 JavaScript 查询的尝试都是一个很大的禁忌(即使你说得很清楚)。如果我是你,我不会介意你在这件事上得到一两张反对票,只是享受它会收到的无数赞成票,因为它是唯一真正回答所提出问题的答案。
2021-03-18 10:33:22
虽然这可能适用于 OP 的设置——他确实说过他想学习“网络编程”——但在低安全环境中的 Internet Explorer 不是网络编程。
2021-03-30 10:33:22
我不明白为什么这个评论有资格作为反对票。我解释了如何做,但告诉他不要使用它。
2021-04-01 10:33:22

这样做真的很糟糕,因为共享您的连接字符串会使您的网站暴露出许多您无法简单修补的漏洞,如果您希望它安全,您必须使用不同的方法。否则,您将向大量受众开放以利用您的网站。

Upvote 因为你实际上解释了为什么这是一个坏主意
2021-03-11 10:33:22
如果你只是在安全防火墙后面写一些东西来与本地服务器交互,这仍然很糟糕吗?
2021-04-01 10:33:22
安全提示比技术解决方案更有用和重要
2021-04-03 10:33:22
为什么必须共享连接字符串?如果我们在专用网络(通常是内联网)上并且连接字符串是由少数受信任的用户输入的怎么办?不要在源代码中留下连接字符串。
2021-04-03 10:33:22
否决票,因为 OP 没有问这是好还是坏的做法,他们问如何。您可以在实际 ANSWER 中插入为什么它可能是一个坏主意,但仅仅说它是一个坏主意不应该成为它自己的答案,它充其量只是一个评论。
2021-04-05 10:33:22

一个完美的工作代码..

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

网页服务

SQL 2005+ 支持您几乎可以使用的本机 Web 服务,尽管我不建议这样做,因为您可能面临安全风险。为什么我说差不多好吧,Javascript 不是 SOAP 原生的,因此实际制作它会更复杂一些。您必须通过XmlHttpRequest. 检查 google 以获取 Javascript SOAP 客户端。

在 HTA 中使用 JavaScript 我对driver={SQL Server};...连接字符串没有运气,但命名的 DSN 没问题:
我设置了TestDSN并且它测试正常,然后var strConn= "DSN=TestDSN";工作,所以我继续进行试验以达到我的内部测试和学习目的。

我们的服务器有几个正在运行的实例,例如server1\devserver1\Test这让事情变得有点棘手,因为我设法浪费了一些时间忘记转义\as \\:)
server=server1;instanceName=dev连接字符串中出现一些死胡同后,我最终得到了这个一个工作:
var strConn= "Provider=SQLOLEDB;Data Source=server1\\dev;Trusted_Connection=Yes;Initial Catalog=MyDatabase;"

使用 Windows 凭据而不是提供用户/密码,我发现一个有趣的转移是发现Integrated Security = truev Integrated Security = SSPIv的微妙之处Trusted_Connection=Yes- 请参阅集成安全性 = True 和集成安全性 = SSPI 之间的差异

请注意 RecordCount 会像-1使用默认的adOpenForwardOnly类型一样返回。如果您正在处理小的结果集和/或不介意一次在内存中的全部内容,请使用rs.Open(strQuery, objConnection, 3); (3=adOpenStatic)并且这给出了有效的rs.RecordCount