powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Создание ODBC DSN источников - как правильно ?
25 сообщений из 28, страница 1 из 2
Создание ODBC DSN источников - как правильно ?
    #35214353
kefi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Создаю DSN с помощью след функции :

Код: 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.
Public Declare Function SQLConfigDataSource Lib "ODBCCP32.DLL" (ByVal hwndParent As Long, ByVal fRequest As Long, ByVal lpszDriver As String, ByVal lpszAttributes As String) As Long

Function CreateDSN(StrCnn As String, _
              Optional sDriver As String = "", _
              Optional hWnd As Long =  0 &, _
              Optional Oper As long = ODBC_ADD_SYS_DSN  ) As long
'ODBC_ADD_SYS_DSN = 4

Dim sCnn As String, TestCnn As ADODB.Connection, i  As Long, intRet As Long

'Set the attributes delimited by null. See driver documentation for a complete list of supported attributes.
sCnn = ReplaceAll(StrCnn, ";", Chr$( 0 )) ' замена ; на 0

intRet = SQLConfigDataSource(hWnd, Oper, sDriver, sCnn)

CreateModiDSN = IIf(intRet,  1 , - 1 )

If CreateModiDSN = - 1  Then
 Err.Raise vbObjectError +  1 , , "Ошибка при создании/модификации DSN"
Else
 i =  1  
 On Error GoTo  1 
  Set TestCnn = New ADODB.Connection
  TestCnn.Open StrCnn
  TestCnn.Close
 Debug.Print "i=" & i 
 Exit Function
  1 :            ' вот здесь может накручивать счетчки до 9000 ( это от 100 до 1000 msec)
 i = i +  1 
 Resume
End If
end function

По шагам в Debug mode все работает идеально! Но вот проблема в том, что
в runtime - не успевает сразу после создания DSN использовать TestCnn.Open и без придуманного цикла программа вываливается с ообщением об ошибке - пришлось организовать цикл с TestCnn.Open StrCnn .... Resume.

Как сделать красивее ? Т.е. хотелось бы не тестировать с помощью открытия TestCnn, а проверять - создан ли уже DSN или нет ?
...
Рейтинг: 0 / 0
Создание ODBC DSN источников - как правильно ?
    #35214723
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
Set TestCnn = New ADODB.Connection
Do
  Err.Clear
  TestCnn.Open StrCnn
  DoEvents 'не вешай циклом систему
Loop Unil Err.Number =  0 
TestCnn.Close
...
Рейтинг: 0 / 0
Создание ODBC DSN источников - как правильно ?
    #35214725
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А лучше поставь DoEvents перед Open. А еще вместо OnError Goto 1 - Resume Next.
...
Рейтинг: 0 / 0
Создание ODBC DSN источников - как правильно ?
    #35215003
kefi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Antonariy
А лучше поставь DoEvents перед Open. А еще вместо OnError Goto 1 - Resume Next. >

За DoEvents спасибо, что вспомнил, а Resume Next не позволит мне после ошибки использовать Resume, т.к. Resume не в блоке обработки ошибок игнорируется.Но это к слову, хотелось-то другое -
не тестировать с помощью открытия TestCnn, а проверять - создан ли уже DSN или нет
...
Рейтинг: 0 / 0
Создание ODBC DSN источников - как правильно ?
    #35215083
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: kefi
> 2 Antonariy
> А лучше поставь DoEvents перед Open. А еще вместо OnError Goto 1 -
> Resume Next. >
>
> За DoEvents спасибо, что вспомнил, а Resume Next не позволит мне
> после ошибки использовать Resume, т.к. Resume не в блоке обработки ошибок
> игнорируется.Но это к слову, хотелось-то другое -
> не тестировать с помощью открытия TestCnn, а проверять - создан ли
> уже DSN или нет

