powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Не могу подключится к DB Access на С++.
23 сообщений из 23, страница 1 из 1
Не могу подключится к DB Access на С++.
    #33625217
Muromez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не могу подключитса к базе данных Access 2000 на С++ в VS6 . Мне надо в функции main() подключится к одной таблице и в thread-e к другой. В функции main()я смог подключить ADO object recordset а вот в thread тем же способом пытаюсь и не получается :( В чём может быть проблема? помогите пожалуста.
Вот код из main()

HRESULT hrU = S_OK;
_bstr_t strCnn1("Driver={Microsoft Access Driver (*.mdb)};Dbq=C:\\myfolder\\mydata.mdb;Uid=Admin;Pwd=;");

_RecordsetPtr pRstUsers = NULL;
hrU = pRstUsers.CreateInstance(__uuidof(Recordset));
if(FAILED(hrU))
{
printf("Failed creating record set instance for users\n");
return;
}
pRstUsers->Open("SELECT * FROM USERS", strCnn1, adOpenStatic,
adLockReadOnly, adCmdText);
pRstUsers->MoveFirst();

...
Рейтинг: 0 / 0
Не могу подключится к DB Access на С++.
    #33626394
ska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не уверен что помогу, но
1. действительно ли тот же код использовался из другой thread ?
2. не был ли уже открыт connection в первичной thread ?

просто вопросы для раздумья - с Access дела не имел, но в "embedded Oracle SQL" приходилось давать "exec sql enable threads" иначе не из первичной thread ничего зделать было невозможно.

К сожалению не сталкивался с ADO но думаю что все равно упрется в драйвера (ODBC?) лежащие под ним.
--
СК
...
Рейтинг: 0 / 0
Не могу подключится к DB Access на С++.
    #33627107
Teem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я тоже думаю, что без ODBC ничего не получится. Или нужно исползовать MFC оболочку. Я работал с Access только, через ODBC, потому как ADO на машине, где нужно было устанваливать программу - не заработала.
...
Рейтинг: 0 / 0
Не могу подключится к DB Access на С++.
    #33636654
Muromez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ODBC настроен так как в main()-е я подключаюсь к базе. Проблема только в threade.
1. действительно ли тот же код использовался из другой thread ?
Да. Я тот же код использывал в в threade что был в main()-e
2. не был ли уже открыт connection в первичной thread ?
я пытался открывать connection в threade и не открывать. Всё равно не работает.
...
Рейтинг: 0 / 0
Не могу подключится к DB Access на С++.
    #33636793
roman10
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MuromezВ функции main()я смог подключить ADO object recordset а вот в thread тем же способом пытаюсь и не получается
В каком смысле не получается? В чем это выражается? В случае ошибок VC-ная обертка над COM объектами выкидывает ислкючения _com_error. Вам нужно поймать его и выудить сообщение об ошибке.

Может также, стоит отказаться от использования ODBC и юзать OLE DB. Т.е. изменить строку подключения на "Provider=Microsoft.Jet.OLEDB.4.00; Data Source=Database.mdb".
...
Рейтинг: 0 / 0
Не могу подключится к DB Access на С++.
    #33637314
Muromez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В threade _com_error
вот такие ошибки
printf("Code meaning = %s\n", (char*) e.ErrorMessage()); Invalid pointer
printf("Source = %s\n", (char*) e.Source()); Null
В задаче сказано использовать в Threade один обьект АДО, тут надо использовать функции CriticalSection. Но я даже, при использование ADO обьектами(чтоб избежать RaceCondition взаимное сотязание) для каждого thread-a использываю локальные обьекты каждого thread-a и всё равно не принемаю параметры из таблицы.
...
Рейтинг: 0 / 0
Не могу подключится к DB Access на С++.
    #33637372
Muromez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вопрос такой. Можно использывать эту функцию pRstTable->Open(...)несколько раз подряд?
...
Рейтинг: 0 / 0
Не могу подключится к DB Access на С++.
    #33637488
roman10
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Похоже, что pRstUsers у вас - нулевой указатель. Проверьте его значение. В каком месте возникает исключение?

авторВ задаче сказано использовать в Threade один обьект АДО, тут надо использовать функции CriticalSection.
Один объект на поток или на всю программу?

авторВопрос такой. Можно использывать эту функцию pRstTable->Open(...)несколько раз подряд?
Если предварительно вызывать Close, то можно.
...
Рейтинг: 0 / 0
Не могу подключится к DB Access на С++.
    #33637566
Muromez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Один объект на поток или на всю программу?.
Oдин обьект на поток thread.
...
Рейтинг: 0 / 0
Не могу подключится к DB Access на С++.
    #33637642
Muromez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторВопрос такой. Можно использывать эту функцию pRstTable->Open(...)несколько раз подряд?
Если предварительно вызывать Close, то можно.[/quot]

Все таблицы или достаточно той на которую я буду снова делать Open.
...
Рейтинг: 0 / 0
Не могу подключится к DB Access на С++.
    #33637701
roman10
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторOдин обьект на поток thread.
Тогда критические секции ни к чему.

авторВсе таблицы или достаточно той на которую я буду снова делать Open.
Той, на которой снова будет Open. А точнее не таблицы, а рекордсета.

Как там дела с указателем то? Решилась проблема?
...
Рейтинг: 0 / 0
Не могу подключится к DB Access на С++.
    #33637744
Muromez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
roman10 авторOдин обьект на поток thread.
Тогда критические секции ни к чему.

авторВсе таблицы или достаточно той на которую я буду снова делать Open.
Той, на которой снова будет Open. А точнее не таблицы, а рекордсета.

Как там дела с указателем то? Решилась проблема?

Ошибку больше не выдаёт, но я не могу понять почему мой pRstReport которому я делаю Open() Close() в thread-e. Не принемает рекордсет.
...
Рейтинг: 0 / 0
Не могу подключится к DB Access на С++.
    #33637799
Muromez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
По поводу критической секции. Main() делает Select * From Users, по каждому юзеру создаём Thread() у юзера есть ReportID. Thread должeн сделать Select * From Report WHERE ReportID==UID. Связь между таблицами 1-N.
pRstReport (рекордсет) будет одновременно принемать разные значения. Тем более он один для всех Thread() . Но даже когда у меня pRstReport для каждого Thread() он всё равно получает чёрт знает что :(
...
Рейтинг: 0 / 0
Не могу подключится к DB Access на С++.
    #33638028
roman10
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MuromezpRstReport (рекордсет) будет одновременно принемать разные значения. Тем более он один для всех Thread() . Но даже когда у меня pRstReport для каждого Thread() он всё равно получает чёрт знает что :(

Ну дык в чем проблема выражается то? Что конкртно получает pRstReport? Какие ошибки и где он выдает. И вообще код в студию. С "Invalid pointer" вы, как я понимаю, справились. А дальше в чем затык?
...
Рейтинг: 0 / 0
Не могу подключится к DB Access на С++.
    #33638370
Muromez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: 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.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
#import "C:\Program Files\Common Files\System\ado\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <stdio.h>
#include <windows.h>
#include <winbase.h>//critical 
#include <ole2.h>
#include <process.h>
#include "lock.h"

#include "criticalsection.h"

inline void TESTHR(HRESULT x){ if FAILED(x) _com_issue_error(x);};

CriticalSection myCriticalSection;
_ConnectionPtr  pConnection = NULL;
//connection string
_bstr_t strCnn("Driver={Microsoft Access Driver (*.mdb)};Dbq=C:\\myfolder\\mydata.mdb;Uid=Admin;Pwd=;");   
_bstr_t strSQL("SELECT * FROM REPORT");

int valReportId;

void ThreadProc(void* valReportId)
{
		
		char table[ 8 ]="<table>";
		char td[ 5 ]="<td>";
		char tr[ 5 ]="<tr>";
		char table_cls[ 9 ]="</table>";
		char td_cls[ 6 ]="</td>";
		char tr_cls[ 6 ]="</tr>";
        FILE *cfPtr;
		_RecordsetPtr pRstReport  = NULL;
		HRESULT hrR = S_OK;


        try
        {			
	
			TESTHR(pRstReport.CreateInstance(__uuidof(Recordset)));
                                      //Вот тут он не подключается к рекордсет 
			pRstReport->Open("SELECT * FROM REPORT", strCnn, adOpenStatic,
				adLockReadOnly, adCmdText);

			if((cfPtr = fopen("report.html","a+")) == NULL)
				printf("File could not opened!\n");
					fprintf(cfPtr,"%s", table);

	        pRstReport->MoveFirst();
			
            if(!pRstReport->EndOfFile)
            {
				while(!pRstReport->EndOfFile)
               {
					fprintf(cfPtr,"%s%s%s%s%s%s%s%s%s%s%s",tr,	
						    td, (char*) ((_bstr_t)
					pRstReport->GetFields()->GetItem("UID")->GetValue()), td_cls,
							td, (char*) ((_bstr_t)
					pRstReport->GetFields()->GetItem("DATA1")->GetValue()), td_cls,
							td, (char*) ((_bstr_t)
					pRstReport->GetFields()->GetItem("DATA2")->GetValue()), td_cls,
													tr_cls);
				               			
    	            //create table in file.htm

				  pRstReport->MoveNext();
				}			
			}		
			fprintf(cfPtr,"%s", table_cls);
			pRstReport->Close();
        }//try
	catch (_com_error &e)
	{
		printf("Error:\n");
		printf("Code = %08lx\n", e.Error());
		printf("Code meaning = %s\n", (char*) e.ErrorMessage());
		printf("Source = %s\n", (char*) e.Source());
		printf("Description = %s\n", (char*) e.Description());
	}

	pRstReport->Close();
	
	
}
////////////////////////////////////////////////////////////////////////////////////////////
//
//                           MAIN FUNCTION
//                
/////////////////////////////////////////////////////////////////////////////////////////////
void main()
{
	
	HRESULT hrU = S_OK;
	
	// Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _CommandPtr     pCmd  = NULL;
	_RecordsetPtr   pRstUsers = NULL;

	try {

		CoInitialize(NULL);
      //Create Recordsets object
      TESTHR(pRstUsers.CreateInstance(__uuidof(Recordset)));
	
	 //Open the Record set for getting records from Users table
     pRstUsers->Open("SELECT * FROM USERS", strCnn, adOpenStatic,
		  adLockReadOnly, adCmdText);

	 pRstUsers->MoveFirst();

	 //Loop through the Record set
    if (!pRstUsers->EndOfFile)
    {
       while(!pRstUsers->EndOfFile)
       { 


          valReportId = pRstUsers->Fields->GetItem("REPORTID")->Value.intVal;			  
          printf("ReportID:%d\n User:%s\n", valReportId,
			  									((char*) ( (_bstr_t)
					pRstUsers->GetFields()->GetItem("User")->GetValue()) ) );
			
		  if(_beginthread(ThreadProc, 0 ,(void*)valReportId)==- 1 )
		  {
            printf("Failed to create a thread\n");
            return;
		  }
				
          pRstUsers->MoveNext();
       }
	   pRstUsers->Close();
    }
	}//end try
	catch (_com_error &e)
	{
		printf("Error:\n");
		printf("Code = %08lx\n", e.Error());
		printf("Code meaning = %s\n", (char*) e.ErrorMessage());
		printf("Source = %s\n", (char*) e.Source());
		printf("Description = %s\n", (char*) e.Description());
	}

   CoUninitialize();
   return;
}
...
Рейтинг: 0 / 0
Не могу подключится к DB Access на С++.
    #33638414
NickG_a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Muromez как ты подрубил дллку?
у меня студия 2003 NET
...
Рейтинг: 0 / 0
Не могу подключится к DB Access на С++.
    #33638576
Muromez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
NickG_aMuromez как ты подрубил дллку?
у меня студия 2003 NET
Я включил поисковик и он мне нашёл в этой дериктории
C:\Program Files\Common Files\System\ado\msado15.dll
Как он там появился, я не знаю.
...
Рейтинг: 0 / 0
Не могу подключится к DB Access на С++.
    #33638663
NickG_a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вообщем я реализовал такие функции:
добавление новой записи, редактирование старых, удаление.
Ну это все сделал в один клас - там токо функционал.
Осталось токо реализовать интерфейс с пользователем.
Вот мой пример хотя он еще не оптимизирован(просто работает!)
если кому-то поможет


// Warehouse.р
#pragma once

struct Product
{
int Id;
LPCSTR Name;
float fCount;
LPCSTR Merka;
};

// CWarehouse

class CWarehouse
{
public:
CWarehouse();
virtual ~CWarehouse();
//Добавление определенного количества продукции с опред айдишником на склад
bool AddCount(int Id, float fCount);
//Добавление в каталог новой продукции
void Add(int Id,LPCSTR Name,float fCount,LPCSTR Merka);
//Возращает количество продукции на складе
float GetCount(int id);
//Забирает со склада продукцию с определенным индетификатором
bool DeletCount(int Id, float fCount);
//Удалеет полностью продукт из каталога
bool DeletProduct(int Id);
//Изменяем старый айди на новый
bool ChangeId(int oldId, int newId);
//Изменяем количество продукции
bool ChangefCount(int Id,float newfCount);
//Изменяем Имя
bool ChangeName(int Id, LPCSTR newName);
//Изменяем меру измерения продукта
bool ChangeMerka(int Id,LPCSTR newMerka);
//Вовращает продукт с определенным индентификатором
Product FindProduct(int Id);
};
------------------------------------------------------------------------------------
// Warehouse.cpp : implementation file
//
#include "stdafx.h"


#import "c:\Program Files\Common Files\system\ado\msadox.dll"
#import "c:\Program Files\Common Files\system\ado\msado15.dll"\
no_namespace rename("EOF", "EndOfFile")


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

#include "string.h. "

#include "stdafx.h"
#include "New.h"
#include "NewDlg.h"
#include "Warehouse.h"

inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};



// CWarehouse
CWarehouse::CWarehouse()
{
}

CWarehouse::~CWarehouse()
{
}

bool CWarehouse::DeletCount(int szId, float szfCount)
{
if(GetCount(szId)<=0)
{
AfxMessageBox("Недостаточно ресурсов для забора");
return false;
}
HRESULT hr = S_OK;

_ConnectionPtr pConnection = NULL;
_CommandPtr pCmd = NULL;

_bstr_t a;
_bstr_t arr=(_bstr_t)szfCount;
char *str=(char *)arr;
for(int i=0;i<strlen(str);i++)
{
if(str ==',')
{
str='.';
}
}

a+="UPDATE Sklad SET fCount = fCount-";
a+=str;
a+=" Where ID=";
a+=(_bstr_t)szId;
try
{
TESTHR(hr = pConnection.CreateInstance(__uuidof(Connection)));
TESTHR(hr = pCmd.CreateInstance(__uuidof(Command)));
pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;"
"data source=c:\\b.mdb;","","",NULL);
pCmd->CommandText =a;
pCmd->PutActiveConnection(_variant_t((IDispatch*)pConnection));
pCmd->Execute(NULL,NULL,adCmdText);
pConnection->Close();
return true;
}
catch(_com_error &e)
{
AfxMessageBox(e.Description());
return false;
}
}





bool CWarehouse::AddCount(int szId, float szfCount)
{
HRESULT hr = S_OK;

_ConnectionPtr pConnection = NULL;
_CommandPtr pCmd = NULL;

_bstr_t a;
_bstr_t arr=(_bstr_t)szfCount;
char *str=(char *)arr;
for(int i=0;i<strlen(str);i++)
{
if(str==',')
{
str='.';
}
}

a+="UPDATE Sklad SET fCount = fCount+";
a+=str;
a+=" Where Id = ";
a+=(_bstr_t)szId;
try
{
TESTHR(hr = pConnection.CreateInstance(__uuidof(Connection)));
TESTHR(hr = pCmd.CreateInstance(__uuidof(Command)));
pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;"
"data source=c:\\b.mdb;","","",NULL);
pCmd->CommandText =a;
pCmd->PutActiveConnection(_variant_t((IDispatch*)pConnection));
pCmd->Execute(NULL,NULL,adCmdText);
pConnection->Close();
return true;
}
catch(_com_error &e)
{
AfxMessageBox(e.Description());
return false;
}
}
void CWarehouse::Add(int szId,LPCSTR szName,float szfCount,LPCSTR szMerka)
{
HRESULT hr = S_OK;

_ConnectionPtr pConnection = NULL;
_CommandPtr pCmd = NULL;

//заменяем символ , на .
_bstr_t a;
_bstr_t arr=(_bstr_t)szfCount;
char *str=(char *)arr;
for(int i=0;i<strlen(str);i++)
{
if(str==',')
{
str='.';
}
}

a+="Insert Into Sklad (ID, Name, fCount, Merka) Values (";
a+=(_bstr_t)szId;
a+=",'";
a+=szName;
a+="',";
a+=str;
a+=",'";
a+=szMerka;
a+="')";
try
{
TESTHR(hr = pConnection.CreateInstance(__uuidof(Connection)));
TESTHR(hr = pCmd.CreateInstance(__uuidof(Command)));
pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;"
"data source=c:\\b.mdb;","","",NULL);
pCmd->CommandText =a; //например "INSERT INTO Sklad Values (11121,'1',1,'1')";
pCmd->PutActiveConnection(_variant_t((IDispatch*)pConnection));
pCmd->Execute(NULL,NULL,adCmdText);
}
catch(_com_error &e)
{
AfxMessageBox(e.Description());
}
pConnection->Close();
}

