Как подключиться к базе данных SQL Server из JavaScript в браузере?

285

Кто-нибудь может дать мне пример исходного кода, показывающий, как подключиться к базе данных SQL Server 2005 из JavaScript локально? Я изучаю веб-программирование на своем рабочем столе.

Или мне нужно использовать любой другой язык сценариев? Предложите несколько альтернатив, если они у вас есть, но сейчас я пытаюсь сделать это с помощью JavaScript. Мой SQL Server локально установлен на моем рабочем столе - SQL Server Management Studio 2005 и браузер IE7.

Наслаждайтесь кодированием
источник
16
Определенно не рекомендуется делать это, но приятно видеть, какие ответы могут быть из этого.
TheTXI
2
Я ищу подключение к базе данных из Node.JS (реализация JavaScript на стороне сервера), и я прибыл сюда. Кто-нибудь знает, где я должен пойти на это?
Рой Тинкер
2
@RoyTinker: есть узел-postgres и узел-mysql.
Янус Троелсен
1
На самом деле есть ли бесплатная база данных, которую вы можете использовать?
1
Вы можете написать бэкэнд REST, используя Node.js и JavaScript, и связать его со своим клиентским JavaScript.
Фес Враста

Ответы:

701

Вы не должны использовать клиентский 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, но это уже другая история. ;)

Фабио Виниций Биндер
источник
323
Поздравляю с тем, что вы здесь единственный человек, который показывает, что это возможно (хотя и не рекомендуется).
TheTXI
6
Хотя это может сработать при настройке OP - он сказал, что хочет научиться «веб-программированию» - и Internet Explorer в среде с низким уровнем безопасности не является веб-программированием.
Квентин
27
Я не понимаю, почему этот комментарий считается отрицательным. Я объясняю, как это сделать, но говорю ему не использовать это.
Фабио Виниций Биндер
26
fbinder: некоторые люди будут отклонять это, потому что они думают, что любая попытка соединения с базой данных и запросы из JavaScript - это большая проблема, нет-нет (даже если вы заявите об этом довольно четко). Если бы я был на вашем месте, я бы не возражал против того, что вы получите один или два отрицательных голоса, и просто наслаждайтесь многочисленными повышенными голосами, которые он получит, поскольку он является единственным ответом, который фактически отвечает на поставленный вопрос.
TheTXI
36
Однако, вероятно, следует отметить, что этот ответ, вероятно, не будет работать для браузеров, отличных от IE, из-за использования ActiveX (даже несмотря на то, что в первоначальном плакате было явно сказано о его использовании IE).
TheTXI
25

Это было бы очень плохо, потому что совместное использование вашей строки подключения открывает ваш сайт для такого количества уязвимостей, что вы не можете просто исправить, вы должны использовать другой метод, если вы хотите, чтобы он был безопасным. В противном случае вы открываете огромную аудиторию, чтобы воспользоваться вашим сайтом.

Аллен Уокер
источник
7
Upvote, потому что вы действительно объяснили, почему это плохая идея
Reversed Engineer
советы по безопасности более полезны и важны, чем технические решения
Sabre Tabatabaee Yazdi
9
Проголосуйте, потому что ФП не спросила, хорошо это или плохо, они спросили, как. Вы можете вставить, почему это может быть плохой идеей в ответе на фактический ОТВЕТ, но просто сказать, что это плохая идея, не заслуживает того, чтобы быть ее собственным ответом, это в лучшем случае комментарий.
Колебания
1
Что если вы просто пишете что-то за защищенным межсетевым экраном для взаимодействия с локальным сервером, это все равно плохо?
Брайан Брайс
Поправьте меня, если я ошибаюсь, но если предоставленный пользователь предназначен только для чтения и вы управляете, к каким таблицам они могут получить доступ, это технически безопасно, пока что-то не изменится, нет? Я бы тоже не советовал, если только вся БД не содержала нечувствительной информации. Может поместить конфиденциальную информацию в другую БД. Я могу представить, что это полезно для статического сайта без конфиденциальной информации. Если требуется авторизация, можно использовать oautj2 async на другом сервере.
Джо Флэк
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>
Uthaiah
источник
10

Веб-сервисы