Практически
из МСДН код. можно проверить на созданость этих ключей или просто этим
создавать

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Создание ODBC DSN источников - как правильно ?
    #35215147
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kefiа Resume Next не позволит мне после ошибки использовать Resume, т.к. Resume не в блоке обработки ошибок игнорируется.Я имел ввиду On Error Resume NExt
...
Рейтинг: 0 / 0
Создание ODBC DSN источников - как правильно ?
    #35215240
kefi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot Игорь Горбонос ]

Практически
из МСДН код. можно проверить на созданость этих ключей или просто этим
создавать

[/quot]
спасибо, да это может подойти - проверять с помощью регистра.

2 Antonariy > а Resume Next не позволит мне после ошибки использовать Resume, т.к. Resume не в блоке обработки ошибок игнорируется.
Я имел ввиду On Error Resume NExt

я понял. я именно на это и ответил.
...
Рейтинг: 0 / 0
Создание ODBC DSN источников - как правильно ?
    #35215513
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во первых, вот эти две строки зачем? вот так не проще будет?
Код: plaintext
1.
CreateModiDSN = IIf(intRet,  1 , - 1 )
If CreateModiDSN = - 1  Then
Не проще ли будет сразу проверять:
Код: plaintext
if not intRet then
Ошибки создания DSN надо читать через SQLInstallerError()

Дальше идет вообще совершенно не нужный кусок кода:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
 i =  1  
 On Error GoTo  1 
  Set TestCnn = New ADODB.Connection
  TestCnn.Open StrCnn
  TestCnn.Close
 Debug.Print "i=" & i 
 Exit Function
  1 :            ' вот здесь может накручивать счетчки до 9000 ( это от 100 до 1000 msec)
 i = i +  1 
 Resume

kefiПо шагам в Debug mode все работает идеально! Но вот проблема в том, что
в runtime - не успевает сразу после создания DSN использовать TestCnn.Open и без придуманного цикла программа вываливается с ообщением об ошибке
Ошибку ты нам сообщишь? А вообще-то такого не может быть. Там нету нигде многопотоковости и все вызовы самого ODBC интерфейса всегда синхронные. У тебя ошибка где-то в другом месте.

kefiКак сделать красивее ? Т.е. хотелось бы не тестировать с помощью открытия TestCnn, а проверять - создан ли уже DSN или нет ?Проверить существование DSN можно через функцию SQLDataSources() (правда сложное имя для угадывания?) Она тебе вернет список всех доступных данному юзеру dsn'ов системных, пользовательских или файловых.
Во вторых, в чем вообще смысл создавание dsn'ов? Если твоя программа сама знает всю строку коннекта, то dsn вообще нафиг не нужен. Отдавай строку в SQLDriverConnect() и все.
...
Рейтинг: 0 / 0
Создание ODBC DSN источников - как правильно ?
    #35221407
kefi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прошу прощения, что удалось ответить только сейчас

White OwlВо первых, вот эти две строки зачем? вот так не проще будет? ...

конечно, проще, но суть не в этом, а ...- см. ниже
Ошибки создания DSN надо читать через SQLInstallerError()
НЕТ ошибок-то, - DSN создается успешно .

[/quot]
Дальше идет вообще совершенно не нужный кусок кода:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
 i =  1  
 On Error GoTo  1 
  Set TestCnn = New ADODB.Connection
  TestCnn.Open StrCnn
  TestCnn.Close
 Debug.Print "i=" & i 
 Exit Function
  1 :            ' вот здесь может накручивать счетчки до 9000 ( это от 100 до 1000 msec)
 i = i +  1 
 Resume
[/quot]
Кусок совершенно нужный, т.к. он показывает ,что в этом коде после создания, причем УСПЕШНОГО DSN'а коннект сразу не установить - придется сделать несколько сотен попыток. Но это было из первого поста неочевидно, (см. ниже тест)

функцию SQLDataSources() (правда сложное имя для угадывания?)
Для угадывания любой слово сложное. За наводку спасибо.


