powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / VC++: OLEDB error
14 сообщений из 14, страница 1 из 1
VC++: OLEDB error
    #39411156
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть приложение, нормально компилируется под Win32 и работает.
Вызывает сторед процедуру и получает из нее значения.
Пытаюсь собрать под x64, на вызове процедуры - до сервера вызов не доходит, падает еще в atldbcli.h , пишет

Код: 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.
HRESULT Execute(
		_Outptr_opt_result_maybenull_ IUnknown** ppInterface,
		_In_opt_ DBPARAMS* pParams,
		_Inout_updates_opt_(ulPropSets) DBPROPSET *pPropSet,
		_Out_opt_ DBROWCOUNT* pRowsAffected,
		_In_ ULONG ulPropSets = 0) throw()
	{
		HRESULT hr;
		if (ppInterface)
			*ppInterface = NULL;

		// Specify the properties if we have some
		if (pPropSet)
		{
			// For backward compatibility, if the default parameter is not
			// specified, then set it to one if a property set exists
			if (ulPropSets == 0)
				ulPropSets = 1;

			CComPtr<ICommandProperties> spCommandProperties;
			hr = m_spCommand->QueryInterface(&spCommandProperties);
			if (FAILED(hr))
				return hr;

			hr = spCommandProperties->SetProperties(ulPropSets, pPropSet);
			if (FAILED(hr))
				return hr;
		}

		// If the user want the rows affected then return it back, otherwise
		// just point to our local variable here.
		DBROWCOUNT nAffected, *pAffected;
		if (pRowsAffected)
			pAffected = pRowsAffected;
		else
			pAffected = &nAffected;

		if (UseMultipleResults())
		{
			hr = m_spCommand->Execute(NULL, __uuidof(IMultipleResults), pParams,
				pAffected, (IUnknown**)GetMultiplePtrAddress());

			if (SUCCEEDED(hr))
			{
				hr = GetNextResult(pAffected, false);
			}
			else
				// If we can't get IMultipleResults then just try to get IRowset
				hr = m_spCommand->Execute(NULL, GetIID(), pParams, pAffected,
					ppInterface);
		}
		else
		{
//--------------------------------------------------<-------------------------------------------------------!!!
			hr = m_spCommand->Execute(NULL, GetIID(), pParams, pAffected,
				ppInterface);
		}
		if (SUCCEEDED(hr))
			SetupOptionalRowsetInterfaces();

		return hr;
	}
};



Unhandled exception at 0x00007fff3fbe3f5a in app.exe: 0xC0000005: Access violation reading location 0x000000031006661e.


Где искать?
...
Рейтинг: 0 / 0
VC++: OLEDB error
    #39411165
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг ХупинГде искать?
Адрес 0x00007fff3fbe3f5a и далее вверх по стэку разве не самоочевидное место?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
VC++: OLEDB error
    #39411206
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovРолг ХупинГде искать?
Адрес 0x00007fff3fbe3f5a и далее вверх по стэку разве не самоочевидное место?..


не совсем очевидное

msvcrt.dll!00007fff3fbe3f5a()
[Frames below may be incorrect and/or missing, no symbols loaded for msvcrt.dll]
msdatl3.dll!00007fff1759abd0()
sqloledb.dll!00007ffefa2c8f4e()
sqloledb.dll!00007ffefa2c6d87()
sqloledb.dll!00007ffefa2c8cc6()
sqloledb.dll!00007ffefa263c30()
sqloledb.dll!00007ffefa264f76()
sqloledb.dll!00007ffefa2623ef()
sqloledb.dll!00007ffefa274be0()
sqloledb.dll!00007ffefa26c7db()
> sqloledb.dll!00007ffefa26e789()
myfunction()
...
Рейтинг: 0 / 0
VC++: OLEDB error
    #39411207
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, можно ли как-то включить лог оледб для приложения?
может там будут какие подробности
...
Рейтинг: 0 / 0
VC++: OLEDB error
    #39411235
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупинmyfunction()
Ну вот и смотри какой из указателей в твоей myfunction() примерно равен 0x000000031006661e.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
VC++: OLEDB error
    #39411469
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovРолг Хупинmyfunction()
Ну вот и смотри какой из указателей в твоей myfunction() примерно равен 0x000000031006661e.


Я ставлю сюда точку и вижу, что разруха здесь

Код: plaintext
1.
2.
3.
4.
5.
6.
else
		{
//--------------------------------------------------<-------------------------------------------------------!!!
			hr = m_spCommand->Execute(NULL, GetIID(), pParams, pAffected,
				ppInterface);
		}
