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

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

或者我需要使用其他脚本语言吗?建议一些替代方案,如果你有,但我现在试图用JavaScript做到这一点。我的SQL Server是本地安装在我的桌面- SQL Server Management Studio 2005和IE7浏览器。

853063 次浏览

我不认为你可以从客户端javascript连接到SQL服务器。你需要选择一些服务器端语言来构建web应用程序,它可以与你的数据库交互,使用javascript只是为了让你的用户界面更好地交互。

您可以根据自己的语言偏好选择任何服务器端脚本语言:

  • PHP
  • ASP。网
  • Ruby On Rails

你不应该使用客户端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的存在,有一个古老的传说,但这是另一个故事。;)

Web服务

SQL 2005+支持你可以几乎使用的本地WebServices,尽管我不建议这样做,因为你可能会面临安全风险。为什么我说几乎。Javascript不是SOAP原生的,所以实际制作它会更复杂一些。你必须通过XmlHttpRequest发送和接收SOAP。检查谷歌是否有Javascript SOAP客户机。

(对不起,这是一个关于SQL后端更通用的答案——我没有读过关于SQL Server 2005的WebServices特性的答案。虽然,这个功能仍然是在HTTP上运行,而不是更直接地通过套接字,所以本质上他们已经在数据库服务器中构建了一个迷你web服务器,所以这个答案仍然是另一种方法。)

你也可以直接使用套接字(谷歌“javascript套接字”)连接,这里我指的是直接使用Flash文件,尽管HTML5有Web套接字作为规范的一部分,我相信它可以让你做同样的事情。

有些人提到了安全问题,但是如果您正确地设计了数据库权限,理论上应该能够从任何前端(包括OSQL)访问数据库,而不存在安全漏洞。那么,如果您没有通过SSL进行连接,就会出现安全问题。

最后,我很确定这都是理论上的,因为我不相信存在任何JavaScript库来处理SSL或SQL Server的通信协议,所以除非你愿意自己解决这些问题,否则最好在浏览器和数据库之间有一个web服务器和服务器端脚本语言。

这将是非常糟糕的做法,因为共享你的连接字符串会让你的网站面临如此多的漏洞,你不能简单地修补,如果你想让它更安全,你必须使用不同的方法。否则,你就是在向大量的用户开放,让他们利用你的网站。

一个完美的工作代码..

    <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>
在HTA中使用JavaScript我没有driver={SQL Server};...连接字符串的运气,但命名的DSN是可以的:
我设置了TestDSN,测试OK,然后var strConn= "DSN=TestDSN";工作了,所以我为了内部测试和学习目的继续进行实验 我们的服务器有几个实例正在运行,例如server1 \开发server1 \测试,这使得事情稍微复杂一些,因为我设法浪费了一些时间,忘记将\转义为\\:)
在连接字符串中server=server1;instanceName=dev的一些死胡同之后,我最终让这个工作:
var strConn= "Provider=SQLOLEDB;Data Source=server1\\dev;Trusted_Connection=Yes;Initial Catalog=MyDatabase;" < / p >

使用Windows凭证而不是提供user/pwd,我发现一个有趣的转移是发现Integrated Security = true v Integrated Security = SSPI v Trusted_Connection=Yes的微妙之处-参见集成安全= True和集成安全= SSPI之间的区别

注意,如果使用默认的adOpenForwardOnly类型,RecordCount将返回为-1。如果你正在处理小的结果集和/或不介意内存中的所有东西,使用rs.Open(strQuery, objConnection, 3); (3 = adOpenStatic),这将给出有效的rs.RecordCount

如前所述,它不应该使用客户端Javascript完成,但有一个框架可以更安全地实现您想要的东西。

Nodejs是一个框架,允许你用javascript编写服务器连接,所以看看Nodejs,你可能会学到更多关于与数据库通信和获取你需要的数据。