Во вторых, в чем вообще смысл создавание dsn'ов? Если твоя программа сама знает всю строку коннекта, то dsn вообще нафиг не нужен. Отдавай строку в SQLDriverConnect() и все.
Программа строку знает, только на случай несуществования DSN (т.е. в случае, елси он нес существует, то - будет создан по этой строке). А зачем DSN сам по себе, - так это уже вопрос за рамками темы, да и не суть это.


Ошибку ты нам сообщишь? А вообще-то такого не может быть. Там нету нигде многопотоковости и все вызовы самого ODBC интерфейса всегда синхронные. У тебя ошибка где-то в другом месте.

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

Код: 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.
Public Declare Function SQLConfigDataSource Lib "ODBCCP32.DLL" (ByVal hwndParent As Long, ByVal fRequest As Long, ByVal lpszDriver As String, ByVal lpszAttributes As String) As Long

' Перед вызовом удалить DSN TestExcel, если он есть
Function CreateDSNTest() As Object
Dim StrCnn As String, drvName As String
' попытка коннекта (считая , что DSN is valid ) --------------
On Error GoTo ErrH
Set Cnn = New ADODB.Connection
' Какой-ни реальный SLS файл :
StrCnn = "DSN=TestExcel;Driver={Microsoft Excel Driver (*.xls)};" & _
         "DriverId=790;Dbq=C:\1\Книга1.XLS;"
Cnn.ConnectionString = StrCnn
Cnn.Open
Set CreateDSNTest = Cnn
Exit Function ' -->>' выход при удаче -->>

ErrH:  '  ошибка из-за отсутствия DSN или по другим причинам
Debug.Print Cnn.State, Err.Description, Cnn.Errors.Count

' Если этого (или Set Cnn=Nothing) не сделать, в след функции невозможно будет с 1 раза
' протестировать DSN (придется делать от 100 до 1000 попыток ) :
'Set Cnn = New ADODB.Connection  ' ни On Error Goto 0 ни Err.Clear, Cnn.Errors.Clear - не помогают !
On Error GoTo  [b]0 
Err.Clear
Cnn.Errors.Clear[/b]

' неудача из-за того, что  DSN не создан - попытка создания DSN ---------------
drvName = "Microsoft Excel Driver (*.xls)"
CreateDSN StrCnn, drvName, ,  4 

' DSN удачно создан - Вторая и Последняя попытка коннекта после свежесозданного DSN
Set Cnn = New ADODB.Connection ' елси этого не сделать, то будет в след строке ошибка
Cnn.ConnectionString = StrCnn
Cnn.Open
Set CreateDSNTest = Cnn

End Function
Function CreateDSN(StrCnn As String, _
              Optional sDriver As String = "", _
              Optional hWnd As Long =  0 &, _
              Optional Oper As Long =  4 ) As Long
'ODBC_ADD_SYS_DSN = 4

Dim sCnn As String, TestCnn As ADODB.Connection, i  As Long, intRet As Long, sa() As String

'Set the attributes delimited by null. See driver documentation for a complete list of supported attributes.
sa = Split(StrCnn, ";")
sCnn = ""
For i =  0  To UBound(sa)
 sCnn = sCnn & IIf(i =  0 , "", Chr$( 0 )) & sa(i)
Next i

intRet = SQLConfigDataSource(hWnd, Oper, sDriver, sCnn)

CreateDSN = IIf(intRet,  1 , - 1 )

If CreateDSN = - 1  Then ' Сюда в тесте никогда не приходим
 Err.Raise vbObjectError +  1 , , "Ошибка при создании/модификации DSN"
Else
 i =  1 
 On Error GoTo  1 
  Set TestCnn = New ADODB.Connection
  TestCnn.Open StrCnn
  TestCnn.Close
  Set TestCnn = Nothing
  Debug.Print "i=" & i
  Exit Function
 1 :             ' вот здесь может накручивать счетчки до 9000 ( это от 100 до 1000 msec)
 i = i +  1 
 Resume
