Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Падает ADO при exception / 21 сообщений из 21, страница 1 из 1
12.01.2004, 11:41
    #32372831
Stran9er
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Падает ADO при exception
Бьюсь несколько дней, не могу понять, в чем дело.
Следующий код прекрасно работает, если все хорошо.
Но если в процессе выполнения функций ADO возникает exception, по завершении функции main() вылетает сообщение:

---------------------------
Microsoft Visual C++
---------------------------
Unhandled exception in ADO.exe: 0xC0000005: Access Violation.
---------------------------
OK
---------------------------

Для возникновения exception достаточно изменить (LOCAL) в строке pConnection->ConnectionString на несуществующее имя компьютера.

Код: 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.
#import  "C:\Program Files\Common Files\System\ADO\msado15.dll"  \
    no_namespace rename( "EOF" ,  "EndOfFile" )

#include <stdio.h>
#include <conio.h>

// Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void PrintComError(_com_error &e);

///////////////////////////////////////////////////////////
//                                                       //
//      Main Function                                    //
//                                                       //
///////////////////////////////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    // Define Connection object pointer.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace
    _ConnectionPtr pConnection = NULL;
    _CommandPtr pCmd = NULL;
    _ParameterPtr pPrm = NULL;

    try
    {
        // Open a connection using OLE DB syntax.
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
        pConnection->ConnectionString =  "Provider=SQLOLEDB.1 ;Data Source=(LOCAL);Initial Catalog=Pubs;Integrated Security=SSPI";
        pConnection->Open( "","  ","  ",adConnectUnspecified);

        // Create Command object for stored procedure call
        TESTHR(pCmd.CreateInstance(__uuidof(Command)));
        pCmd->ActiveConnection = pConnection;
        pCmd->CommandText = " byroyalty ";

        // Define command parameter
        pPrm = pCmd->CreateParameter(" percentage ", adInteger, adParamInput, sizeof(long), (long)100 );
        pCmd->Parameters->Append(pPrm);

        // Execute stored procedure
        _RecordsetPtr pRs = pCmd->Execute(NULL, NULL, adCmdStoredProc);
        _bstr_t bstrAUID;

        while (!pRs->EndOfFile)
        {
            bstrAUID = pRs->Fields->GetItem("au_id ")->Value;
            printf(" %s\n ", (LPCSTR) bstrAUID);
    
            pRs->MoveNext();
        }

        // Cleanup objects before exit
        pRs->Close();
        pConnection->Close();
    }

    catch(_com_error &e)
    {
        PrintComError(e);
    }

    // Wait here for user to see the output..
    printf(" \nPress any key to continue... ");
    getch();

    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintComError Function                           //
//                                                       //
///////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());

    // Print Com errors.  
    printf(" Error\n ");
    printf(" \tCode = %08lx\n ", e.Error());
    printf(" \tCode meaning = %s\n ", e.ErrorMessage());
    printf(" \tSource = %s\n ", (LPCSTR) bstrSource);
    printf(" \tDescription = %s\n", (LPCSTR) bstrDescription);
}
...
Рейтинг: 0 / 0
12.01.2004, 14:10
    #32373106
Stran9er
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Падает ADO при exception
Может кто-нибудь проверить у себя выполнение этого кода?
Неужели у меня одного он падает?
Программа практически совпадает с примерами из MSDN.
Пожалуйста!
...
Рейтинг: 0 / 0
12.01.2004, 14:16
    #32373126
olk
olk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Падает ADO при exception
Все нормально - не падает
VC++ 6.0 +SP5
...
Рейтинг: 0 / 0
12.01.2004, 14:22
    #32373144
Stran9er
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Падает ADO при exception
olkВсе нормально - не падает
А если заменить
Код: plaintext
pCmd->CommandText =  "byroyalty" ;

на
Код: plaintext
pCmd->CommandText =  "_byroyalty" ;

?
...
Рейтинг: 0 / 0
12.01.2004, 14:41
    #32373181
ZrenBy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Падает ADO при exception
Нормально VS .NET 2003
Код: plaintext
1.
2.
3.
4.
5.
Error
        Code = 80040e14
        Code meaning = IDispatch error # 3092 
        Source = Microsoft OLE DB Provider for SQL Server
        Description = Could not find stored procedure '_byroyalty'
...
Рейтинг: 0 / 0
12.01.2004, 15:12
    #32373243
Tracer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Падает ADO при exception
Попробуй поставить последний MDAC
...
Рейтинг: 0 / 0
12.01.2004, 15:16
    #32373253