float CWarehouse::GetCount(int szId)
{
HRESULT hr = S_OK;
_RecordsetPtr pRst = NULL;
_ConnectionPtr pConnection = NULL;
_CommandPtr pCmd = NULL;
float res;

_bstr_t a;
a+="SELECT fCount FROM Sklad Where ID = ";
a+=(_bstr_t)szId;
try
{
TESTHR(hr = pConnection.CreateInstance(__uuidof(Connection)));
TESTHR(hr = pCmd.CreateInstance(__uuidof(Command)));
pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;"
"data source=c:\\b.mdb;","","",NULL);
pCmd->CommandText =a; //например "INSERT INTO Sklad Values (11121,'1',1,'1')";
pCmd->PutActiveConnection(_variant_t((IDispatch*)pConnection));
pRst=pCmd->Execute(NULL,NULL,adCmdText);
res=(float)pRst->Fields->GetItem("fCount")->Value;
}
catch(_com_error &e)
{
AfxMessageBox(e.Description());
return NULL;
}

pConnection->Close();
return res;
}

Product CWarehouse::FindProduct(int szId)
{
HRESULT hr = S_OK;
_RecordsetPtr pRst = NULL;
_ConnectionPtr pConnection = NULL;
_CommandPtr pCmd = NULL;
Product res;

_bstr_t a;
a+="SELECT * FROM Sklad Where ID = ";
a+=(_bstr_t)szId;
try
{
TESTHR(hr = pConnection.CreateInstance(__uuidof(Connection)));
TESTHR(hr = pCmd.CreateInstance(__uuidof(Command)));
pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;"
"data source=c:\\b.mdb;","","",NULL);
pCmd->CommandText =a; //например "INSERT INTO Sklad Values (11121,'1',1,'1')";
pCmd->PutActiveConnection(_variant_t((IDispatch*)pConnection));
pRst=pCmd->Execute(NULL,NULL,adCmdText);
res.Id=(int)pRst->Fields->GetItem("Id")->Value;
res.fCount=(float)pRst->Fields->GetItem("fCount")->Value;
res.Name=(_bstr_t)pRst->Fields->GetItem("Name")->Value;
res.Merka=(_bstr_t)pRst->Fields->GetItem("Merka")->Value;
}
catch(_com_error &e)
{
AfxMessageBox(e.Description());
}