End If
End Function


Суть оказалась в выделенном тексте - кто-то может объяснить - почему же так? НУ была неудачная попытка использования DSN, еще ДО его создания, - ну и что , зачем Nothing в этот нейдачный Connection Cnn класть для того, чтобы следующий совершенно отдельный Connection TestCnn мог выполнить с первого раза после создания DSN удачную попытку коннекта ?
...
Рейтинг: 0 / 0
Создание ODBC DSN источников - как правильно ?
    #35221416
kefi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Черт, текст в коде не выделился с сутью-то ;) ...
Вот он
'
Код: plaintext
1.
2.
3.
4.
5.
Если этого (или Set Cnn=Nothing) не сделать, в след функции невозможно будет с 1  раза
' протестировать DSN (придется делать от 100 до 1000 попыток ) :
'Set Cnn = New ADODB.Connection  ' ни On Error Goto 0 ни Err.Clear, Cnn.Errors.Clear - не помогают !
On Error GoTo  0 
Err.Clear
Cnn.Errors.Clear
...
Рейтинг: 0 / 0
Создание ODBC DSN источников - как правильно ?
    #35221435
kefi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну и еще раз уже вопрос :
Суть оказалась в выделенном тексте - кто-то может объяснить - почему же так? НУ была неудачная попытка использования DSN, еще ДО его создания, - ну и что , зачем Nothing в этот неудачный Connection Cnn класть для того, чтобы следующий совершенно отдельный Connection TestCnn мог выполнить с первого раза после создания DSN удачную попытку коннекта ?
Т.е. м.б. многопотоковости и нет при создании DSN, но как все-же объяснить феномен ?
...
Рейтинг: 0 / 0
Создание ODBC DSN источников - как правильно ?
    #35221666
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Убери из strConn указание драйвера:
StrCnn = "DSN=TestExcel;Dbq=C:\1\Книга1.XLS;"
И вообще никогда не указывай вместе DSN и DRIVER в одной строке коннекта. Либо то, либо другое. Но никогда вместе. Во первых, это бессмысленно - DSN хранит имя драйвера внутри себя в любом случае. Во вторых, сам себя запутаешь - какой драйвер в реальности будет использован? В третьих, на некоторых версиях драйвера можем получить наблюдаемую тобой картинку (там еще сборщик мусора мешается и общая загадочность экселевских драйверов).
Единственный случай когда DSN и DRIVER должны появляться вместе это в момент создания DSN и все.
...
Рейтинг: 0 / 0
Создание ODBC DSN источников - как правильно ?
    #35221767
kefi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White OwlУбери из strConn указание драйвера:
StrCnn = "DSN=TestExcel;Dbq=C:\1\Книга1.XLS;"
И вообще никогда не указывай вместе DSN и DRIVER в одной строке коннекта. Либо то, либо другое. Но никогда вместе. Во первых, это бессмысленно - DSN хранит имя драйвера внутри себя в любом случае. Во вторых, сам себя запутаешь - какой драйвер в реальности будет использован? В третьих, на некоторых версиях драйвера можем получить наблюдаемую тобой картинку (там еще сборщик мусора мешается и общая загадочность экселевских драйверов).
Единственный случай когда DSN и DRIVER должны появляться вместе это в момент создания DSN и все.

Да , вроде так все, спасибо. Только это не только с Excel'ским драйвером наблюдалось.
А как несчет ";DriverId=790" - это тоже нужно выкинуть при коннекте, а при создании DSN оставить ?

PS. Кстати, насчет того - зачем DSN - вот только что обнвружил фишку, когда ODBC DSN и ODBC DSN-Less Connections работают совершенно по разному. по одному и тому же запросу (- тот же Excel)
...
Рейтинг: 0 / 0
Создание ODBC DSN источников - как правильно ?
    #35221787
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: kefi
> PS. Кстати, насчет того - зачем DSN - вот только что обнвружил фишку,
> когда ODBC DSN и ODBC DSN-Less Connections работают совершенно по разному.
> по одному и тому же запросу (- тот же Excel)

