В настоящее время у меня есть классический ASP-сайт, работающий на IIS6, и все работает хорошо. Файл «Include» используется для открытия соединения db. Затем соединение db сохраняется в переменной сеанса.Соединения DB в переменных сеанса после миграции из Win2k3 в Win2012 R2
Вот фрагмент нашего файла Include «dbinclude.asp»:
<%
Set CN_sql = Server.CreateObject("ADODB.Connection")
CN_sql.ConnectionString="DSN=sqldb;UID=testuid;PWD=testpwd;Server=testdb;Database=mydatabase"
CN_sql.Open
Session("Connection_sql") = CN_sql
%>
В классических страниц ASP, мы используем следующий код для подключения к БД, чтобы вытащить данные:
<html>
<head>
<!--#include file="./dbinclude.asp"-->
</head>
</body>
<%
set ds = Server.CreateObject("ADODB.Recordset")
CN_sql = Session("Connection_sql")
ds.ActiveConnection = CN_sql
ds.CursorType = 0
SQL = "select * "
SQL = SQL & " from users "
ds.Source = SQL
ds.Open
IF ds.EOF then
response.write("SQL EOF. NO data found.<br/>")
ELSE
ds.MoveFirst
while not ds.EOF
response.write(ds.fields("user_name") & " <br/> ")
ds.MoveNext
wend
End If
%>
</body>
</html>
В IIS6 этот код отлично работает для всех страниц. Однако при тестировании в IIS8.5 (Win2012R2, а также IIS7, Win7), я получаю сообщение об ошибке:
Microsoft OLE DB Provider для драйверов ODBC ошибка '80004005' [Microsoft] [ODBC Driver Manager] источник данных не найден и драйвер по умолчанию не указано
номер строки, где ошибка указывает на эта линия:
ds.ActiveConnection = CN_sql
пула приложений в IIS 8.5 установлен в .NET v2, позволяет 32 -битное приложение, классическая труба линия. Я пробовал различную комбинацию пула приложений (меняя на другую версию .NET, разрешаю/запрещаю 32-битное приложение, классический/интегрированный конвейер, изменил Identity, попробовал разные состояния сеанса).
В IIS 8.5, если я закомментируйте следующую строку в коде:
CN_sql = Session("Connection_sql")
будет решить эту проблему. Однако, поскольку у нас есть большое количество страниц, переписывание и тестирование в настоящее время невозможно.
Есть ли что-то в Windows 2012, которое блокирует вас от хранения открытого подключения к базе данных в переменной сеанса? Я знаю, что это неэффективно, но переписывание в это время будет большим делом.
Не положительный, но не вы должны использовать 'set' при назначении переменных объектов? Как и в 'set CN_sql = Session (" Connection_sql ")', и вам также может понадобиться 'set' в некоторых других назначениях. – Keith
Почему бы не сохранить его в переменной приложения в global.asa.Затем вы можете запустить глобальную замену, чтобы заменить «Session (« Connection_sql »)' на 'Application (« Connection_sql »)' Even на большом сайте, это займет всего несколько секунд. Переменная сеанса кажется странным местом для хранения строки подключения – John
@ Джон: мне все равно придется открыть соединение, и я думаю, что это то, что его раздувает, но я сделаю это. @Keith: 'set' не требуется. Я попытался, но это породило еще одну ошибку. – ccko4800