powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / ODBC-логин?
25 сообщений из 40, страница 1 из 2
ODBC-логин?
    #32722472
Alexus12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть база mdb, которая работает с Oracle Server
через ODBC и ADO

соответственно, пользователю приходится
логиниться один раз в ODBC (при первом обращении к таблицам)
и еще раз в ADO при выполнении кода

Как объединить?
Свою формочку логина на запуск базы сделаю,
ADO через переменные передам
Как ODBC подсунуть данные из формочки?!!
...
Рейтинг: 0 / 0
ODBC-логин?
    #32722597
Alexus12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
все знатоки ушли на фронт?..
...
Рейтинг: 0 / 0
ODBC-логин?
    #32722678
Bagin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Запомнить необходимые данные в переменных и потом подсовывать в строке подключения. А разве Оракл не позволяет NT-аутетификация?
...
Рейтинг: 0 / 0
ODBC-логин?
    #32722771
Alexus12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в строке подключения ADO так и делаю
как подсунуть в строку подключения ODBC-таблицы?!!

и что такое NT-аутенти?
...
Рейтинг: 0 / 0
ODBC-логин?
    #32722887
Bagin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexus12в строке подключения ADO так и делаю
как подсунуть в строку подключения ODBC-таблицы?!!
Вот из хелпа скачал:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
    Dim Cnxn2 As ADODB.Connection
    
      ' Open a connection using a DSN and ODBC tags 
      ' It is assumed that you have create DSN 'Pubs' with a user name as 
      ' 'MyUserId' and password as 'MyPassword'. 
    Set Cnxn2 = New ADODB.Connection
    Cnxn2.ConnectionString = "Data Source='Pubs';" & _
        "User ID='MyUserId';Password='MyPassword';"
    Cnxn2.ConnectionTimeout =  30 
    Cnxn2.Open


Alexus12и что такое NT-аутенти? Пользователь домена NT. В данном случае, если Оракл конечно настроен, то он может распознавать пользователей по учетным записям домена NT, т.е. войдя в сеть пользователю не нужно дополнительно логинится к серверу БД.
...
Рейтинг: 0 / 0
ODBC-логин?
    #32723228
Alexus12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ваш пример - про ADO, именно так и пользуюсь,
а вопрос про ODBC,
есть _линкованная ODBC-таблица_
(на вкладке "таблицы" значок: стрелочка и глобус)
- как, получив от юзера логин/пароль в своей форме,
затолкать их в ODBC-таблицу, чтобы она не просила
еще одного логина при первом открытии?

NT-auth не пройдет -
не-NT система и auth externally запрещен
...
Рейтинг: 0 / 0
ODBC-логин?
    #32723244
Bagin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прошу прощения ...
А разве не возможно таким же образом подключиться к таблице в программе, а не использовать готовые связи?
...
Рейтинг: 0 / 0
ODBC-логин?
    #32723308
AlTis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Работающий пример.
При подключении к БД, переписываем все строки подключения для таблиц и запросов к серверу.

strCnn - строка подключения к БД.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
Set db = CurrentDb
For Each td In db.TableDefs
    If td.Connect <> "" Then DoCmd.RunSQL "DROP TABLE [" & td.name & "]"
Next

Set ws = DBEngine.Workspaces( 0 )
                
Set db = ws.OpenDatabase("", dbDriverNoPrompt, False, strCnn)

strCnn = "ODBC;" & strCnn

For Each td In db.TableDefs
    dhMessage , , td.name
    
        Set tbl = CurrentDb.CreateTableDef(td.name)
        tbl.Connect = strCnn
        
        tbl.SourceTableName = td.name
        CurrentDb.TableDefs.Append tbl
Next td

 'Переписываем строки подключеня у всех запросов к серверу 
For Each qd In CurrentDb.QueryDefs
     'Если это запрос к серверу 
    If qd.Type =  144  Or qd.Type =  112  Then
        qd.Connect = strCnn
    End If