Т.е. ты хочешь сказать что select * from sheet_name вернет разные данные?
=-O
Не верю! (С)

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Создание ODBC DSN источников - как правильно ?
    #35221820
kefi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторЕдинственный случай когда DSN и DRIVER должны появляться вместе это в момент создания DSN и все.
Так и там тоже вроде как необязательно, Там же отдельным параметром драйвер передается -sDriver в моем примере

Игорь Горбонос
> Автор: kefi
> PS. Кстати, насчет того - зачем DSN - вот только что обнвружил фишку,
> когда ODBC DSN и ODBC DSN-Less Connections работают совершенно по разному.
> по одному и тому же запросу (- тот же Excel)

Т.е. ты хочешь сказать что select * from sheet_name вернет разные данные?
=-O
Не верю! (С)

я тоже по поводу этог запроса не сомневаюсь , почти
а вот UPDATE в одном случае сработает, а в другом выдаст ошибку - обнаружилось , когда
обновлял я таким образом одну из двух связаных таблиц-именованнызх диапазонов в Excel.
...
Рейтинг: 0 / 0
Создание ODBC DSN источников - как правильно ?
    #35221835
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kefiТолько это не только с Excel'ским драйвером наблюдалось.Экселевский драйвер не единственный драйвер с повышеной глюкавостью :)

kefiА как несчет ";DriverId=790" - это тоже нужно выкинуть при коннекте, а при создании DSN оставить ?А это по желанию.... Либо там, либо там. Если оно и сохранено в DSN и указано в строке коннекта - указаное в строке имеет приоритет. Если в строке указать какой-то ключ дважды - играть будет первый, последующие будут проигнорированны.

kefiPS. Кстати, насчет того - зачем DSN - вот только что обнвружил фишку, когда ODBC DSN и ODBC DSN-Less Connections работают совершенно по разному. по одному и тому же запросу (- тот же Excel)Этого не может быть.
...
Рейтинг: 0 / 0
Создание ODBC DSN источников - как правильно ?
    #35221839
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kefi авторЕдинственный случай когда DSN и DRIVER должны появляться вместе это в момент создания DSN и все.
Так и там тоже вроде как необязательно, Там же отдельным параметром драйвер передается -sDriver в моем примереНу да, верно. В четвертом параметр SQLConfigDataSource указывать не нужно. Он все равно использует имя драйвера из третьего параметра. Но они ж "в одной команде" :)
...
Рейтинг: 0 / 0
Создание ODBC DSN источников - как правильно ?
    #35221871
kefi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White OwlЭтого не может быть.
НУ пришлось привести Доказательства - см в приложении.
...
Рейтинг: 0 / 0
Создание ODBC DSN источников - как правильно ?
    #35221951
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kefi White OwlЭтого не может быть.
НУ пришлось привести Доказательства - см в приложении.Ты не книгу показывай, ты показывай полную строку коннекта для обоих случаев и полностью весь DSN.
Не забывай, что у драйвера есть много разных параметров которые определяют его работу. Если этот параметр не задать - драйвер использует значение по умолчанию (это обычно и происходит в dsn-less работе). А при создании DSN'а ты все эти параметры можешь подправить и сохранить... и не всегда правка правильная :)
DSN это всего лишь метод сохранения параметров подключения к базе.
...
Рейтинг: 0 / 0
Создание ODBC DSN источников - как правильно ?
    #35222119
kefi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl kefi White OwlЭтого не может быть.
НУ пришлось привести Доказательства - см в приложении.Ты не книгу показывай, ты показывай полную строку коннекта для обоих случаев и полностью весь DSN.

