Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Создание ODBC DSN источников - как правильно ? / 25 сообщений из 28, страница 1 из 2
26.03.2008, 11:55
    #35214353
kefi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание ODBC DSN источников - как правильно ?
Создаю 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
26.03.2008, 13:21
    #35214723
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание ODBC DSN источников - как правильно ?
Код: 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
26.03.2008, 13:22
    #35214725
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание ODBC DSN источников - как правильно ?
А лучше поставь DoEvents перед Open. А еще вместо OnError Goto 1 - Resume Next.
...
Рейтинг: 0 / 0
26.03.2008, 14:25
    #35215003
kefi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание ODBC DSN источников - как правильно ?
2 Antonariy
А лучше поставь DoEvents перед Open. А еще вместо OnError Goto 1 - Resume Next. >

За DoEvents спасибо, что вспомнил, а Resume Next не позволит мне после ошибки использовать Resume, т.к. Resume не в блоке обработки ошибок игнорируется.Но это к слову, хотелось-то другое -
не тестировать с помощью открытия TestCnn, а проверять - создан ли уже DSN или нет
...
Рейтинг: 0 / 0
26.03.2008, 14:45
    #35215083
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание ODBC DSN источников - как правильно ?
> Автор: 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
26.03.2008, 15:01
    #35215147
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание ODBC DSN источников - как правильно ?
kefiа Resume Next не позволит мне после ошибки использовать Resume, т.к. Resume не в блоке обработки ошибок игнорируется.Я имел ввиду On Error Resume NExt
...
Рейтинг: 0 / 0
26.03.2008, 15:26
    #35215240
kefi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание ODBC DSN источников - как правильно ?
[quot Игорь Горбонос ]

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

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

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

я понял. я именно на это и ответил.
...
Рейтинг: 0 / 0
26.03.2008, 16:45
    #35215513
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание ODBC DSN источников - как правильно ?
Во первых, вот эти две строки зачем? вот так не проще будет?
Код: 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
28.03.2008, 16:23
    #35221407
kefi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание ODBC DSN источников - как правильно ?
Прошу прощения, что удалось ответить только сейчас

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
28.03.2008, 16:24
    #35221416
kefi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание ODBC DSN источников - как правильно ?
Черт, текст в коде не выделился с сутью-то ;) ...
Вот он
'
Код: 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
28.03.2008, 16:29
    #35221435
kefi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание ODBC DSN источников - как правильно ?
Ну и еще раз уже вопрос :
Суть оказалась в выделенном тексте - кто-то может объяснить - почему же так? НУ была неудачная попытка использования DSN, еще ДО его создания, - ну и что , зачем Nothing в этот неудачный Connection Cnn класть для того, чтобы следующий совершенно отдельный Connection TestCnn мог выполнить с первого раза после создания DSN удачную попытку коннекта ?
Т.е. м.б. многопотоковости и нет при создании DSN, но как все-же объяснить феномен ?
...
Рейтинг: 0 / 0
28.03.2008, 17:56
    #35221666
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание ODBC DSN источников - как правильно ?
Убери из strConn указание драйвера:
StrCnn = "DSN=TestExcel;Dbq=C:\1\Книга1.XLS;"
И вообще никогда не указывай вместе DSN и DRIVER в одной строке коннекта. Либо то, либо другое. Но никогда вместе. Во первых, это бессмысленно - DSN хранит имя драйвера внутри себя в любом случае. Во вторых, сам себя запутаешь - какой драйвер в реальности будет использован? В третьих, на некоторых версиях драйвера можем получить наблюдаемую тобой картинку (там еще сборщик мусора мешается и общая загадочность экселевских драйверов).
Единственный случай когда DSN и DRIVER должны появляться вместе это в момент создания DSN и все.
...
Рейтинг: 0 / 0
28.03.2008, 18:46
    #35221767
kefi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание ODBC DSN источников - как правильно ?
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
28.03.2008, 19:00
    #35221787
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание ODBC DSN источников - как правильно ?
> Автор: kefi
> PS. Кстати, насчет того - зачем DSN - вот только что обнвружил фишку,
> когда ODBC DSN и ODBC DSN-Less Connections работают совершенно по разному.
> по одному и тому же запросу (- тот же Excel)

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

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

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

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

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

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

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

Не понял?!
Все макросы и строки коннекта см в книге, ты что решил, что решил продемонстрировать свое умение создавать Excel'ские книжки ?
...
Рейтинг: 0 / 0
29.03.2008, 01:21
    #35222169
kefi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание ODBC DSN источников - как правильно ?
Что касается отличия свойств 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
31.03.2008, 17:52
    #35225414
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание ODBC DSN источников - как правильно ?
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
31.03.2008, 19:32
    #35225678
kefi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание ODBC DSN источников - как правильно ?
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
31.03.2008, 19:36
    #35225686
kefi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание ODBC DSN источников - как правильно ?
ну и :
Код: 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
31.03.2008, 20:09
    #35225742
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание ODBC DSN источников - как правильно ?
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
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Создание ODBC DSN источников - как правильно ? / 25 сообщений из 28, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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