SQL 2005+ поддерживает нативные веб-сервисы, которые вы могли бы почти использовать, хотя я бы не советовал этого из-за угроз безопасности, с которыми вы можете столкнуться. Почему я сказал почти . Ну, Javascript не является SOAP-нативным, так что было бы немного сложнее сделать это на самом деле. Вам придется отправлять и получать SOAP через XmlHttpRequest. Проверьте Google для клиентов Javascript SOAP.

Роберт Коритник
источник
5

Играя с JavaScript в HTA, мне не повезло со driver={SQL Server};...строкой соединения, но с именованным DSN все было в порядке:
я настроил TestDSN, и он протестировал OK, а затем var strConn= "DSN=TestDSN";работал, поэтому я продолжал экспериментировать для своих собственных целей тестирования и обучения.

На нашем сервере запущено несколько экземпляров, например server1 \ dev и server1 \ Test, что несколько усложнило ситуацию, поскольку мне удалось потратить некоторое время на забвение выхода из \as \\:)
После некоторых тупиковых ситуаций 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- см. Различие между интегрированной безопасностью = True и интегрированной безопасностью = SSPI

Помните, что RecordCount вернется, как -1если бы он использовал тип adOpenForwardOnly по умолчанию . Если вы работаете с небольшими наборами результатов и / или не rs.Open(strQuery, objConnection, 3); обращаете внимания на весь объем памяти сразу, используйте (3 = adOpenStatic), и это даст действительныйrs.RecordCount

AjV Jsy
источник
4

Как указывалось ранее, это не должно быть сделано с использованием клиентского Javascript, но есть структура для реализации того, что вы хотите более безопасно.

Nodejs - это инфраструктура, которая позволяет вам кодировать соединения с сервером в javascript, поэтому изучите Nodejs, и вы, вероятно, узнаете немного больше о связи с базами данных и получении необходимых данных.

Шири
источник
3

(извините, это был более общий ответ о бэкэндах SQL - я не читал ответ о функции WebServices в SQL Server 2005. Хотя эта функция все еще запускается через HTTP, а не напрямую через сокеты, так что по сути они построили мини веб-сервер на сервер базы данных, так что этот ответ является еще одним маршрутом, который вы могли бы выбрать.)

Вы также можете подключиться напрямую, используя сокеты (google "javascript sockets"), и под этим на самом деле я имею в виду использование файла Flash для этой цели, хотя в HTML5 есть веб-сокеты как часть спецификации, которая, как я считаю, позволяет вам делать то же самое.

Некоторые люди ссылаются на проблемы безопасности, но если вы правильно разработали разрешения для базы данных, вы теоретически должны иметь доступ к базе данных из любого внешнего интерфейса, включая OSQL, и не иметь нарушения безопасности. В этом случае проблема безопасности была бы, если бы вы не подключались через SSL.

Наконец, я уверен, что все это теоретически, потому что я не верю, что существуют какие-либо библиотеки JavaScript для обработки протоколов связи для SSL или SQL Server, поэтому, если вы не захотите сами разобраться с этим, это будет Лучше пойти по пути наличия веб-сервера и серверного скриптового языка между браузером и базой данных.

Кев
источник
2
Хорошо сказано. Нет ничего плохого в доступе к базе данных напрямую от клиента (т.е. любого толстого клиента, когда-либо созданного), а не через веб-сервис. Если вы используете проверку подлинности Windows и хороший уровень безопасности, в этом нет ничего плохого
Nick.McDermaid
1

Я не думаю, что вы можете подключиться к серверу SQL с клиентской стороны JavaScript. Вам нужно выбрать некоторый язык на стороне сервера для создания веб-приложений, которые могут взаимодействовать с вашей базой данных, и использовать только JavaScript, чтобы сделать ваш пользовательский интерфейс более удобным для взаимодействия.

Вы можете выбрать любой язык сценариев на стороне сервера, исходя из ваших языковых предпочтений:

  • PHP
  • ASP.Net
  • Рубин на рельсах
Викрам
источник
1
Это был один из единственно верных ответов, которые я мог найти. Какие варианты ASP.net я должен исследовать? Что еще в дополнение к драйверам Microsoft мне нужно?
Рэйчел
потенциально вы можете использовать ADO.Net или Entity Framework / LinqToSql - любой из них на самом деле.
Викрам