Не понял?!
Все макросы и строки коннекта см в книге, ты что решил, что решил продемонстрировать свое умение создавать Excel'ские книжки ?
...
Рейтинг: 0 / 0
Создание ODBC DSN источников - как правильно ?
    #35222169
kefi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Что касается отличия свойств Cnn.Properties , то отличия DSN (Cnn) от DSN-LESS (Cnn2) у меня оказались следующие :
Properties (N,Name,Value):
9 Data Source Name TestExcel
86 Extended Properties DSN=TestExcel;DBQ=C:\Documents and Settings\kefi\Мои документы\Книга1.xls;Driver={Microsoft Excel Driver (*.xls)};DriverId=790;MaxBufferSize=2048;PageTimeout=5; DBQ=C:\Documents and Settings\kefi\Мои документы\Книга1.xls;Driver={Microsoft Excel Driver (*.xls)};DriverId=790;MaxBufferSize=2048;PageTimeout=5;

Cnn.Properties.Count = Cnn2.Properties.Count =92

Т.е. ничего влияющего на различие, а различие-то таково, что при DSN-LESS говорит, что запрос необновляемый, в отличие от DSN.
...
Рейтинг: 0 / 0
Создание ODBC DSN источников - как правильно ?
    #35225414
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kefi White Owl kefi White OwlЭтого не может быть.
НУ пришлось привести Доказательства - см в приложении.Ты не книгу показывай, ты показывай полную строку коннекта для обоих случаев и полностью весь DSN.

Не понял?!
Все макросы и строки коннекта см в книге, ты что решил, что решил продемонстрировать свое умение создавать Excel'ские книжки ?Нет, просто разбираться в макросах совершенно не привлекает :) К тому же, комментарии в модулях написанные по русски не читаются на нерусских виндах/офисе и очень раздражают.
kefi
Properties (N,Name,Value):
9 Data Source Name TestExcel
86 Extended Properties DSN=TestExcel;DBQ=C:\Documents and Settings\kefi\Мои документы\Книга1.xls;Driver={Microsoft Excel Driver (*.xls)};DriverId=790;MaxBufferSize=2048;PageTimeout=5; DBQ=C:\Documents and Settings\kefi\Мои документы\Книга1.xls;Driver={Microsoft Excel Driver (*.xls)};DriverId=790;MaxBufferSize=2048;PageTimeout=5;ээээ??? Расшифруй.
Можешь написать вот так: для dsn-less строка коннекта = "...."
Для dsn строка коннекта = "..." и отдельно содержимое dsn если выгрузить его из регистри через regedit?
Вот тогда можно будет разобраться в чем же там отличие...
...
Рейтинг: 0 / 0
Создание ODBC DSN источников - как правильно ?
    #35225678
kefi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl> Нет, просто разбираться в макросах совершенно не привлекает :) К тому же, комментарии в модулях написанные по русски не читаются на нерусских виндах/офисе и очень раздражают. >
А если скопировать в редактор Far'а ?

Впрочем , если дело только в комментариях. вот пожалуйста, что в этих макросах.

Код: 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.
Private Declare Function SQLConfigDataSource Lib "ODBCCP32.DLL" (ByVal hwndParent As Long, ByVal fRequest As Long, ByVal lpszDriver As String, ByVal lpszAttributes As String) As Long

' Перед вызовом удалить DSN TestExcel, если он есть
Function ExecTest()
Dim Cnn As ADODB.Connection, Cmd As ADODB.Command
Dim StrCnn As String

Set Cnn = New ADODB.Connection
' Какой-ни реальный XLS файл :
ThisName = ThisWorkbook.Path & "\" & ThisWorkbook.Name
' Этот пройдет :
'StrCnn = "DSN=TestExcel;Driver={Microsoft Excel Driver (*.xls)};" & _
         "DriverId=790;Dbq=" & ThisName & ";"
' а здесь ошибка будет:
StrCnn = "Driver={Microsoft Excel Driver (*.xls)};" & _
         "DriverId=790;Dbq=" & ThisName & ";"