Next qd
...
Рейтинг: 0 / 0
ODBC-логин?
    #32724002
Alexus12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
при этом варианте логин-пароль будут записаны в строку подключения всех таблиц, так?
И после закрытия базы они не испарятся - заходи кто хочешь под чужим логином и радуйся 8(
Опасно...
...
Рейтинг: 0 / 0
ODBC-логин?
    #32724064
SSY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexus12при этом варианте логин-пароль будут записаны в строку подключения всех таблиц, так?
И после закрытия базы они не испарятся - заходи кто хочешь под чужим логином и радуйся 8(
Опасно...

В таблицу MSysConf строку Config=101, NValue=0 добавил?

А чтоб аксесс с лишним логином не приставал, я программно линкую любую таблицу, потом линк удаляю. Соединение кешируется до следующего старта.
Примерно так:

Код: plaintext
1.
2.
3.
4.
strConnect = "ODBC;DSN=" & DSNName & ";UID=" & Me.txtUID & ";PWD=" & Me.txtPWD & ";"
DoCmd.TransferDatabase acLink, "База данных ODBC", strConnect, acTable, strTestTableName, "~TEST_CONNECT", , False
CurrentDb.TableDefs.Delete "~TEST_CONNECT"
CurrentDb.TableDefs.Refresh

Но это в общем. В реальности надо, конечно, всяких проверок и обработок ошибок навтыкать.
...
Рейтинг: 0 / 0
ODBC-логин?
    #32724165
Alexus12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо
Проблема обойдена так:
/http://www.sql.ru/forum/actualthread.aspx?tid=125029
...
Рейтинг: 0 / 0
ODBC-логин?
    #32724263
Фотография kedzo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexus12Спасибо
Проблема обойдена так:
/http://www.sql.ru/forum/actualthread.aspx?tid=125029

и, правильно, пусть сервак свой процессор нагружает :)
...
Рейтинг: 0 / 0
ODBC-логин?
    #32724579
Alexus12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сервер и раньше выполнял,
тока команда шла через ADO:


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
Sub Exec_SP_DAILY_MANBAL_ADO(tdate As Date, tdatePREV As Date, usr, pas)
Dim tmBegin
    Dim objConn As New ADODB.Connection
    Dim objRs As New ADODB.Recordset
    Dim objComm As New ADODB.Command
    
    With objConn
        .Provider = "MSDAORA"
        .ConnectionString = "Data Source=DSNNAME;User ID=" & usr & "; Password=" & pas & ";"
        .Open
    End With
    
     ' Connect to the data source. 
    
     ' Set a stored procedure 
    objComm.CommandText = "ADM_SP_DAILY_MANBAL"
    objComm.CommandType = adCmdStoredProc
    Set objComm.ActiveConnection = objConn

     ' Execute the stored procedure on 
     ' the active connection object... 
     '    "ALFKI" is the required input parameter, 
     '    objRs is the resultant output variable. 
tmBegin = Timer
    objConn.ADM_SP_DAILY_MANBAL tdate, tdatePREV
    
    
     'Clean up. 
 '    objRs.Close 

    objConn.Close
    Set objRs = Nothing
    Set objConn = Nothing
    Set objComm = Nothing

 'http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ado270/htm/mdconstoredprocasmethodonconnection.asp 

 'MsgBox "Executing complete in " & TimeStamp(Timer - tmBegin) 
End Sub

а ей нужно было передать логин-пароль ЕЩЕ раз
...
Рейтинг: 0 / 0
ODBC-логин?
    #32724708
AlTis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexus12при этом варианте логин-пароль будут записаны в строку подключения всех таблиц, так?
И после закрытия базы они не испарятся - заходи кто хочешь под чужим логином и радуйся 8(
Опасно...

А вы пробовали?
если нет пустого аккаунта, то во при следуюшем входе до таблиц достучаться нельзя. Пароль слетает.
...
Рейтинг: 0 / 0
ODBC-логин?
    #32726120
AllTis ==>
Set db = CurrentDb
For Each td In db.TableDefs
If td.Connect <> "" Then DoCmd.RunSQL "DROP TABLE [" & td.name & "]"
Next

;)


Dim td As DAO.TableDef
Dim MyConnectionString As String

.....

' Перелинковка связанных таблиц
With CurrentDb
For Each td In .TableDefs
If td.Connect <> "" Then
DoCmd.RunSQL "DROP TABLE [" & td.Name & "]"
DoCmd.TransferDatabase acLink, "ODBC", _
MyConnectionString, acTable, td.SourceTableName, td.Name
End If
Next
End With

Это работает для таблиц, имеющих ключевое поле. В противном случае пользователь
BadBoy почемывая репу думает, какое поле назначить индексным (аксесс выдаст окно дозапроса параметров).

Но что делать с запросами к серверу?
Новая строка присоединения заносится, но будет работать только после перезагрузки приложения. Пользователь MyFavoriteUser логинится, но запрос к серверу идет от "прежнего пользователя" BadBoy и только после перезагрузки приложения для MyFavoriteUser вызов ХП сработает...

With CurrentDb
j = .QueryDefs.Count
For i = 0 To j - 1
If .QueryDefs(i).Type = dbQProcedure Then
.QueryDefs(i).Connect = MyConnectionString
End If
Next i
.QueryDefs.Refresh
End With

Что делать бум, господа эксперты???
...
Рейтинг: 0 / 0
ODBC-логин?
    #32726221
AlTis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Virtual Soldier, retired

простите, а что смешного в моём коде?
Мне не надо перебирать все прилинкованные табл, находящиеся в БД.
БД постоянно растёт, что добавляется, что-то удаляется.
Мне нужны именно те табл, котор. есть на сервере (в моём случае MySQL).


автор
Это работает для таблиц, имеющих ключевое поле. В противном случае пользователь
BadBoy почемывая репу думает, какое поле назначить индексным (аксесс выдаст окно дозапроса параметров).
при использовании конструкции
Код: plaintext
1.
2.
3.
4.
5.
        Set tbl = CurrentDb.CreateTableDef(td.name)
        tbl.Connect = strCnn
        
        tbl.SourceTableName = td.name
        CurrentDb.TableDefs.Append tbl
никаких траблов не возникает

авторНовая строка присоединения заносится, но будет работать только после перезагрузки приложения.
тоже не наблюдал. Всё работает сразу при загрузке приложения.
Если я правильно понимаю, то запрос к серверу обычный readonly ADO recordset, который в кач-ве connectionstring как раз и берёт строку подключения запроса к серверу
...
Рейтинг: 0 / 0
ODBC-логин?
    #32726647
2ALTis

в Вашем коде ничего смешного нет. то ли "не удел", то ли "битый", Virtual Soldier чаще смеется над своим кодом, который иногда не светлее "тёмных электрических сил".

некоторое время я бьюсь над аналогичной проблемой. скопировал Ваш код и "потерял" линки - не хватало прав для прочтения первой же таблицы на сервере, как раз для пользователя BadBoy, под логином коего я коннектился к MS SQL БД ;)
в моем случае использовать ADO нежелательно, так же, как и ADP.
одно и то же клиентское место может быть использовано разными пользователями.

