2016-06-06 17 views
2

Извините слишком много вопросов, чтобы посмотреть через. Мой код:ADODB.Connection # 424: Требуемый объект

Function GetConnection(ByVal Server, ByVal Database, ByVal UserID, ByVal Password) 
    Dim conn 
    On Error Resume Next 
    Set conn = Server.CreateObject("ADODB.Connection") 
    If Err.Number <> 0 Then 
     Set conn = Nothing 
     Response.Write "#" & Err.Number & ": " & Err.Description 
     Response.End 
     Exit Function 
    End If 
    CONST connStringFormat = "Provider=SQLOLEDB.1;[email protected];Persist Security Info=True;User [email protected];Initial [email protected];Data [email protected]" 
    Dim myConnectionString 
    myConnectionString = Replace(Replace(Replace(Replace(connStringFormat, "@Server", Server), "@Database", Database), "@UserID", UserID), "@Password", Password) 

    conn.Open myConnectionString 
    On Error GoTo 0 
    Set GetConnection = conn 
End Function 

Возвращается ошибка, как показано на моей веб-странице:

# 424: Требуется объект

Любые идеи, что является причиной этого? Пожалуйста, проигнорируйте тот факт, что я не проверяю правильность подключения к точке, потому что она бомбит в заявлении Server.CreateObject("...")!

+0

Если вы показали [mcve] это помогло бы в данный момент вы не показываете, как вы используя 'GetConnection()' в вашем коде, чтобы создать экземпляр объекта ADODB.Connection. – Lankymart

ответ

0

После того, как я просмотрел свой код тысячу раз и отступил, я взял вызов CreateObject из функции, и он работал (почему, почему, почему), то есть я превратил свою функцию в подпрограмму и использовал глобальную переменную.

Sub SetupConnection(ByVal Server, ByVal Database, ByVal UserID, ByVal Password) 
    CONST connStringFormat = "Provider=SQLOLEDB.1;[email protected];Persist Security Info=True;User [email protected];Initial [email protected];Data [email protected]" 

    Dim myConnectionString 
    myConnectionString = Replace(Replace(Replace(Replace(connStringFormat, "@Server", Server), "@Database", Database), "@UserID", UserID), "@Password", Password) 

    conn.Open myConnectionString 
End Sub 

Dim conn 
Set conn = Server.CreateObject("ADODB.Connection") 
SetupConnection ... 
+1

Вы не указали, как вы используете функцию 'GetConnection()' для создания экземпляра 'ADODB.Connection'. Я предполагаю, что вы не делали этого * (прежде чем вы меняете его на 'Sub') *' Set MyConnObject = GetConnection («...», «...», «...», «... «)'. – Lankymart

+0

Ваша догадка правильная. Так в чем ваш смысл? Вы не дали мне своего решения, где его исправить! Нужно ли использовать «Set» в некоторых случаях, а не в других? – Glen

+0

Не видя, как вы изначально вызывали функцию 'GetConnection()' в исходном вопросе * (а не только определение функции) * Я бы просто догадался, поэтому я не разместил решение. – Lankymart

0

Ok, так что нет ничего плохого в подходе просто, как это называется (немного предположения, как я не видел никакого кода вызова).

Хотя обработка ошибок является хорошей вещью, в настоящее время On Error Resume Next не очень полезен и только захватывает проблемы с созданием объекта ADODB.Connection, который не будет происходить часто.

Function GetConnection(ByVal Server, ByVal Database, ByVal UserID, ByVal Password) 
    Dim conn: Set conn = Server.CreateObject("ADODB.Connection") 
    Const connStringFormat = "Provider=SQLOLEDB.1;[email protected];Persist Security Info=True;User [email protected];Initial [email protected];Data [email protected]" 
    Dim myConnectionString: myConnectionString = Replace(Replace(Replace(Replace(connStringFormat, "@Server", Server), "@Database", Database), "@UserID", UserID), "@Password", Password) 

    'You are more likely to get errors here, when trying to open the connection. 
    Call conn.Open(myConnectionString) 
    Set GetConnection = conn 
    Set conn = Nothing 
End Function 

Чтобы назвать это правильно, вы все равно должны использовать Set заявление так, что новый объект будет инстанцированный правильно.

Например, это будет работать

Dim conn: Set conn = GetConnection("YourServer", "YourDatabase", "YourUserName", "YourPassword") 

Но это не получится, потому что ADODB.Connection объект предполагает, что мы хотим строковое представление по умолчанию который будет ConnectionString.

Dim conn: conn = GetConnection("YourServer", "YourDatabase", "YourUserName", "YourPassword") 

Чтобы доказать, что здесь быстрый тест

Dim conn: conn = GetConnection("YourServer", "YourDatabase", "YourUserName", "YourPassword") 
Call Response.Write("conn is " & TypeName(conn) & "<br />") 

Set conn = GetConnection("YourServer", "YourDatabase", "YourUserName", "YourPassword") 
Call Response.Write("conn is " & TypeName(conn) & "<br />") 

Выход:

conn is String 
conn is Connection 
+0

Я думаю, что вам не хватает моей точки или заявления очевидного, как я ее вижу. Обратите внимание, что я добавил код On Error только после того, как подумал, получив ошибку, я просто поместил On On в качестве места, как в моем вопросе выше, просто чтобы подчеркнуть, в какой строке была ошибка, и я сузился до этой строки. В моем вопросе не было намерения написать надлежащий код проверки ошибок таким образом или фактически иметь его вообще. Если у меня нет опечатки где-то, мой исходный код по существу такой же, как у вас, но я говорю, что он не работает! – Glen

+0

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

Смежные вопросы