...
Рейтинг: 0 / 0
VC++: OLEDB error
    #39411510
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупинвижу, что разруха здесь
"Разруха начинается в головах, а не туалетах." (с)

Повторяю ещё раз, медленно: смотри какой из указателей в этом месте примерно равен
0x000000031006661e.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
VC++: OLEDB error
    #39411580
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovРолг Хупинвижу, что разруха здесь
"Разруха начинается в головах, а не туалетах." (с)

Повторяю ещё раз, медленно: смотри какой из указателей в этом месте примерно равен
0x000000031006661e.


да понял я, понял (ц) ищу

при подготовке выполнения процедуры, при установке параметров,
использую такой хелпер, он в 32бит работает, может он в 64бит пробивает по памяти?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
HRESULT SetLongData(TheBIND *pBind,long lData,long *plOffset)
		{
			HRESULT hr = S_OK;
			DBSTATUS dbStatus = DBSTATUS_S_OK;
			pBind->Clear();

			m_Datas.AddBYTES((BYTE *)(&lData),sizeof(lData));
			m_Datas.AddBYTES((BYTE*)(&dbStatus),sizeof(dbStatus));
			pBind->dbColumnSize = sizeof(lData);

			pBind->dbType = DBTYPE_I4; // <------------------??
			pBind->lDataOffset = *plOffset;
			(*plOffset)+=sizeof(lData);
			pBind->lStatusOffset = *plOffset;
			(*plOffset)+=sizeof(dbStatus);
			return S_OK;
		}
...
Рейтинг: 0 / 0
VC++: OLEDB error
    #39411595
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И такой класс, в предыдущем коде используется

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
class CMyByteArray : public CAtlArray<BYTE> 
{
public:
	size_t AddBYTES(BYTE *pData,size_t size)
	{
		if(pData==NULL || size==0)
			return GetCount();
		size_t Old = GetCount();
		SetCount(Old+size);
		memcpy(GetData()+Old,pData,size);
		return GetCount();
	}
};
...
Рейтинг: 0 / 0
VC++: OLEDB error
    #39412150
Коваленко Дмитрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупинпри подготовке выполнения процедуры, при установке параметров,
использую такой хелпер, он в 32бит работает, может он в 64бит пробивает по памяти?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
HRESULT SetLongData(TheBIND *pBind,long lData,long *plOffset)
		{
			HRESULT hr = S_OK;
			DBSTATUS dbStatus = DBSTATUS_S_OK;
			pBind->Clear();

			m_Datas.AddBYTES((BYTE *)(&lData),sizeof(lData));
			m_Datas.AddBYTES((BYTE*)(&dbStatus),sizeof(dbStatus));
			pBind->dbColumnSize = sizeof(lData);

			pBind->dbType = DBTYPE_I4; // <------------------??
			pBind->lDataOffset = *plOffset;
			(*plOffset)+=sizeof(lData);
			pBind->lStatusOffset = *plOffset;
			(*plOffset)+=sizeof(dbStatus);
			return S_OK;
		}



У lData должен быть тип DBLENGTH.
...
Рейтинг: 0 / 0
VC++: OLEDB error
    #39412409
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коваленко ДмитрийРолг Хупинпри подготовке выполнения процедуры, при установке параметров,
использую такой хелпер, он в 32бит работает, может он в 64бит пробивает по памяти?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
HRESULT SetLongData(TheBIND *pBind,long lData,long *plOffset)
		{
			HRESULT hr = S_OK;
			DBSTATUS dbStatus = DBSTATUS_S_OK;
			pBind->Clear();

			m_Datas.AddBYTES((BYTE *)(&lData),sizeof(lData));
			m_Datas.AddBYTES((BYTE*)(&dbStatus),sizeof(dbStatus));
			pBind->dbColumnSize = sizeof(lData);

			pBind->dbType = DBTYPE_I4; // <------------------??
			pBind->lDataOffset = *plOffset;
			(*plOffset)+=sizeof(lData);
			pBind->lStatusOffset = *plOffset;
			(*plOffset)+=sizeof(dbStatus);
			return S_OK;
		}



У lData должен быть тип DBLENGTH.

То есть этот подозрительный DBTYPE_I4 надо заменить на DBLENGTH?

Не сам же тип lData ?
HRESULT SetLongData(TheBIND *pBind,long lData,long *plOffset)
...
Рейтинг: 0 / 0
VC++: OLEDB error
    #39412419
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг ХупинКоваленко Дмитрийпропущено...