Что с ними происходит я описал (после переопределения коннекшн стринг изменения вступают в силу при перезагрузке приложения, что есть нехорошо).
на "чистую" MS Windows XP установлен "чистый" Office XP SP1 with FrontPage. Сервер - MS SQL 2000 SP2.
...
Рейтинг: 0 / 0
ODBC-логин?
    #32726833
BadBoy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сделайте .QueryDefs(i).Connect
без юзера и пароля (т.е. вообще не предо/переопределяйте)
пусть запускаются под тем, чей сеанс. (кто первый открыл хоть что-то на сервере в этом сеансе).
в .Execute (для исполнимых) (можете) передавайте и пароль и логин непосредственно при исполнении.

+ В текущем рабочем сеансе не должен меняться юзер. (логиниться к таблицам только при входе в приладу, больше приглашений не давать).
Т.е. с того же места новый юзер должен открывать то же приложение еще раз.
Иначе достаточно открыть любую таблицу как GoodMan и запрос, в строке которого еще до начала сеанса прописан BadBoy (и никто его не менял) откроется и не спросит пароля. (т.е. откроется из-под GoodMan)

Или поясните свою мысль/проблему иначе.
...
Рейтинг: 0 / 0
ODBC-логин?
    #32728023
2BadBoy

Ниже приведен код моей текущей "миссии" (my primary combat mission), в которой мне приказано добиться следующей цели: Предыдущий Пользователь входит под своим логином и безмятежно трудится. Другой Пользователь, возжелавший потрудиться на том же каунтупере (устройстве, притупляющем способность к устному счету или My IBM PC), договаривается с Предыдущим Пользователем о Возможности Завершения Приложения. Предыдущий пользователь Завершает Приложение и Другой Пользователь, щелкнув мышь, находясь на ярлычке приложения, единственный раз вводит свой логин и пароль, после чего "take a cup of coffeе and relax", пока каунтупер предсказывает светлое будущее.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
Option Compare Database
Option Explicit

 ' Использовать переопределение связей с таблицами 