pConnection->Close();
return res;
}

bool CWarehouse::DeletProduct(int Id)
{
HRESULT hr = S_OK;

_ConnectionPtr pConnection = NULL;
_CommandPtr pCmd = NULL;

_bstr_t a;


a+="DELETE FROM Sklad Where Id=";
a+=(_bstr_t)Id;
try
{
TESTHR(hr = pConnection.CreateInstance(__uuidof(Connection)));
TESTHR(hr = pCmd.CreateInstance(__uuidof(Command)));
pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;"
"data source=c:\\b.mdb;","","",NULL);
pCmd->CommandText =a;
pCmd->PutActiveConnection(_variant_t((IDispatch*)pConnection));
pCmd->Execute(NULL,NULL,adCmdText);
pConnection->Close();
return true;
}
catch(_com_error &e)
{
AfxMessageBox(e.Description());
return false;
}
}

bool CWarehouse::ChangeId(int oldId, int newId)
{
HRESULT hr = S_OK;

_ConnectionPtr pConnection = NULL;
_CommandPtr pCmd = NULL;

_bstr_t a;


a+="Update Sklad Set Id = ";
a+=(_bstr_t)newId;
a+=" Where Id = ";
a+=(_bstr_t)oldId;
try
{
TESTHR(hr = pConnection.CreateInstance(__uuidof(Connection)));
TESTHR(hr = pCmd.CreateInstance(__uuidof(Command)));
pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;"
"data source=c:\\b.mdb;","","",NULL);
pCmd->CommandText =a;
pCmd->PutActiveConnection(_variant_t((IDispatch*)pConnection));
pCmd->Execute(NULL,NULL,adCmdText);
pConnection->Close();
return true;
}
catch(_com_error &e)
{
AfxMessageBox(e.Description());
return false;
}
}


