Como se conectar ao banco de dados SQL Server a partir do JavaScript no navegador?


285

Alguém pode me dar algum código fonte de exemplo mostrando como conectar-se a um banco de dados SQL Server 2005 a partir de JavaScript localmente? Estou aprendendo a programação da web na minha área de trabalho.

Ou preciso usar outra linguagem de script? Sugira algumas alternativas, se você as tiver, mas agora estou tentando fazê-lo com JavaScript. Meu SQL Server está instalado localmente na minha área de trabalho - navegador SQL Server Management Studio 2005 e IE7.


16
Definitivamente não é recomendável que você faça isso, mas é bom ver quais respostas podem surgir.
TheTXI

2
Estou procurando conectar-me a um banco de dados do Node.JS (implementação do javascript do lado do servidor) e cheguei aqui. Alguém sabe onde eu devo ir para isso?
Roy Tinker

2
@RoyTinker: Há node-postgres e node-mysql.
Janus Troelsen

1
Real, existe um banco de dados gratuito que você pode usar?

1
Você pode escrever um back-end REST usando Node.js e JavaScript e fazer a interface com o JavaScript do lado do cliente.
Fez Vrasta 29/08/16

Respostas:


701

Você não deve usar o javascript do cliente para acessar bancos de dados por vários motivos (práticas inadequadas, problemas de segurança, etc.), mas se você realmente deseja fazer isso, aqui está um exemplo:

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; 

Uma maneira melhor de se conectar a um servidor sql seria usar alguma linguagem do lado do servidor, como PHP, Java, .NET, entre outras. O javascript do cliente deve ser usado apenas para as interfaces.

E há rumores de uma lenda antiga sobre a existência de javascript no servidor, mas essa é outra história. ;)


323
Parabéns por ser praticamente a única pessoa aqui que realmente mostra que isso é possível (embora não seja recomendado).
TheTXI

6
Enquanto isso poderia funcionar na configuração do OP - ele disse que queria aprender "programação na Web" - e o Internet Explorer em um ambiente de baixa segurança não é programação na Web.
1460 Quentin

27
Não entendo por que esse comentário se qualifica como voto negativo. Eu explico como fazê-lo, mas digo a ele para não usá-lo.
Fabio Vinicius Binder

26
fbinder: algumas pessoas votam nisto porque acham que qualquer tentativa de conectividade do banco de dados e consulta de JavaScript é um grande não-não (mesmo que você afirme isso claramente). Se eu fosse você, eu não me importaria com os um ou dois votos negativos que você recebe sobre isso e apenas desfrute dos inúmeros votos positivos que receberá, por ser a única resposta que realmente responde à pergunta.
TheTXI

36
No entanto, deve-se notar que essa resposta provavelmente não funcionará para navegadores que não sejam o IE devido ao uso do ActiveX (mesmo que o pôster original tenha sido explícito sobre o uso do IE).
TheTXI

25

Isso seria muito ruim, porque o compartilhamento da cadeia de conexão abre seu site para tantas vulnerabilidades que você não pode simplesmente consertar, você precisa usar um método diferente se quiser que ele seja seguro. Caso contrário, você estará se abrindo para um grande público para aproveitar o seu site.


7
Voto positivo porque você realmente explicou por que é uma péssima ideia
Engenheiro Reverso

dicas de segurança mais úteis e importantes do que soluções técnicas
sabre tabatabaee Yazdi

9
A favor da votação, porque o OP não perguntou se era uma boa ou má prática, eles perguntaram como. Você pode inserir por que pode ser uma má idéia ao longo de uma RESPOSTA real, mas apenas dizer que é uma má idéia não merece ser sua própria resposta, é um comentário na melhor das hipóteses.
Wobbles

1
E se você está escrevendo algo atrás de um firewall seguro para fazer interface com um servidor local, isso ainda é ruim?
Bryan Bryce

Corrija-me se eu estiver errado, mas se o usuário fornecido for somente leitura e você gerenciar quais tabelas eles podem acessar, é tecnicamente seguro até que algo mude, não? Eu também não recomendaria isso, a menos que o banco de dados inteiro contivesse informações não confidenciais. Pode colocar informações confidenciais em outro banco de dados. Eu posso imaginar isso sendo útil para um site estático sem informações confidenciais. Se precisar de autenticação, poderia usar oautj2 async em outro servidor.
Joe Flack

11

Um código de trabalho perfeito ..

    <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

serviços web