#Const Apply_Redefine_TableDef =  1 
#Const Apply_Redefine_TableDef_v1 =  1 

 ' Использовать переопределение связей с запросами к серверу 
#Const Apply_Redefine_QeryDef =  1 

 ' Использовать TurboPower Software Suite 
#Const UseTurboPowerSuite =  0 

 ' Глобальные декларации 
   
 ' несуществующий логин. В этом случае в системном окне "Вход в сервер SQL" 
 ' пользователь должен будет ввести и логин и пароль. 
Public Const strUID As String = "UID=(не указан);"
Public Const strPWD As String = "PWD=;"

Public cn_str   As String            ' строка подключения 
Public cn_MyDb  As DAO.Connection    ' соединение с БД 
Public ws_MyDb  As DAO.Workspace     ' рабочая область 
Public db_MyMdb As DAO.Database      ' копия свойства CurrentDB 

Private Const strProvider    As String = "ODBC;"
Private Const strDriver      As String = "DRIVER=SQL Server;"

Private Const strServer      As String = "SERVER=MYSERVER;"
Private Const strDatabase    As String = "Database=MYDBTEST;"
Private Const strAddress     As String = "Address=MYSERVER,1433"
Private Const strNetwork     As String = "Network=DBMSSOCN;"

Public Sub OpenODBCDirectConnection()
 ' Устанавливает связь с БД, переопределяет строки подключения 
 ' связанных таблиц и запросов к серверу. 
   
    Dim i, j As Integer

#If Apply_Redefine_TableDef_v1 =  1  Then
    Dim td As DAO.TableDef
    Dim tbl As DAO.TableDef
#End If
    
     ' формируем строку подключения 
    cn_str = strProvider & strDriver & strServer & strDatabase & _
        strUID & strPWD
 ' "третий стакан" 
 '        strNetwork & _ 
 '        strAddress 
    
     ' --- Подключаем БД --- 
     ' Создаем рабочую область ODBCDirect. Передаем пустые name, user и password, 
     ' так как подключение и авторизацию будем осуществлять через OpenConnection, 
     ' используя строку подключения. Помним о том, что непустой параметр Name 
     ' в CreateWorkspace принуждает к излишнему поиску DSN с именем Name. 
    Set ws_MyDb = CreateWorkspace("", "", "", dbUseODBC)
   
     ' Устанавливаем подключение: пусть dbDriverCompleteRequired 
     ' разрешит пользователю доввести только недостающие сведения 
    Set cn_MyDb = ws_MyDb.OpenConnection( _
       "", dbDriverCompleteRequired, , cn_str)
    
     ' сохраняем строку подключения после авторизации 
    cn_str = cn_MyDb.Connect
    
    Set db_MyMdb = CurrentDb

