И снова ODBC и снова failed
Выдает мне моя откомпилированная прога "ODBC--connection to 'MYDSN' failed". Хотя при этом из VB-проекта все работает пучком.
DSN настроен на коннект к ORACLE базе. В настройках ODBC вроде все ок, так как другие проги работают нормально, исопльзуя этот же DSN ... да и эта работает и из VB, и из самого MDB, когда там открываю таблицк или выполняю запрос. А вот при запуске откомпилированной проги вот такая лажа случается.
Не бродил никто по этим граблям?
Бьюсь о грабли надцатый раз - пока не доходит "где я дурак".
Выдает мне моя откомпилированная прога "ODBC--connection to 'MYDSN' failed". Хотя при этом из VB-проекта все работает пучком.
DSN настроен на коннект к ORACLE базе. В настройках ODBC вроде все ок, так как другие проги работают нормально, исопльзуя этот же DSN ... да и эта работает и из VB, и из самого MDB, когда там открываю таблицк или выполняю запрос. А вот при запуске откомпилированной проги вот такая лажа случается.
Не бродил никто по этим граблям?
Попробуй устанавливать параметры DSN - соединения в момент подготовки строки коннекшна (тоесть, из кода). Если заработает - ищи баги в установке коннекта.
И ещё. Проверь параметры соединения на той машине, откуда валится прога. И параметры доступа пользователя по паролю и логину - часто из-за этого валится. Кроме того, проверь триггеры в самой БД - может они что-то блокируют.
Если совсем ничего не выйдет, возьми обработчик ошибок, описанный ранее в этом форуме (и не раз) и, применив его, найди место, где валится экзншник. Потом модифицируй обработчик, вернее, напиши на его основе трассер шагов, который будет документировать тебе каждый шаг в проблемной процедуре - по этим параметрам легко найдёшь место сбоя.
Обработчик ошибок хорошо расписан, в частности в http://forum.codenet.ru/showthread.php?threadid=15556&pagenumber=1
Из проекта запускаю по F5 - все работает.
Компилирую ехешник - фиг. Еррорр.
Обработка ошибок проводится. Сообщение Error 3151 "ODBC--connection to 'MYDSN' failed как раз отловлено по ON ERROR GOTO MYERRORHANDLE.
Место сбоя уже определили - любое обращение к внешней базе (прилинкованной таблице). Ставил в разных местах программы даже просто открытие внешней базы - сразу еррор.
Set db = OpenDatabase("MYDSN", False, True, "ODBC;UID=username;PWD=password;DSN=MYDSN")
???
Дык лажа в том, что не работает прога прямо на этой же машине, на которой я девелоплю. Вот что меня смущает.
Из проекта запускаю по F5 - все работает.
Компилирую ехешник - фиг. Еррорр.
Обработка ошибок проводится. Сообщение Error 3151 "ODBC--connection to 'MYDSN' failed как раз отловлено по ON ERROR GOTO MYERRORHANDLE.
Место сбоя уже определили - любое обращение к внешней базе (прилинкованной таблице). Ставил в разных местах программы даже просто открытие внешней базы - сразу еррор.
Set db = OpenDatabase("MYDSN", False, True, "ODBC;UID=username;PWD=password;DSN=MYDSN")
???
Стоп-стоп-стоп. Значит ты обращаешься не к объекту БД, а к прилинкованной таблице? А из какой БД она прилинкована?
Кстати, а какой протокол ODBC твой использует? Например, если к Sybase - БД коннектишися, есть возможность указания протокола. Так вот я с подобной бедой сталкивался, если не указывал жёсткое использование TCP IP
P.S. Попробуй отдебажить экзешник, если что. Описание дебага приводится в http://forum.codenet.ru/showthread.php?threadid=14831&highlight=Debag.Break где-то в конце.
Ошибка возникает при любом обращении к ODBC. При открытии бащы я не открываю никакие объекты.
Set db = OpenDatabase("MYDSN", False, True, "ODBC;UID=username;PWD=password;DSN=MYDSN")
Кстати, а какой протокол ODBC твой использует?
TCP/IP. Я конечно не знаю пока как указывать это напрямую из программы. Но сделал щас такую проверку. Открыл новый проект. И попробовал в нем просто открыть и закрыть базу вышеописанной коммандой. Откомпилировал, запустил prject.exe - все работает. В references использовал MICROSOFT DAO 3.6 библиотеку. Поставил ссылку на такую же библиотеку в глючащем проекте, откомпилировал, запустил - не работает.X)-
Стоп-стоп-стоп. Значит ты обращаешься не к объекту БД, а к прилинкованной таблице? А из какой БД она прилинкована?
Ошибка возникает при любом обращении к ODBC. При открытии бащы я не открываю никакие объекты.
Set db = OpenDatabase("MYDSN", False, True, "ODBC;UID=username;PWD=password;DSN=MYDSN")
Кстати, а какой протокол ODBC твой использует?
TCP/IP. Я конечно не знаю пока как указывать это напрямую из программы. Но сделал щас такую проверку. Открыл новый проект. И попробовал в нем просто открыть и закрыть базу вышеописанной коммандой. Откомпилировал, запустил prject.exe - все работает. В references использовал MICROSOFT DAO 3.6 библиотеку. Поставил ссылку на такую же библиотеку в глючащем проекте, откомпилировал, запустил - не работает.X)-
Ну с этого и надо было начинать... Я DAO уже года 3 не использую, ибо эта штука медленная и глючная - создавалась-то она когда ещё...
Используй ADO. Синтаксис практически тот же, но глюков гораздо меньше и работает быстрее на порядок...
Debug.Assert Trim(CustName) = "John Doe"
То есть ему нужно булевое выражение на вход. А у меня ошибка другого рода.
В общем попробовал - не ловит.
Хотя в общем то ошибку то я отлавливаю по ON ERROR GOTO MYERROR. Так что в чем проблема я знаю,где проблема я знаю. Круче отдебагить можно только каким-нибудь Soft-Iceом. А я пожалуй этим заниматься не стану :)
П поводу дебага...Debug.break я не нашел у себя в VB6, но есть debug.assert, для отлова ошибок. Она работает так
Debug.Assert Trim(CustName) = "John Doe"
То есть ему нужно булевое выражение на вход. А у меня ошибка другого рода.
В общем попробовал - не ловит.
Хотя в общем то ошибку то я отлавливаю по ON ERROR GOTO MYERROR. Так что в чем проблема я знаю,где проблема я знаю. Круче отдебагить можно только каким-нибудь Soft-Iceом. А я пожалуй этим заниматься не стану :)
А API-функцию нужную объявил? Честно говоря, я уже не помню, что там объявлять нужно, но помню, что после этого Debug.Break доступным становился...
А API-функцию нужную объявил? Честно говоря, я уже не помню, что там объявлять нужно, но помню, что после этого Debug.Break доступным становился...
Кстати, попробуй в проблемной процедуре отладчик конспектировщик поставить, который будет после каждого шага писать в текстовый файл строку и параметры переменных из неё. Иногда помогает здорово (мы так на предыдущей работе ловили ошибку, которая только у 1 из заказчиков только на 1 машине возникала и воспроизвести которую мы не моги никак, а договор требовал её устранить).
Кстати, попробуй в проблемной процедуре отладчик конспектировщик поставить
Ну это для меня ваще темный лес X)-
По поводу Debug.Break - прошелся по APi GUIDE - нету ничего похожего :(
Ну это для меня ваще темный лес X)-
По поводу Debug.Break - прошелся по APi GUIDE - нету ничего похожего :(
API
Public Declare Sub DebugBreak Lib "kernel32" Alias "DebugBreak" ()
Процедура дебага:
нужно включить библиотеку Microsoft Scripting Runtime
Dim LogFile As File 'МАХ файл лога
Dim FsO As New FileSystemObject 'МАХ ссылка на объект системной области файлов
Dim TxtStr As TextStream 'МАХ потолтк данных к/из файла(у)
Dim TextIn As String 'МАХ строка, которая будет писаться в лог-файл
Dim PathFile As String 'МАХ путь к файлу
Const NmeFil = "MyLog.log" 'МАХ имя лог-файла
PathFile = App.Path & "\" & Trim(NmeFil) 'МАХ полный путь к файлу
'МАХ ищем файл
If FsO.FileExists(PathFile) = False Then 'МАХ если файла нет, то создадим его
FsO.CreateTextFile (PathFile)
End If
Set LogFile = FsO.GetFile(PathFile) 'МАХ указываем файл
Set TxtStr = LogFile.OpenAsTextStream(ForReading) 'МАХ открываем файл на запись
TextIn = TxtStr.ReadAll 'МАХ получаем содержимое файла
'МАХ закрываем файл
TxtStr.Close
Set TxtStr = LogFile.OpenAsTextStream(ForWriting) 'МАХ открываем файл на запись
'МАХ формируем строку записи
TextIn = TextIn & vbCrLf & TextString
'МАХ пишем текст в файл
TxtStr.Write TextIn
'МАХ закрываем файл
TxtStr.Close
End Sub
Ну или приерно так. Файл получает на вход строку, которую нужно вписать в лог-файл. Вобщем, это так делается:
Строка 1
LogProsedure "Текст строки 1 и значения переменных"
Строка 2
LogProsedure "Текст строки 2 и значения переменных"
Строка 3
LogProsedure "Текст строки 3 и значения переменных"
и т.д.
End Sub
Потом открываешь лог-файл и смотришь, что у тебя в коде происходит.
Если не сможешь багу поймать - не парься - перейди на ADO. Но я всё же подозреваю, что бага в коде...
API
Public Declare Sub DebugBreak Lib "kernel32" Alias "DebugBreak" ()
За обьяву спасибо. Работает. Только видать мне че-т доставить нужно. Выполнил все по процедуре
1. В месте, где валиться, указать DebugBreak (API)
2. При компиляции указать Create Symbolic Debug Info в настройках проекта
3. Компилить в Native код
4. Запустить на выполнение
5. При появлении ошибки выбрать Cancel
6. После того, как попадёшь в ASM – редактор (сюшная среда), нажать 2 раза F11.
Дальше – по обстоятельствам (VB – код уже откроется)
Но после Cancel никуда не попадаю. Че доставить надо? Любой отладчик? Или с Win2000 че-т активировать нужно?
За обьяву спасибо. Работает. Только видать мне че-т доставить нужно. Выполнил все по процедуре
1. В месте, где валиться, указать DebugBreak (API)
2. При компиляции указать Create Symbolic Debug Info в настройках проекта
3. Компилить в Native код
4. Запустить на выполнение
5. При появлении ошибки выбрать Cancel
6. После того, как попадёшь в ASM – редактор (сюшная среда), нажать 2 раза F11.
Дальше – по обстоятельствам (VB – код уже откроется)
Но после Cancel никуда не попадаю. Че доставить надо? Любой отладчик? Или с Win2000 че-т активировать нужно?
Со средой программирования из пакета Visual Studio Visual C++ ставил? Или ты просто VB6.0 отдельно поставил?
Вобщем, нужно поставить Visual C++ (я был уверен, что он у тебя есть, так как его обычно все со "Студией" ставят). С++ должет быть установлен работать в режме стандартного отладчика среды (он по умолчанию так ставится). Проверь, стоит ли VC++.
А, кстати, почему так упорно не хочешь на ADO переходить?
Проверь, стоит ли VC++.
Дык канешна не стоит. Нафиг он мне нужен на компе, если я в нем нифига не рубаю :(
А, кстати, почему так упорно не хочешь на ADO переходить?
А что значит "переходить"? Сесть и за пару годиков переписать надцать работающих проектов?
В своих новых проектах юзаю ADO. А в старых - то что было изначально. Вот и маюсь, как те солдаты с танком из анекдота - настоящий секс ;)
А что значит "переходить"? Сесть и за пару годиков переписать надцать работающих проектов?
Или перевести проекты с DAO на ADO не проблема? Может есть хитрый способ?
Или перевести проекты с DAO на ADO не проблема? Может есть хитрый способ?
Так там же синтаксис одинаковый практически. В большинстве случаев нужно только библиотеки заменить и через поиск - замену DAO на ADO заменить в объявлениях. Ну и там Recordset на ADODB.Recordset. И всё. Я проект на 100 Мб в своё время на 2 часа на ADO с RDO перекинул.
Со средой программирования из пакета Visual Studio Visual C++ ставил? Или ты просто VB6.0 отдельно поставил?
Вобщем, нужно поставить Visual C++ (я был уверен, что он у тебя есть, так как его обычно все со "Студией" ставят). С++ должет быть установлен работать в режме стандартного отладчика среды (он по умолчанию так ставится). Проверь, стоит ли VC++.
А, кстати, почему так упорно не хочешь на ADO переходить?
Сейчас тоже использую ADO, но не скажу что одназначно лучшая библиотека, просто она другая, не DAO, а глюков и в ADO хватает (вчера вон с очередным познакомился), а DAO родная библиотека и она может кое что, чего не может универсальная ADO.
Кстати на счет будущего ADO - есть неутешительная информация. В свете дальнейшего внедрения и перехода на технологию .NET библиотеку ADO развивать дальше не будут и номер 2.8 судя по всему станет последним :(
Между прочим мелькала информация что и старичку SQL тоже скоро выпишут пропуск на кладбище. Якобы можно будет использовать средства Microsoft Common Language Runtime (CLR), которые позволяют программам, написанным на разных языках, обращаться к данным SQL Server. Во как...
Сейчас тоже использую ADO, но не скажу что одназначно лучшая библиотека, просто она другая, не DAO, а глюков и в ADO хватает (вчера вон с очередным познакомился), а DAO родная библиотека и она может кое что, чего не может универсальная ADO.
Кстати на счет будущего ADO - есть неутешительная информация. В свете дальнейшего внедрения и перехода на технологию .NET библиотеку ADO развивать дальше не будут и номер 2.8 судя по всему станет последним :(
Между прочим мелькала информация что и старичку SQL тоже скоро выпишут пропуск на кладбище. Якобы можно будет использовать средства Microsoft Common Language Runtime (CLR), которые позволяют программам, написанным на разных языках, обращаться к данным SQL Server. Во как...
А жаль... На наших глазах умирает целая эпоха...:{
А жаль... На наших глазах умирает целая эпоха...:{
Вынужден всех разочаровать. "ЭПОХА" не умрет джо тех пор, пока эта "ЭПАОХА" пашет. А пахать ей предстоит долго и упорно. По крайней мере те проги, которые у меня вертятся не будут на новом языке ни за что. Как пример - серваки, которые до сих пор COBOL вертят, написанный 50 лет назад. И спецу, который этого "старика" понимает, платят нефиговые бабки, что бы он время от времени вносил в эту рухлядь правки.
Так что возможно, лет эдак через 50 программерам на DAO тоже будут платить больше, чем всяким там кул-хацкерам, пищущим на .NET версии 999 :-)
P.S. Кстати я так понимаю, мне предстоит стать кул-DAO-цкером ... проблем пока не решился :(
Мысли вслух - Вычера много думал. Понравилось. Сегодня буду думать еще....
Вынужден всех разочаровать. "ЭПОХА" не умрет джо тех пор, пока эта "ЭПАОХА" пашет. А пахать ей предстоит долго и упорно. По крайней мере те проги, которые у меня вертятся не будут на новом языке ни за что. Как пример - серваки, которые до сих пор COBOL вертят, написанный 50 лет назад. И спецу, который этого "старика" понимает, платят нефиговые бабки, что бы он время от времени вносил в эту рухлядь правки.
Так что возможно, лет эдак через 50 программерам на DAO тоже будут платить больше, чем всяким там кул-хацкерам, пищущим на .NET версии 999 :-)
P.S. Кстати я так понимаю, мне предстоит стать кул-DAO-цкером ... проблем пока не решился :(
Мысли вслух - Вычера много думал. Понравилось. Сегодня буду думать еще....
И что, даже дебаг экзешника не дал разультатов????:o
И что, даже дебаг экзешника не дал разультатов????:o
Ага. Проблема оказалась не в программе, а в коллизиях настроек ODBC.
Все оказалось довольно просто и сложно одновременно. Я еще не понял один момент до конца - как Аксес работает с ODBC. Не в общей схеме, а в тонкостях. Проблема оказалась в том, что в mdb для присоединенных таблиц был прописан Service Name оракла один, а в настройках DSN моего ODBC другой. Таким образом получалось, что мой DSN ODBC работает. А при обработке именно данного mdb на моей машине - ODBC Failed. Указав в настройках ODBC тот Service Name, который был прописан в mdb и создав такой Service Name через Oracle Network Assistant все заработало.
Осталось теперь разобраться какого фига Аксес хранит где-то то ли в базе, то ли в регестри то ли еще в какой-нибудь #$пе параметры ODBC, вместо того, чтобы брать их из настроек ODBC.