У lData должен быть тип DBLENGTH.

То есть этот подозрительный DBTYPE_I4 надо заменить на DBLENGTH?

Не сам же тип lData ?
HRESULT SetLongData(TheBIND *pBind,long lData,long *plOffset[/s])

Эта функция должна работать и в 32 бит, и в 64 бит варианте приложения.

DBLENGTH (=ULONGLONG) заменит long в обехи версиях при заталкивании его как массив байтов в бинд?
...
Рейтинг: 0 / 0
VC++: OLEDB error
    #39412784
Коваленко Дмитрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг ХупинРолг Хупинпропущено...


То есть этот подозрительный DBTYPE_I4 надо заменить на DBLENGTH?

Не сам же тип lData ?
HRESULT SetLongData(TheBIND *pBind,long lData,long *plOffset[/s])

Эта функция должна работать и в 32 бит, и в 64 бит варианте приложения.

DBLENGTH (=ULONGLONG) заменит long в обехи версиях при заталкивании его как массив байтов в бинд?

Это я затупил, думая, что lData это длина данных.

Так, давай вернемся к исходному коду:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
HRESULT SetLongData(TheBIND *pBind,long lData,long *plOffset)
		{
			HRESULT hr = S_OK;
			DBSTATUS dbStatus = DBSTATUS_S_OK;
			pBind->Clear();

			m_Datas.AddBYTES((BYTE *)(&lData),sizeof(lData)); //пишем ДАННЫЕ
			m_Datas.AddBYTES((BYTE*)(&dbStatus),sizeof(dbStatus)); //пишем СТАТУС данных
			pBind->dbColumnSize = sizeof(lData);

			pBind->dbType = DBTYPE_I4;
			pBind->lDataOffset = *plOffset; //смещение ДАННЫХ
			(*plOffset)+=sizeof(lData);
			pBind->lStatusOffset = *plOffset; //смещение СТАТУСА данных
			(*plOffset)+=sizeof(dbStatus);
			return S_OK;
		}



В 64-битной сборке, DBSTATUS - 64-битное число.

По хорошему, чтобы не возникало проблем с выравниванием данных, лучше сначала записать статус, а потом данные.

Это при условии, что начальное значение (*plOffset) делится на sizeof(DBSTATUS).

Если не делится, сделать так чтобы делилось - то есть надо в m_Datas набить нужное количество нулей.

Я так понимаю значение (*plOffset) совпадает с количество байт в m_Datas? Если да, то зачем нужно это дублирование? Я бы от этого plOffset избавился.

Как-то вот так:
Код: 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.
class CMyByteArray : public CAtlArray<BYTE> 
{
public:
	size_t AddBYTES(BYTE *pData,size_t size)
	{
		if(pData==NULL || size==0)
			return GetCount();
		size_t Old = GetCount();
		SetCount(Old+size);
		memcpy(GetData()+Old,pData,size);
		return GetCount();
	}
};

HRESULT SetLongData(TheBIND *pBind,long lData,long *plOffset)
{
 DBSTATUS dbStatus = DBSTATUS_S_OK;
 pBind->Clear();

 //Выравнивание
 if(/*long*/size_t x=(*plOffset)%sizeof(DBSTATUS))
 {
  x=sizeof(DBSTATUS)-x;

  m_Datas.AddBYTES(/*мусор!*/(BYTE*)(&dbStatus),x);

  (*plOffset)+=x;
 }

 pBind->dbType = DBTYPE_I4;
 pBind->dbColumnSize = sizeof(lData);

 pBind->lStatusOffset = (*plOffset);
 m_Datas.AddBYTES((BYTE*)(&dbStatus),sizeof(dbStatus));
 (*plOffset)+=sizeof(dbStatus);

 pBind->lStatusOffset = (*plOffset);
 m_Datas.AddBYTES((BYTE *)(&lData),sizeof(lData));
 (*plOffset)+=sizeof(lData);

 return S_OK;
}


В остальном, если не напрягаться насчет качества в целом, вроде все в норме.
...
Рейтинг: 0 / 0
VC++: OLEDB error
    #39412786
Коваленко Дмитрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таки накосячил с копированием:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
 //....
 pBind->lDataOffset= (*plOffset); // <---- lDataOffset
 m_Datas.AddBYTES((BYTE *)(&lData),sizeof(lData));
 (*plOffset)+=sizeof(lData);

 return S_OK;
}
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / VC++: OLEDB error
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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