bool CWarehouse::ChangefCount(int Id,float newfCount)
{
HRESULT hr = S_OK;

_ConnectionPtr pConnection = NULL;
_CommandPtr pCmd = NULL;

_bstr_t a;
_bstr_t arr=(_bstr_t)newfCount;
char *str=(char *)arr;
for(int i=0;i<strlen(str);i++)
{
if(str==',')
{
str='.';
}
}

a+="Update Sklad Set fCount = ";
a+=str;
a+=" Where Id = ";
a+=(_bstr_t)Id;
try
{
TESTHR(hr = pConnection.CreateInstance(__uuidof(Connection)));
TESTHR(hr = pCmd.CreateInstance(__uuidof(Command)));
pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;"
"data source=c:\\b.mdb;","","",NULL);
pCmd->CommandText =a;
pCmd->PutActiveConnection(_variant_t((IDispatch*)pConnection));
pCmd->Execute(NULL,NULL,adCmdText);
pConnection->Close();
return true;
}
catch(_com_error &e)
{
AfxMessageBox(e.Description());
return false;
}
}

bool CWarehouse::ChangeName(int Id, LPCSTR newName)
{
HRESULT hr = S_OK;

_ConnectionPtr pConnection = NULL;
_CommandPtr pCmd = NULL;

_bstr_t a;


a+="Update Sklad Set Name = ";
a+=(_bstr_t)newName;
a+=" Where Id = ";
a+=(_bstr_t)Id;
try
{
TESTHR(hr = pConnection.CreateInstance(__uuidof(Connection)));
TESTHR(hr = pCmd.CreateInstance(__uuidof(Command)));
pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;"
"data source=c:\\b.mdb;","","",NULL);
pCmd->CommandText =a;
pCmd->PutActiveConnection(_variant_t((IDispatch*)pConnection));
pCmd->Execute(NULL,NULL,adCmdText);
pConnection->Close();
return true;
}
catch(_com_error &e)
{
AfxMessageBox(e.Description());
return false;
}
}

