Как правильнее коннектиться к базе ?

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2056
Зарегистрирован: 25.11.2002 (Пн) 20:03

Как правильнее коннектиться к базе ?

Сообщение ALX_2002 » 13.02.2006 (Пн) 14:21

Доброго всем дня челы :roll: . Пришёл я к вам с прозьбой разъяснить как правильно к базе подсоединяться. Прочитал всю инфу в MSDN и примеры поглядел, но как правильнее так и не понял.

Сначала делал так

Код: Выделить всё
Set Connection = CreateObject("ADODB.Connection")
Set Recordset = CreateObject("ADODB.Recordset")

Connection.Open "база"

[code]Recordset.Open "Запрос", Сonnection, 3,3[/code]


Потом задумался. А зачем создавать Connection если можно рекордсету подсунуть сразу строку коннекта. Как я понял выгода в скорости. Т.е если я подсовываю объект Connection, то по идее он работает быстрее ?

Код: Выделить всё
Recordset.Open "Запрос","база",3,3


А потом наткнулся на Connection.Execute

И запутался окончательно. :oops:

Расскажите плиз - как делать правильнее ?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 13.02.2006 (Пн) 14:24

Во-первых, что тебе надо?
А во-вторых, почему позднее связывание? Это же неудобно.
В третьих, делается не так.
Connection.Open ...
...
Set Recordset.Connection = Connection
Recordset.Open ...

Connection.Execute не возвращает рекордсет и обычно используются для соответствующих запросов (не SELECT).
Lasciate ogni speranza, voi ch'entrate.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 13.02.2006 (Пн) 14:24

И в четвертых, переношу.
Lasciate ogni speranza, voi ch'entrate.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 13.02.2006 (Пн) 14:25

Как делать правильнее... мануал читать правильнее...
Recordset, если ему дать connectionstring вместо adodb.connection, создаёт новое подключение. Каждый раз. Что не круто, в моём понимании, и написано в мануале.

Connection.execute делает рекордсет. Или не делает, если adExecuteNoRecords. Собственно, в этом случае я его и использую, когда рекордсет не нужен.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2056
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 13.02.2006 (Пн) 14:36

2 alibek: Виноват :oops: Совсем забыл, что такой раздел есть. Sorry

2 Gserg:

Угу. Спасибо за разъяснение. :roll: . Вот я как раз на счёт "каждый раз новый коннект" хотел спросить. :roll:

Я с этой темой в ASP ковырялся. Создал Connection. А потом решил проверить его VarType. И к своему удивлению увидел, что Connection является не объектом, а всего лишь String Т.е в переменную Connection просто скидывается строка коннекта :shock: . Тут то я и задумался - а надо ли мне его создавать ???

И ещё забыл спросить

Если я делаю Recordset.Open, то по концу перебора записей мне нужно его уничтожать ?

Т.е делать recordset.Close а потом Set Recordset = Nothing ?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 13.02.2006 (Пн) 14:39

ALX_2002 писал(а):И к своему удивлению увидел, что Connection является не объектом, а всего лишь String

Я думаю, ты ошибся.
Connection является объектом. Но у него есть default-property ConnectionString, который и является строкой; скорее всего ты его и видел.
Lasciate ogni speranza, voi ch'entrate.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 13.02.2006 (Пн) 14:41

ALX_2002 писал(а):Если я делаю Recordset.Open, то по концу перебора записей мне нужно его уничтожать ?
Т.е делать recordset.Close а потом Set Recordset = Nothing ?

Если Recordset локальный, то Set Recordset = Nothing не обязательно, при выходе из процедуры он уничтожится.
Но я обычно указываю вручную.
Lasciate ogni speranza, voi ch'entrate.

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2056
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 13.02.2006 (Пн) 14:47

2 alibek:

Я думаю, ты ошибся.
Connection является объектом. Но у него есть default-property ConnectionString, который и является строкой; скорее всего ты его и видел.


