在客户端通过javascript调用存储过程?

在客户端通过javascript调用存储过程?,javascript,sql-server,Javascript,Sql Server,是否可以在客户端调用javascript中的存储过程 我知道如何在服务器端进行操作,但我对在客户端进行操作感兴趣 基本上,它归结为从客户机内部直接联系SQL server。可能吗 无法从客户端的web浏览器建立到数据库的直接连接。您需要做的是创建一个服务器端应用程序,以公开用于通过HTTP获取数据的API 看看微软的tldr;不,无法从browser-JavaScript1“直接”连接到SQL Server JavaScript可以“说”HTTP和WebSocket,但SQL Server可以“

是否可以在客户端调用javascript中的存储过程

我知道如何在服务器端进行操作,但我对在客户端进行操作感兴趣


基本上,它归结为从客户机内部直接联系SQL server。可能吗

无法从客户端的web浏览器建立到数据库的直接连接。您需要做的是创建一个服务器端应用程序,以公开用于通过HTTP获取数据的API


看看微软的tldr;不,无法从browser-JavaScript1“直接”连接到SQL Server

JavaScript可以“说”HTTP和WebSocket,但SQL Server可以“说”TDS。要进行通信,需要有一个客户端和服务器都使用的公共媒体/协议

  • 虽然WebSocket在技术上使这成为可能,但它仍然需要一个单独的代理服务(并且您仍然需要编写/查找JavaScript TDS驱动程序)。我不建议取消受控访问层

  • 同样,可以使用HTTP代理,在该代理中,原始SQL命令被发送到客户机或从客户机发送。我也不建议这样做,但有些确实存在

  • 外部代码/库(例如ActiveX、Java)可以通过JavaScript客户端建立SQL连接和代理

在所有这些情况下,都有一个中间助手,浏览器JavaScript从不“直接”连接


1 JavaScript是一种语言,本回答重点介绍了具有浏览器支持的库/函数的浏览器实现。有人可能会说,使用节点模块仍然是“JavaScript”,而且它们是正确的。。在不同的环境中。

有点

您可以创建一个端点,该端点是存储过程的包装器,该存储过程将过程名称以及过程的参数作为参数

一旦有了这样的机制,就可以创建自动公开过程的端点

如果您真的有雄心壮志,可以尝试SQL 2016并直接从这些过程返回JSON。然后可以使用子查询嵌套数据,并在单个负载中返回JSON。没有序列化,没有对象,只需读取并返回数据

<2016您可以将结果放入字典,并使用NewtonSoft对其进行序列化。假设您返回的是平面数据,那么就可以开始了。只需使用一个读卡器,从键的列名中获取元数据,并将值作为对象。NewtonSoft将为您将其转换为JSON

如果您返回层次结构,您可以(按照惯例)创建一系列的运行程序,将读取器放入一个字典中,其中object是另一个字典,Newtonsoft的东西将帮助您完成序列化

希望这能有所帮助,我们在2016年使用这种方法,能够创建一个存储过程并调用它而不需要任何中间层代码、部署等,这非常好。它可以正常工作


希望这有帮助。

是的,您可以使用WebAssembly从客户端直接连接到SQL Server。您可以先编写函数,调用C或C++中的SQL Server。通过Emscripten编译器将其编译为.Wasm。然后,可以使用JavaScript调用C或C++代码。将来,你应该可以用C#实现这一点,但微软刚刚开始这方面的工作。 我正在写一篇关于它的文章,当它准备好的时候我会和大家分享。
现在,仅仅因为你能做到这一点,并不意味着你应该因为安全问题而这样做。但我不是来给你讲讲你应该做什么或不应该做什么。

这要看情况而定。你想让黑客入侵你的数据库吗?永远不要将SQL放在客户机中。@4castle“这取决于”是什么意思?技术上是否可行?我想直接从客户端联系SQL Server,调用存储过程并读取结果。现在这基本上是可能的还是不可能的?@4castle我知道安全漏洞。让这成为我的问题吧。无论如何,这只会在内部网中使用。我只是想知道您是否可以直接从客户端连接到sql server。如果您确实知道答案,请将其作为答案发布,我很乐意将其标记为正确答案。我不确定“直接”是什么意思。数据库是否存储在客户端上?否则,如果服务器上没有某种中间件,就无法通过HTTP“直接”访问数据库。@4castle是的,我的意思是直接将客户端连接到SQL server,而不使用中间件。从技术上讲,客户端应该打开到sql server的连接。这基本上是可能的,还是javascript被放在了一个不允许爆发的沙箱中?这个限制在什么地方被记录了吗?我不知道“限制”这个词是正确的,它更多的是一个技术限制。客户端JavaScript代码被下载并在最终用户的机器上执行。这台机器将如何连接到服务器上托管的数据库?确切地说,它可以归结为一个问题:是否可以在javascript中通过网络连接到另一台机器?我们把协议放在一边吧。让我们假设我自己编写代码。但是基本上可以通过网络连接和读/写吗?顺便说一句,对不起,我不能上传投票,因为我需要15次。等我拿到分数后再做。好的,但是Websocket是基于TCP的。有可能通过TCP到达吗?顺便说一句,对不起,我不能向上投票,因为我需要15次。稍后我有要点时再做。@askolotl否,正如链接的问题所解释:}非常感谢您的详细回答。但是,关于“websocket代理”:它会在客户端运行吗?它是否需要在客户端进行特殊安装,或者标准的web浏览器是否足够?让我们假设我自己做所有的协议编码——技术上可能吗?拜托,你能看看这个吗