Cnn.ConnectionString = StrCnn
Cnn.Open
Set Cmd = New ADODB.Command
Set Cmd.ActiveConnection = Cnn
Cmd.CommandType = adCmdText
Cmd.CommandText = "UPDATE Tbl1 SET h1=2"
Cmd.Execute
End Function

' Перед вызовом удалить DSN TestExcel, если он есть
Function CreateDSNTest() As Object
Dim Cnn As ADODB.Connection
Set Cnn = New ADODB.Connection
Dim StrCnn As String, drvName As String
' попытка коннекта (считая , что DSN is valid ) --------------
On Error GoTo ErrH
Set Cnn = New ADODB.Connection
' Какой-ни реальный SLS файл :
ThisName = ThisWorkbook.Path & "\" & ThisWorkbook.Name
StrCnn = "DSN=TestExcel;Driver={Microsoft Excel Driver (*.xls)};" & _
         "DriverId=790;Dbq=" & ThisName & ";"
Cnn.ConnectionString = StrCnn
Cnn.Open
Set Cmd = New ADODB.Command
Set Cmd.ActiveConnection = Cnn
Cmd.CommandType = adCmdText
Cmd.CommandText = "CREATE " + Str1 + " " + Str2
Cmd.Execute
Set CreateDSNTest = Cnn
Exit Function ' -->>' выход при удаче -->>

ErrH:  '  ошибка из-за отсутствия DSN или по другим причинам
Debug.Print Cnn.State, Err.Description, Cnn.Errors.Count

' Если этого (или Set Cnn=Nothing) не сделать, в след функции невозможно будет с 1 раза
' протестировать DSN (придется делать от 100 до 1000 попыток ) :
'Set Cnn = New ADODB.Connection  ' ни On Error Goto 0 ни Err.Clear, Cnn.Errors.Clear - не помогают !
'On Error GoTo 0
'Err.Clear
'Cnn.Errors.Clear

' неудача из-за того, что  DSN не создан - попытка создания DSN ---------------
drvName = "Microsoft Excel Driver (*.xls)"
CreateDSN StrCnn, drvName, ,  4 

' DSN удачно создан - Вторая и Последняя попытка коннекта после свежесозданного DSN
Set Cnn = New ADODB.Connection ' елси этого не сделать, то будет в след строке ошибка
Cnn.ConnectionString = StrCnn
Cnn.Open
Set CreateDSNTest = Cnn

End Function
Function CreateDSN(StrCnn As String, _
              Optional sDriver As String = "", _
              Optional hWnd As Long =  0 &, _
              Optional Oper As Long =  4 ) As Long
'ODBC_ADD_SYS_DSN = 4

Dim sCnn As String, TestCnn As ADODB.Connection, i  As Long, intRet As Long, sa() As String

'Set the attributes delimited by null. See driver documentation for a complete list of supported attributes.
sa = Split(StrCnn, ";")
sCnn = "": StrCnn = ""
For i =  0  To UBound(sa)
 sCnn = sCnn & IIf(i =  0 , "", Chr$( 0 )) & sa(i)
 If Not UCase(Left(sa(i),  7 )) = "DRIVER=" Then
 ' sCnn = sCnn & IIf(i = 0, "", Chr$(0)) & sa(i)
  StrCnn = StrCnn & IIf(i =  0 , "", ";") & sa(i)
 End If
Next i
If Right(StrCnn,  1 ) <> ";" Then StrCnn = StrCnn & ";"

intRet = SQLConfigDataSource(hWnd, Oper, sDriver, sCnn) ' sDriver

CreateDSN = IIf(intRet,  1 , - 1 )

If CreateDSN = - 1  Then ' Сюда в тесте никогда не приходим
 Err.Raise vbObjectError +  1 , , "Ошибка при создании/модификации DSN"