#If Apply_Redefine_TableDef =  1  Then
     ' Переопределяем строки подключения связанных таблиц 
    With db_MyMdb
        #If Apply_Redefine_TableDef_v1 =  0  Then
             '--- сканируем коллекцию таблиц 
            j = .TableDefs.Count  ' всего таблиц в коллекции 
            For i =  0  To j -  1 
                If Len(.TableDefs(i).SourceTableName) <>  0  Then
                    ' связанная таблица - переопределяем 
                    ' строку подключения и освежаем связь 
                   .TableDefs(i).Connect = cn_str
                   .TableDefs(i).RefreshLink
                End If
            Next i
        #Else
            For Each td In .TableDefs
                If td.Connect <> "" Then
                    DoCmd.RunSQL "DROP TABLE [" & td.Name & "]"
                    DoCmd.TransferDatabase acQuery, "ODBC", _
                        cn_str, acTable, td.SourceTableName, td.Name
                End If
            Next
        #End If
    End With
    .TableDefs.Refresh   ' освежаем состояние коллекции TableDefs 
#End If

#If Apply_Redefine_QeryDef =  1  Then
     ' Переопределяем строки подключения запросов к серверу 
    With db_MyMdb
         '--- сканируем коллекцию запросов --- 
        j = .QueryDefs.Count  ' всего запросов в коллекции 
        For i =  0  To j -  1 
            If .QueryDefs(i).Type = dbQAction Or .QueryDefs(i).Type = dbQProcedure Then
                 ' запрос вида "действие" или "хранимая процедура". 
                 ' переопределяем строку подключения 
                .QueryDefs(i).Connect = cn_str
            End If
        Next i
        .QueryDefs.Refresh  ' освежим состояние коллекции QueryDefs 
    End With
#End If

End Sub

Вот то, что происходит в реальности: Другой Пользователь успешно вводит свой логин и пароль, но всё, как бы, напоминает День Сурка - хранимая процедура запускается от имени Предыдущего Пользователя, несмотря на то, что в строке подключения ХП сохранен правильный логи и пароль (это видно и в соответствующем свойстве и в служебных таблицах MSysObjects, MSysQueries).

"take a cup of coffeе" не получается... Теребя мышиный хвост, Другой Пользователь выгружает приложение и снова щелкает по ярлычку. Вводит логин. Вводит пароль. И только после этой престидижитации "take a cup of coffeе and relax"...

В форме, наименование которой установлено в параметрах запуска, размещен выпадающий список, его содержимое зависит от текущего пользователя, причем, источник строк упомянутого списка - ХП.

Сейчас, BadBoy, я воплощаю в жисть Ваш совет. Сенкс.
...
Рейтинг: 0 / 0
ODBC-логин?
    #32728145
очепятка:
DoCmd.TransferDatabase acQuery
следует читать как
DoCmd.TransferDatabase acLink
...
Рейтинг: 0 / 0
ODBC-логин?
    #32728376
3BadBoy
Спасибо за мысль, BadBoy.
Чокнуться можно: и Предыдущий Пользователь, и Другой Пользователь, и даже сам GoodWin "тэйк э кап оф коффи энд рилакс"...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
Sub ShowErrMsg(Optional Caption As String)
    MsgBox "Ошибка № " & err.Number & vbNewLine & _
        err.Description, vbCritical + vbOKOnly, Caption
End Sub

Public Function IsLoaded(ByVal strFormName As String) As Boolean
 ' Заимствована из базы данных "Борей" (NorthWin.mdb), 
    Const conObjStateClosed =  0 
    Const conDesignView =  0 
    If SysCmd(acSysCmdGetObjectState, acForm, strFormName) <> conObjStateClosed Then
        If Forms(strFormName).CurrentView <> conDesignView Then
            IsLoaded = True
        End If
    End If