bool CWarehouse::ChangeMerka(int Id,LPCSTR newMerka)
{
HRESULT hr = S_OK;

_ConnectionPtr pConnection = NULL;
_CommandPtr pCmd = NULL;

_bstr_t a;


a+="Update Sklad Set Merka = ";
a+=(_bstr_t)newMerka;
a+=" Where Id = ";
a+=(_bstr_t)Id;
try
{
TESTHR(hr = pConnection.CreateInstance(__uuidof(Connection)));
TESTHR(hr = pCmd.CreateInstance(__uuidof(Command)));
pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;"
"data source=c:\\b.mdb;","","",NULL);
pCmd->CommandText =a;
pCmd->PutActiveConnection(_variant_t((IDispatch*)pConnection));
pCmd->Execute(NULL,NULL,adCmdText);
pConnection->Close();
return true;
}
catch(_com_error &e)
{
AfxMessageBox(e.Description());
return false;
}
}

// CWarehouse message handlers
...
Рейтинг: 0 / 0
Не могу подключится к DB Access на С++.
    #33638735
roman10
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хм, у меня все скомпилировалось и заработало...

Правда, два замечения.
1. Запустив дочерние потоки, вы не ждете в основном потоке их завершения. Это приводит к тому, что дочерние потоки прибиваются до того, как они успевают сформировать отчет. Если после запуска усыпить main на пару секунд, то все происходит нормально. Просто ждать в main, конечно, нехорошо, но вот я не знаю, есть ли какой аналог WaitForMultipleObjects в сишной библиотеке.