O SQL 2005+ suporta WebServices nativos que você quase poderia usar, embora eu não o sugirasse , devido aos riscos de segurança que você pode enfrentar. Por que eu disse quase . Bem, o Javascript não é nativo do SOAP, portanto, seria um pouco mais complicado fazê-lo. Você precisaria enviar e receber SOAP via XmlHttpRequest. Verifique no google se há clientes SOAP Javascript.


5

Jogando com JavaScript em um HTA, não tive sorte com uma driver={SQL Server};...sequência de conexão, mas um DSN nomeado era bom:
configurei o TestDSN e ele testou o OK, e então var strConn= "DSN=TestDSN";funcionou, então continuei experimentando para fins de teste e aprendizado internos.

Nosso servidor tem várias instâncias em execução, por exemplo, server1 \ dev e server1 \ Test, o que tornou as coisas um pouco mais complicadas, pois consegui perder algum tempo esquecendo de escapar do \as \\:) :)
Depois de alguns becos sem saída com server=server1;instanceName=devas cadeias de conexão, eu finalmente consegui um para trabalhar:
var strConn= "Provider=SQLOLEDB;Data Source=server1\\dev;Trusted_Connection=Yes;Initial Catalog=MyDatabase;"

Usando credenciais do Windows em vez de fornecer um usuário / senha, eu descobri que uma distração interessante foi descobrir as sutilezas de Integrated Security = truev Integrated Security = SSPIv Trusted_Connection=Yes- consulte Diferença entre Segurança Integrada = Verdadeira e Segurança Integrada = SSPI

Cuidado que RecordCount retornará como -1se estivesse usando o tipo adOpenForwardOnly padrão . Se você estiver trabalhando com pequenos conjuntos de resultados e / ou não se importar com o lote inteiro na memória de uma só vez, use rs.Open(strQuery, objConnection, 3); (3 = adOpenStatic) e isso fornecerá um válidors.RecordCount


4

Como afirmado anteriormente, isso não deve ser feito usando o Javascript do cliente, mas existe uma estrutura para implementar o que você deseja com mais segurança.

O Nodejs é uma estrutura que permite codificar as conexões do servidor em javascript, portanto, dê uma olhada no Nodejs e você provavelmente aprenderá um pouco mais sobre a comunicação com os bancos de dados e a captura de dados necessários.


3

(desculpe, essa foi uma resposta mais genérica sobre back-end do SQL - eu não tinha lido a resposta sobre o recurso WebServices do SQL Server 2005. Embora esse recurso ainda seja executado por HTTP em vez de mais diretamente por soquetes, essencialmente eles criaram um mini servidor da Web no servidor de banco de dados; portanto, essa resposta ainda é outra rota que você pode seguir.)

Você também pode conectar-se diretamente usando sockets (google "sockets de javascript") e, nesse ponto, quero dizer usando um arquivo Flash para esse fim, embora o HTML5 tenha Web Sockets como parte das especificações que acredito que permitem que você faça a mesma coisa.

Algumas pessoas citam problemas de segurança, mas se você projetou suas permissões de banco de dados corretamente, teoricamente deve poder acessar o banco de dados de qualquer front end, incluindo OSQL, e não ter uma violação de segurança. O problema de segurança, então, seria se você não estivesse se conectando via SSL.

Finalmente, porém, tenho certeza de que tudo isso é teórico, porque não acredito que existam bibliotecas JavaScript para manipular os protocolos de comunicação para SSL ou SQL Server; portanto, a menos que você esteja disposto a descobrir essas coisas, seria melhor seguir o caminho de ter um servidor da Web e uma linguagem de script do lado do servidor entre o navegador e o banco de dados.


2
Bem dito. Não há nada errado em acessar um banco de dados diretamente de um cliente (ou seja, todos os clientes grossos já criados) e não através de um serviço da web. Se você usa autenticação do Windows e uma boa camada de segurança, não há nada de errado com isso.
Nick.McDermaid

1

Eu não acho que você pode se conectar ao servidor SQL a partir de javascripts do lado do cliente. Você precisa escolher um idioma do servidor para criar aplicativos da Web que possam interagir com seu banco de dados e usar apenas javascript para melhorar sua interface com o usuário.

você pode escolher qualquer linguagem de script do servidor com base na sua preferência de idioma:

  • PHP
  • ASP.Net
  • Ruby On Rails

1
Essa foi uma das únicas respostas verdadeiras que pude encontrar. Quais opções do ASP.net devo investigar? O que mais, além dos drivers da Microsoft, eu preciso?
Rachael

você poderia usar o ADO.Net ou o Entity Framework / LinqToSql - qualquer um deles, na verdade.
Vikram
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.