End Function

Public Function ЗакрытьФормуЕслиЗагружена(ByVal strFormName As String)
 ' Закрывает форму strFormName, если она загружена 
    On Error GoTo ErrHandler
    If IsLoaded(strFormName) Then DoCmd.Close acForm, strFormName
ExitSub:
    Exit Function
ErrHandler:
    ShowErrMsg
    Resume ExitSub
End Function

 ' Стартовая форма frmStartUp 

Private Sub Form_Open(Cancel As Integer)
     ' Главная форма с элементами, источник данных которых   
     ' зависит от текущего логина 
    OpenODBCDirectConnection
    DoCmd.OpenForm "frmMain"
End Sub

 ' Форма frmMain 

Private Sub Form_Open(Cancel As Integer)
    On Error GoTo ErrHandler
    ЗакрытьФормуЕслиЗагружена "frmStartUp"
     ' Остальной код 
     ' ... 
ExitSub:
    Exit Sub
ErrHandler:
    ShowErrMsg Me.Caption
    Resume ExitSub
End Sub

Перед закрытием приложения

Код: plaintext
1.
2.
3.
4.
5.
    ...
    .TableDefs(i).Connect = ""
    .QueryDefs(i).Connect = "ODBC;"
    ...
    Application.Quit acQuitSaveAll
...
Рейтинг: 0 / 0
ODBC-логин?
    #32728795
BadBoy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
наверное это не совсем хорошо. Т.к. после аварийного завершения
.QueryDefs(i).Connect <> "ODBC;"
и, более того, коннекты запросов, кажется, содержат пароль и логин битым текстом (в отличии от таблодефов, если не указан параметр "хранить пароль"). Т.е. достаточно открыть приложение после падения (или подключиться к его файлу извне и просмотреть .QueryDefs(i).Connect), и пароль Гудвина и логин будет известен.