Stran9er
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Падает ADO при exception
ZrenByНормально VS .NET 2003
то есть при выходе из main() "Access violation" не вылез?
TracerПопробуй поставить последний MDAC
Стоит MDAC 2.8, VC 6.0 SP5, MS SQL Server 2000 Developer Edition SP3a
...
Рейтинг: 0 / 0
12.01.2004, 15:30
    #32373291
Tracer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Падает ADO при exception
VC 6.0 SP3, MDAC 2.7, Win2000 SP2, MSSQL 2000 SP2
Всё работает
...
Рейтинг: 0 / 0
12.01.2004, 15:34
    #32373300
Tracer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Падает ADO при exception
Кстати мысля,

Попробуй

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
    // Define Connection object pointer.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace
    _ConnectionPtr pConnection = NULL;
    _CommandPtr pCmd = NULL;
    _ParameterPtr pPrm = NULL;

    try
    {

заменить на

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
    try
    {
        // Define Connection object pointer.
        // Initialize pointers on define.
        // These are in the ADODB::  namespace
        _ConnectionPtr pConnection = NULL;
        _CommandPtr pCmd = NULL;
        _ParameterPtr pPrm = NULL;


Возможно дело в вызове CoUninitialize до деструктора твоих ADO,шных оьъектов
...
Рейтинг: 0 / 0
12.01.2004, 15:41
    #32373314
Stran9er
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Падает ADO при exception
Tracer
Возможно дело в вызове CoUninitialize до деструктора твоих ADO,шных оьъектов

Попробовал.
Исключение ловится первым catch, то есть проблема не в деструкторе.

В основной программе, в которой были замечены проблемы, действия с ADO производятся в функции, декларированной так:
Код: plaintext
1.
BOOL CDBStorage::GetApplicationID(const EL_APPINFO *pAppInfo, long &lApplicationID)

Так вот после вызова функции ADO, вызывающей исключение, pAppInfo получает некоторое новое значение, то есть pConnection->Open при возникновении в нем исключение портит стек.
Или я не прав?
...
Рейтинг: 0 / 0
12.01.2004, 15:49
    #32373334
Tracer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Падает ADO при exception
авторТак вот после вызова функции ADO, вызывающей исключение, pAppInfo получает некоторое новое значение, то есть pConnection->Open при возникновении в нем исключение портит стек.
Или я не прав?

Адназначна (с)
Всё таки советую переставить MDAC, попробуй перейти на 2.7
...
Рейтинг: 0 / 0
12.01.2004, 16:30
    #32373423
Stran9er
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Падает ADO при exception
TracerВсё таки советую переставить MDAC, попробуй перейти на 2.7
MDAC на понижение не ставится :(
...
Рейтинг: 0 / 0
12.01.2004, 16:42
    #32373443
Tracer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Падает ADO при exception
Посмотри ещё в MSDN Q173645
мож поможет
...
Рейтинг: 0 / 0
12.01.2004, 17:41
    #32373535
Stran9er
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Падает ADO при exception
TracerПосмотри ещё в MSDN Q173645
Читал, попробовал - не помогает.
К тому же там для OLE DB 1.1, а я 2.x использую.
...
Рейтинг: 0 / 0
12.01.2004, 18:20
    #32373585
Tracer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Падает ADO при exception
Скачай с http://www.microsoft.com/data/download.htm
MDAC Utility: Component Checker Version 2.7
вроде он поможет деинсталлировать MDAC
...
Рейтинг: 0 / 0
13.01.2004, 10:44
    #32373982
Stran9er
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Падает ADO при exception
2olk:
ZrenBy:
Tracer:

Немного поменял код, перенес работу с ADO в функцию.
Пожалуйста, скомпилируйте у себя проект в debug и release версиях.
И вышлите мне весь проект (*.cpp, *.dsp, *.exe) на ALegkikh_at_yandex.ru
Если не сложно.
Заранее спасибо.

Код: 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.
#import  "C:\Program Files\Common Files\System\ADO\msado15.dll"  \
    no_namespace rename( "EOF" ,  "EndOfFile" )

#include <stdio.h>
#include <conio.h>

// Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void PrintComError(_com_error &e);
void Test(void);

///////////////////////////////////////////////////////////
//                                                       //
//      Main Function                                    //
//                                                       //
///////////////////////////////////////////////////////////

void main()
{
	if(FAILED(::CoInitialize(NULL)))
		return;

	Test();

	// Wait here for user to see the output..
	printf( "\nTest completed OK!\n" );
	getch();

	::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//      Test Function                                    //
//                                                       //
///////////////////////////////////////////////////////////

void Test(void)
{
	// Define Connection object pointer.
	// Initialize pointers on define.
	// These are in the ADODB::  namespace
	_ConnectionPtr pConnection = NULL;
	_CommandPtr pCmd = NULL;
	_ParameterPtr pPrm = NULL;
	_RecordsetPtr pRs = NULL;

	try
	{
		// Open a connection using OLE DB syntax.
		TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
		printf( "ADO Version: %s\n\n" , (LPCSTR)pConnection->Version);
		pConnection->ConnectionString =  "Provider=SQLOLEDB.1 ;Data Source=(LOCAL);Initial Catalog=Pubs;Username=sa;Password=sa";
		pConnection->Open( "","  ","  ",adConnectUnspecified);

		// Create Command object for stored procedure call
		TESTHR(pCmd.CreateInstance(__uuidof(Command)));
		pCmd->ActiveConnection = pConnection;
		pCmd->CommandText = " byroyalty ";

		// Define command parameter
		pPrm = pCmd->CreateParameter(" percentage ", adInteger, adParamInput, sizeof(long), (long)100 );
		pCmd->Parameters->Append(pPrm);

		// Execute stored procedure
		pRs = pCmd->Execute(NULL, NULL, adCmdStoredProc);
		_bstr_t bstrAUID;

		while (!pRs->EndOfFile)
		{
			bstrAUID = pRs->Fields->GetItem("au_id ")->Value;
			printf(" %s\n ", (LPCSTR) bstrAUID);
    
			pRs->MoveNext();
		}

		// Cleanup objects before exit
		pRs->Close();
		pConnection->Close();
    }
	catch(_com_error &e)
	{
		PrintComError(e);
	}
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintComError Function                           //
//                                                       //
///////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());

    // Print Com errors.  
    printf(" Error\n ");
    printf(" \tCode = %08lx\n ", e.Error());
    printf(" \tCode meaning = %s\n ", e.ErrorMessage());
    printf(" \tSource = %s\n ", (LPCSTR) bstrSource);
    printf(" \tDescription = %s\n", (LPCSTR) bstrDescription);
}
...
Рейтинг: 0 / 0
13.01.2004, 10:57
    #32374005
ZrenBy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Падает ADO при exception
Вчера, в не помню какой книженции по С++, (мимоходом полистал)
видел странную конструкцию,
причем автор утверждает (просто утверждает),
что это подавляет ошибку связанную с адресацией (не понятно какую)
???

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
void main()
{
    // Обрамление ::CoInitialize(NULL) и дальнейшего кода скобками {} 
   {
      ::CoInitialize(NULL);
      // Тут код
   }

   ::CoUninitialize();
   return;
}


Может кто-нибудь прокоментировать эту конструкцию ?
...
Рейтинг: 0 / 0
13.01.2004, 13:47
    #32374359
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Падает ADO при exception
Я может.

Скобки ограничивают область жизни. Возможно так...
У меня, кстати, тоже были проблемы с.
...
Рейтинг: 0 / 0
13.01.2004, 14:43
    #32374477
olk
olk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Падает ADO при exception
Я еще встречал вот такую интересную конструкцию

Код: plaintext
1.
2.
3.
struct InitOle {
  InitOle()  { ::CoInitialize(NULL); }
  ~InitOle() { ::CoUninitialize();   }
} _init_InitOle_; 


объявляется глобально в файле с функцией main
...
Рейтинг: 0 / 0
14.01.2004, 14:18
    #32375741
Stran9er
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Падает ADO при exception
Я победил!

В папке %ProgramFiles%\Microsoft Visual Studio\VC98\Bin есть файл с2.dll.
Как я выяснил, c2.dll идет с Processor Pack.
У меня стоял Processor Pack 5, в котором c2.dll имеет версию 13.0.9044.0.
При замене файла c2.dll на более раннюю версию, проблемы исчезают.
Например, на Processor Pack 4, в котором c2.dll имеет версию 13.0.8943.0.

Всем спасибо за участие и помощь!
...
Рейтинг: 0 / 0
14.01.2004, 14:57
    #32375817
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Падает ADO при exception
Осознал.

Похоже действительно область ограничивыют. Причём как снизу, так и сверху.

Не, даже не так...
Вот как:
Открывающая скобка, возможно загоняет в стек все внескобковые переменные - видимо мешают.
А!
Вот ещё на самом деле как.
::CoInitialize(NULL); - возможно создаёт и не убивает что-то в текущей области видимости. Наличие скобок даёт возможность загнать весь этот мусор в стек, который потом подохнет при выходе из скобок.

Тоже самое и с ::CoUninitialize();

(Ногами не пинать! )
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Падает ADO при exception / 21 сообщений из 21, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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