Else
 i =  1 
 On Error GoTo  1 
  Set TestCnn = New ADODB.Connection
  TestCnn.Open StrCnn
  TestCnn.Close
  Set TestCnn = Nothing
  Debug.Print "i=" & i
  Exit Function
 1 :             ' вот здесь может накручивать счетчки до 9000 ( это от 100 до 1000 msec)
 i = i +  1 
 Resume
End If
End Function


Я сравнил Properties для одного коннекта с DSN (Cnn ) и другого без DSN (Cnn2) и получил различие всего в двух местах с Index=9 и Index=86 :
Нижн приведены Index, Name и VAlue свойства Properties для Cnn и Cnn2
Index Name Value VAlueCnn2 :

9 Data Source Name TestExcel <ЗдесьПустодляCnn2>
86 Extended Properties DSN=TestExcel;DBQ=C:\Documents and Settings\kefi\Мои документы\Книга1.xls;Driver={Microsoft Excel Driver (*.xls)};DriverId=790;MaxBufferSize=2048;PageTimeout=5;

Для Cnn2: DBQ=C:\Documents and Settings\kefi\Мои документы\Книга1.xls;Driver={Microsoft Excel Driver (*.xls)};DriverId=790;MaxBufferSize=2048;PageTimeout=5;
...
Рейтинг: 0 / 0
Создание ODBC DSN источников - как правильно ?
    #35225686
kefi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ну и :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Windows Registry Editor Version  5 . 00 

[HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI\TestExcel]
"Driver"="C:\\WINNT\\system32\\odbcjt32.dll"
"DBQ"="C:\\Documents and Settings\\kefi\\Мои документы\\Книга1.xls"
"DriverId"=dword: 00000316 
"SafeTransactions"=dword: 00000000 
"UID"=""

[HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI\TestExcel\Engines]

[HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI\TestExcel\Engines\Excel]
"Driver"="{Microsoft Excel Driver (*.xls)}"
"ImplicitCommitSync"=""
"Threads"=dword: 00000003 
"UserCommitSync"="Yes"
"FirstRowHasNames"=hex: 01 
...
Рейтинг: 0 / 0
Создание ODBC DSN источников - как правильно ?
    #35225742
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kefiну и :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Windows Registry Editor Version  5 . 00 

[HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI\TestExcel]
"Driver"="C:\\WINNT\\system32\\odbcjt32.dll"
"DBQ"="C:\\Documents and Settings\\kefi\\Мои документы\\Книга1.xls"
"DriverId"=dword: 00000316 
"SafeTransactions"=dword: 00000000 
"UID"=""

[HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI\TestExcel\Engines]

[HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI\TestExcel\Engines\Excel]
"Driver"="{Microsoft Excel Driver (*.xls)}"
"ImplicitCommitSync"=""
"Threads"=dword: 00000003 
"UserCommitSync"="Yes"
"FirstRowHasNames"=hex: 01 
Вооооот!
Видишь тут куча параметров дополнительных есть: SafeTransactions, Threads, FirstRowHasNames? А в dsn-less ты их не упоминаешь, зато указываешь лишние MaxBufferSize и PageTimeout... Чтобы коннект через dsn и dsn-less был совсем одинаковым, надо в dsn-less упомянуть ВСЕ параметры выставленные в DSN.
Пойми, что DSN это всего-лишь разбитая на пары и сохраненная в регистри dsn-less строка.

Самый простой способ сформировать правильную dsn-less строку коннекта это мышкой создать FileDSN, получишь тот же самый визард что и при создании системного или пользовательского dsn'а. Там надо повторить свой оригинальный DSN вплоть до каждого "самого незначительного" поля. Потом пойти в каталог где хранятся эти файловые dsn, и открыть его как обычный текстовый файл. Там будут пары ключ-значение на каждой строке. Склей все строки в одну разделяя пары через точку с запятой и получишь искомое.
...
Рейтинг: 0 / 0
25 сообщений из 28, страница 1 из 2
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Создание ODBC DSN источников - как правильно ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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