С другой стороны, если во всех .QueryDefs(i).Connect прописаны те же самые "сервер" и "датабаза", что и в первом совершенном соединении (таблицы, запроса), осуществленного к базе, аксесс откроет эти запросы под тем юзером, под кем проходил ("первый") коннект. (Видимо это св-во аксеса. "право первой .кхм. связи". Если завершить приложение, но не выходить из аксесса, то, повторно открыв файл б.д приложения можно открыть любую таблицу или запрос, (к той же базе сервера), не указывая логина и пароля. Запрос происходит, похоже, только если строка подключения указывает на другой сервер или базу данных (про дсн врать не хочу - не пользуюсь). Держит ли аксесс какой -нить выделенный коннект до упора (или хранит только его параметры) - не понятно. Что происходит, когда в сеансе открывалось несколько баз (серверов) точно не исследовал (пользовался только в узко прикладных целях).



Вообще-то я пользуюсь чуть модифицированным кодом от SSY (аналог ветки с DoCmd.TransferDatabase в вашем коде + таблица подключаемых таблиц/ключей - чтобы не терять таблицы при ошибках, + иметь квазиключи для таблиц без ключей (вью)), в который ввел разве что таблицу баз (для перелинковки с отладочной на работающую базы), и еще какие-то мелочи. Запросы програмно не линкую, а пользую строку подключения без юзера и пароля. (после процедуры логина они (как показывает практика) автоматом используют параметры подключившегося юзера).


Но исполняемые запросы к серверу получают (на всякий случай) строку подключения при выполнении (.Execute ) вне зависимости, сохраненные они, или просто строка SQL. Примерно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
Function ExecuteSQLf(strSQL As String) As Boolean
On Error GoTo err_ExecuteSQLf

Dim wrkODBC As Workspace
Dim conP As Connection
Dim dbsP As Database
Dim sD As String
    logPrint strSQL
    Set wrkODBC = CreateWorkspace("NewODBCWorkspace", "nobody", "", dbUseODBC)
     'Set conP = wrkODBC.OpenConnection("", dbDriverNoPrompt, , fstrODBC()) 
     'Set dbsP = wrkODBC.OpenDatabase("", dbDriverNoPrompt, True, fstrODBC()) 
    Set dbsP = wrkODBC.OpenDatabase("", dbDriverComplete, True, fstrODBC())
        dbsP.Execute strSQL
        logPrint "RecordsAffected" & " " & dbsP.RecordsAffected
        ExecuteSQLf = True
ex_ExecuteSQLf:
On Error Resume Next
    dbsP.Close
     'conP.Close 
    wrkODBC.Close

    Set dbsP = Nothing
    Set wrkODBC = Nothing
    Exit Function
err_ExecuteSQLf:
    sD = Err.Description & ";"
    sD = sD & fErr_discription()
    logPrint sD
    ExecuteSQLf = False
    Resume ex_ExecuteSQLf 
End Function
(на деле у меня 2 процедуры - вторая дергает то же самое через кваеридеф - с тем, чтобы не меняя QueryTimeout поменять ODBCTimeout текущего запроса).
...
Рейтинг: 0 / 0
ODBC-логин?
    #32728807
BadBoy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
автор Держит ли аксесс какой -нить выделенный коннект до упора
посмотрел. Держит. Коннект пропадает только после закрытия самого Аксесса. Но вот в объектной модели Аксесса ничего, что звалось бы Воркспейсис(0).Коннекшнз не видно.
...
Рейтинг: 0 / 0
ODBC-логин?
    #32730085
Разделим процесс разработки приложения на тривиальные стадии: разработка и издание. Для «внутренней» версии 1.00 beta я, обычно, не разделяю проект на два файла (mdb-клиент и mdb-таблицы, включая связанные таблицы и запросы), поскольку GoodWin занят Страшилой, и его аппетит «приходит во время еды»… Другими словами, редкий Заказчик в состоянии с первой итерации формализовать свои Исходные Требования и в тесном контакте с Разработчиком, породить Техническое Задание, разработанное не как документ ради документа, а как документ, в котором оговорено всё, вплоть до «третьего стакана» (известный анекдот о программистах, где на ночь устанавливаются два стакана – один, если захочется пить, другой – если не захочется. Думаю, следует устанавливать три стакана – третий заполнен наполовину: если захочется чуть-чуть). Как только готова версия 1.00, появляется смысл разделить проект на две редакции – «для разработчика» и «для конечного пользователя», независимо от наличия в разделе ТЗ «Требования к исходным кодам» пункта «Приложение поставляется с исходным кодом». Исходный код «редакции для разработчика» содержит модуль с процедурой RebuildApplicationForEndUser. Эта процедура создает новый mdb файл; экспортирует в него всё содержимое проекта приложения (несколько модифицируя исходный код модулей); создает рабочую группу, включает пользователей, удаляет Admin аккаунт, задает права и т.п.; оптимизирует запросы (для оптимизации запроса его необходимо открыть и после этого сохранить, так написано в библии от Билли и это действительно так), словом, всё то, что надо сделать «вручную». Ручное или программное перемещение объектов в конечные файлы «для конечного пользователя» обусловлено отсутствием в Microsoft Access Object Library системной процедуры вида CleanUpSysTables… Это действие позволяет избежать наведенных проблем: беспричинное увеличение времени обращения как к встроенным таблицам, так и к присоединенным, мерцающие ошибки вида «передача управления на несуществующую закладку» (ну нет Bookmark в проекте), спонтанные потери линков, потери управления (нет неинициализированных ссылочных переменных, нет «магии» с хитрым переопределением указателей) и многое другое. Нехитрое действие возвращает веру в мощь Access в пределах назначения, оговоренного в документах от Билли, укрепляет уверенность в собственных силах, подтверждая факт того, что не столько важен язык программирования (на чем писать? Паскаль, Модула, Ада, Си, просто Васик?.. Так, чтоб один кнопель – BuildMyApp и вперед за убитыми енотами), как важна дисциплина ;))) В редакции для конечного пользователя .mde файл (клиент) и .mdb файл таблиц и запросов защищены на уровне групп пользователей. В этом случае никто не сможет открыть ни .mde, ни .mdb файл. Причем, если создавать короткий ID в мастере защиты, например, 4 литеры, скорость будет протрясающая, длинный ID несколько сбавит прыть, но юный хацкер удручен. Для старого хацкера можно упрятать приложение вместе с файлом рабочих групп на PGP диск или правильно проадминенный NTFS том, на который заходят проверенные пользователи правильно проадминенного домена (в нужные настройки даже продвинутые программисты да сисадмины редко лезут, благодаря очень качественной документации от Билли или тому, что убитых енотов за это – фигвам, либо, порой, некому оценить, либо безопасности уделяют мало внимания, закладывая риск в стоимость готовой продукции, например).