2. В ThreadProc в самом конце обнаружился лишний вызов pRstReport->Close(), который выкидывает необработанное исключение, благополучно грохая все приложение целиком.
...
Рейтинг: 0 / 0
Не могу подключится к DB Access на С++.
    #33638831
Muromez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
roman10Хм, у меня все скомпилировалось и заработало...

Правда, два замечения.
1. Запустив дочерние потоки, вы не ждете в основном потоке их завершения. Это приводит к тому, что дочерние потоки прибиваются до того, как они успевают сформировать отчет. Если после запуска усыпить main на пару секунд, то все происходит нормально. Просто ждать в main, конечно, нехорошо, но вот я не знаю, есть ли какой аналог WaitForMultipleObjects в сишной библиотеке.

2. В ThreadProc в самом конце обнаружился лишний вызов pRstReport->Close(), который выкидывает необработанное исключение, благополучно грохая все приложение целиком.

У тебя заработало в дочерних потоках pRstReport, смог ты сохранить данные в file.txt?

Усыплять main это не правильно, если у pRstReport будет очень много recordset и по времени дочерний поток не успеет закончить работу то будет столкновение между дочерними потоками. Тутнадо сделать так чтоб дочерний поток не начал работу пока предыдуший не закончит её. Ещё в задачи у меня было сказано не создавать в дочернем потоке АДО обьект а использовать один для всех дочерних потоках.
...
Рейтинг: 0 / 0
Не могу подключится к DB Access на С++.
    #33638836