:shock: Ух. Т.е Vartype меня нагло обманул :( . Т.е когда я делаю
Код: Выделить всё
response.write Vartype(Connection)
то он лезет в свойство по умолчанию Connection ? :shock: Ух.

Если Recordset локальный, то Set Recordset = Nothing не обязательно, при выходе из процедуры он уничтожится.
Но я обычно указываю вручную.


Хм. А у меня база подвисает если Nothing не делаю, а только Recordset.Close и повторно вызываю Recordset.Open с новыми параметрами. Наверное я не сделал Recorset локальным. :oops:

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 13.02.2006 (Пн) 14:48

Объекты лучше проверять IsObject().
Lasciate ogni speranza, voi ch'entrate.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 13.02.2006 (Пн) 14:52

Нет, там правда может быть как строка, так и объект...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2056
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 13.02.2006 (Пн) 14:53

2 alibek:
Дык самое смешное в том, что как раз IsObject мне вернуло False. И именно поэтому я и решил проверить VarType :shock:

---------
Хм... А сейчас дома попробывал True :shock:

Вот бред то... Буду лечить зрение. :shock:

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2056
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 13.02.2006 (Пн) 14:59

А вообще задумался как сократить код обращения к базе и вынести его в функции. У меня на нескольких страницах есть обращение к БД

Тут то я и задумался какие функции мне нужно сделать

Сделал. Но по виду - кривооо. :oops: Если я вас ещё не очень достал - посоветуйте плиз. Как симпатичнее организовать ? :oops:

Код: Выделить всё
<%

' Константы состояния
Const Opened = 1
Const Closed = 0
Const Executing = 4

Dim Connection, Recordset

'/////////////////////// Подключение к базе
Function Connect()
   On Error Resume next
   Set Connection = Server.CreateObject("ADODB.Connection")
   Connection.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & server.mappath("\DB.mdb")
   Connect = Connection.State
   if Err.number <> 0 Then Disconnect
End Function

'////////////////////// Выполнения запроса
Function Execute(Command)
   On Error Resume next
   ResetRecordset
   Set Recordset = Server.CreateObject("ADODB.Recordset")
   Recordset.Open Command,Connection,2,2
   Execute = Recordset.status
End Function

'///////////////////// Сброс рекордсета
Sub ResetRecordset
   On Error Resume next
   if IsObject(Recordset) Then
      Recordset.Close
      Set Recordset = Nothing
   End if
End Sub

'////////////////////// Отключение от базы
Function Disconnect()
   On error goto 0
   ResetRecordset
   Connection.Close
   Set Connection = Nothing
End Function

'///////////////////// Вывод сообщения
Sub ShowMessage(MSG)
   %><%=MSG %><%   
End Sub
%>

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Сообщение codemaster » 13.02.2006 (Пн) 15:22

ALX_2002 писал(а):А вообще задумался как сократить код обращения к базе и вынести его в функции. У меня на нескольких страницах есть обращение к БД



В ASP есть global.asa - наверное то что тебе надо
//<-
Mit freundlichen Grüßen
//->

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2056
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 13.02.2006 (Пн) 15:35

2 codemaster: Не. Про Global.asa я знаю. Но у меня скрипты лежат не корневом и не в виртуальном каталоге. А раскидывать файлы не хочется. :(

У меня как раз сложносность в организации функций для коннекта.

Т.е как сделать максимально эффективным обращение к БД. :oops:

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 15.02.2006 (Ср) 13:26

alibek писал(а):Если Recordset локальный, то Set Recordset = Nothing не обязательно, при выходе из процедуры он уничтожится.
Но я обычно указываю вручную.


Хотя большого смысла нет - он ведь действительно уничтожится и без Nothing...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 15.02.2006 (Ср) 13:27

Да, но мне так спокойнее :)
Lasciate ogni speranza, voi ch'entrate.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 15.02.2006 (Ср) 13:31

alibek писал(а):Да, но мне так спокойнее :)


Да я так и понял.
Но эффект такой-же как и от очистки локальных переменных:

Код: Выделить всё
Sub ...
    Dim s As String
    ...
    s = vbNullString
End Sub


:lol:
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 15.02.2006 (Ср) 13:46

Тебе смешно, но я иногда так и делаю в классах :)
Lasciate ogni speranza, voi ch'entrate.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 15.02.2006 (Ср) 13:48

alibek писал(а):Тебе смешно, но я иногда так и делаю в классах :)


С локальными (уровня процедуры/функции) переменными?
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 15.02.2006 (Ср) 13:50

Э... С Private уровня класса.
Lasciate ogni speranza, voi ch'entrate.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 15.02.2006 (Ср) 13:51

alibek писал(а):Э... С Private уровня класса.


Ну это-то еще понятно - бывает нужно.
А то я уж испугался.
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

    TopList