Что-то я сильно отвлёкся. Конечно, следует добавить в ErrorHandler удаление информации о коннекте для фатальных ошибок. Сенкс, BadBoy.

BadBoy >> «Запрос происходит, похоже, только если строка подключения указывает на другой сервер»
– Да. Это всегда так происходит.

BadBoy >> «Запросы програмно не линкую»
– Я не линковал программно хп-запросы до тех пор, пока в стартовой форме frmMain не появился возвращающий записи хп-запрос, назначенный в качестве источника строк для frmMain!MyPickList… Дело в том, что MyPickList.OnLoad совершается до frmMain.OnLoad, другими словами, вход пользователя в SQL Server (т.е. обращение к OpenODBCDirectConnection из приведенного выше кода) происходит после события MyPickList.OnLoad. Поскольку сведения о подключении пользователя, завершившего работу с приложением (закрывшим mde файл) сохранены в mde, то… Вот тут-то я «неподецки» посмеялся. Так, пора к GoodWin – за свежими острыми мозгами… ;)))
...
Рейтинг: 0 / 0
ODBC-логин?
    #32730280
Кое-что из Справки MS Accesss

Порядок событий в объектах базы данных
Порядок событий элементов управления в формах
События элемента управления возникают в форме при переводе фокуса на элемент управления и при изменении или обновлении данных в элементе управления.
...При переводе фокуса на элемент управления в форме — например, при открытии формы, содержащей один или несколько активных элементов управления, или при переходе на другой элемент управления в той же форме — возникают события Вход (Enter) и Получение фокуса (GotFocus):

Вход -> Получение фокуса

Когда пользователь открывает форму, эти события возникают после событий, связанных с открытием формы, таких как Открытие (Open), Включение (Activate) или Текущая запись (Current), в такой последовательности:

Открытие (форма) -> Включение (форма) -> Текущая запись (форма) -> Вход (элемент) -> Получение фокуса (элемент)...

Упомянутая мной выше форма frmMain содержала два свободных поля и, следующее за ними в порядке возрастания форм-индекса поле MyPickList, причем MyPickList.RowSource="MyStoredProc".

В коде frmMain ставим точку прерывания на первом операторе обработчика frmMain.OnLoad. Принудительно рекомпилируем и сохраняем. Устанавливаем frmMain стартовой формой приложения. Удаляем содержимое строк подключения запросов к серверу и все прилинкованные таблицы. Закрываем Ms Access.

Загружаем приложение. Получаем окно Select Data Source... Нет ни одной линкованной таблицы. Есть только одно поле MyPickList.

Таким образом, событие MyPickList.OnLoad наступает раньше события frmMain.OnLoad, что не соответствует приведенной выдержке из MS Access Help System, а в точности соответствует порядку следования событий в формах, содержащих подчиненные формы: события в подчиненных формах происходят перед событиями мастер-формы.

Впрочем, я еще не успел проапгрейдить свои мозги у GoodWin...
...
Рейтинг: 0 / 0
25 сообщений из 40, страница 1 из 2
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / ODBC-логин?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]