Muromez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
roman10Хм, у меня все скомпилировалось и заработало...

Правда, два замечения.
1. Запустив дочерние потоки, вы не ждете в основном потоке их завершения. Это приводит к тому, что дочерние потоки прибиваются до того, как они успевают сформировать отчет. Если после запуска усыпить main на пару секунд, то все происходит нормально. Просто ждать в main, конечно, нехорошо, но вот я не знаю, есть ли какой аналог WaitForMultipleObjects в сишной библиотеке.

2. В ThreadProc в самом конце обнаружился лишний вызов pRstReport->Close(), который выкидывает необработанное исключение, благополучно грохая все приложение целиком.

У меня всё заработало также при усыпления main().
...
Рейтинг: 0 / 0
Не могу подключится к DB Access на С++.
    #33638852
roman10
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MuromezУ меня всё заработало также при усыпления main().
Ура, товарищи! ...и в воздух чепчики бросали.

MuromezТутнадо сделать так чтоб дочерний поток не начал работу пока предыдуший не закончит её.
Смеялсо. Зачем же тогда нужны потоки, ежели вы все равно собираетесь пускать их друг за дружкой? В том то и прикол, что потоки позволяют распараллелить вычисления.

MuromezЕщё в задачи у меня было сказано не создавать в дочернем потоке АДО обьект а использовать один для всех дочерних потоках.
Странное требование. Ведь большую часть времени ваши потоки работают с рекордсетом, и если он будет один, то все потоки будут ждать, пока он наконец освободится. Все опять таки выльется в очередь, и преемущества многопоточной обработки сойдут на нет. Может быть имелось ввиду использовать общий объект Connection, т.е. работать только с одним соединением к базе. В приведенном вашем примере, у вас каждый поток устанавливает новое подключение к базе, что не есть хорошо.
...
Рейтинг: 0 / 0
Не могу подключится к DB Access на С++.
    #33638887
Muromez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Какой обьект мне не сказали но имели ввиду обработку Critical Section.
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Не могу подключится к DB Access на С++.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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