powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Stored Procedure
12 сообщений из 12, страница 1 из 1
Stored Procedure
    #32688025
Osipovic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проблема использованием Stored Procedure.
Например sp_columns_rowset
Каким образом в программе на MS С++ получить и обработать результат работы этой процедуры?
Может есть у кого примеры подобной обработки.
И еще вопрос как использовать SQL- операторы
например:
CDatabase m_db;
m_db.Open(NULL, FALSE, FALSE, pszMB_DB);
m_db.ExecSQL( "select count(*) from Tab1 where ID < 10");
как получить этот результат работы этого оператора?

Премного благодарен за толковый совет.
...
Рейтинг: 0 / 0
Stored Procedure
    #32688430
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OsipovicНапример sp_columns_rowset
Каким образом в программе на MS С++ получить и обработать результат работы этой процедуры?
И еще вопрос как использовать SQL- операторы
например:
m_db.ExecSQL( "select count(*) from Tab1 where ID < 10");
как получить этот результат работы этого оператора?


Что процедура, что не процедура - результаты получаются одинаково. Как - возми любой пример по использованию MFC-шных классов для работы с базами данных. (или это не MFC?)
...
Рейтинг: 0 / 0
Stored Procedure
    #32689013
Osipovic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не мог-бы ты уточнить.
Я работаю с SQL Server через ODBC.
Не видел в MSDN ни одного подходящего примера.
Наверно плохо искал.
...
Рейтинг: 0 / 0
Stored Procedure
    #32691153
Alex_VC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуй CRecordset (а лучше (кому-как, разумеется) на ADO переходи).
...
Рейтинг: 0 / 0
Stored Procedure
    #32691579
Osipovic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В MSDN примеры на эту тему - ODBC Recordset к сожалению не работающие.

nRetCode = SQLFreeHandle(SQL_HANDLE_STMT,m_hstmt);
if (!AllocHstmt()) return FALSE;
nRetCode = SQLExecDirect(m_hstmt,(SQLCHAR*) "SELECT count(*) from Tab1", SQL_NTS);
if( nRetCode == SQL_ERROR )
{
// Handle error and return.
}

nRetCode = SQLExecDirect - постоянно =-1
Не понимаю!!!!!!!!
...
Рейтинг: 0 / 0
Stored Procedure
    #32693301
Alex_VC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Синтаксис точно не помню, но что-то наподобии было:

CDatabase m_db;
m_db.OpenEx(....); //Открываешь БД
CRecordset m_rs(&m_db);
m_rs.Open(CRecordset::dynaset(или snapshot),"select * from table",...);//Открываешь Recordset
while(!m_rs.IsEOF()) //В цикле смотришь/творишь с данными, которые в рекордсете что хочешь
{
m_rs.GetFieldValue(...);
m_rs.MoveNext();
}
m_rs.Close();
m_db.Close();
...
Рейтинг: 0 / 0
Stored Procedure
    #32693339
Osipovic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Эта функция работает с SQL-операторами или Stored Procedure
Ограничение: возвращает только 1 int-параметр
int ExecDBSQL( CDatabase* pdb, LPCTSTR pszStatement )
{
if( !pdb->IsOpen() )
return -2;
SWORD sRowCnt;
RETCODE rc = -1;
RETCODE rcExec = -1;
HSTMT hstmt;

rcExec = SQLAllocStmt( pdb->m_hdbc, &hstmt );
if( rcExec >= 0 )
rcExec = SQLExecDirect(hstmt, (SQLCHAR*)pszStatement, SQL_NTS);

if( rcExec >= 0 )
rc = SQLFetch(hstmt);

if( rc >= 0 )
rc = SQLGetData(hstmt,1, SQL_C_SSHORT, &sRowCnt, sizeof(sRowCnt), NULL);

return (rc>=0) ? sRowCnt : ( (rcExec>=0) ? 0 : -1 );
}


Пример


count = ExecDBSQL(&dbInput," select count(*) from customers where customerid like 'A%'");

count = ExecDBSQL(&dbInput," spInsertIntoJob 1, 'Test', 2, 3, 4");
...
Рейтинг: 0 / 0
Stored Procedure
    #32694839
Siebentearbeit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Делать надо так:

Код: 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.
 // это параметры для комманды 
	VARIANT vtName, vtSourceID;
	_ParameterPtr	prmName			= NULL;
	_ParameterPtr	prmSourceID		= NULL;
	_ParameterPtr	prmTask			= NULL;
	_CommandPtr		GetTaskIdCmd	= NULL;

	WriteLog(" -> GetTaskID begin");
	try
	{
		TESTHR (GetTaskIdCmd.CreateInstance(__uuidof(Command)));
		GetTaskIdCmd->ActiveConnection = pConnection; //это коннекшн типа _ConnectionPtr 
		GetTaskIdCmd->CommandText = "sp_someget_proc"; //имя 
		GetTaskIdCmd->CommandType = adCmdStoredProc; //тип 
		GetTaskIdCmd->CommandTimeout =  15 ;
	}
	catch(...)
	{
		MessageBox(NULL,"Ошибка инициализации команды","ошибка",MB_OK|MB_ICONERROR);
		return  1 ;
	}
 // начили загонять параметры 
	vtName.vt = VT_BSTR;
	vtName.bstrVal = (_bstr_t)(name);

	vtSourceID.vt = VT_I4;
	vtSourceID.intVal =  5 ;
 // входящий 
	prmName = GetTaskIdCmd->CreateParameter( "reg_number",adBSTR,adParamInput,strlen(name),vtName);
	GetTaskIdCmd->Parameters->Append(prmName);
 // входящий 
	prmSourceID = GetTaskIdCmd->CreateParameter( "source_id",adInteger,adParamInput,sizeof(int),vtSourceID);
	GetTaskIdCmd->Parameters->Append(prmSourceID);
 // исходящиц 
	prmTask = GetTaskIdCmd->CreateParameter( "task_id",adInteger,adParamOutput,sizeof(int));
	GetTaskIdCmd->Parameters->Append(prmTask);
	try
	{         // ВПЕРЁД!!! 
		GetTaskIdCmd->Execute(NULL,NULL,adCmdStoredProc);
		*Task_id = prmTask->Value.intVal;
	}catch(_com_error &e)
	{	char Msg[ 256 ];
		 // Notify the user of errors if any.    
		_bstr_t bstrSource(e.Source());
		_bstr_t bstrDescription(e.Description());
		sprintf(Msg,"Source : %s \n Description : %s \n",(LPCSTR)bstrSource,(LPCSTR)bstrDescription);
		return  1 ;
	}
...
Рейтинг: 0 / 0
Stored Procedure
    #32694867
Alex_VC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во-во, я же говорил, переходи на ADO!
...
Рейтинг: 0 / 0
Stored Procedure
    #32695976
Osipovic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sehr geehrter Siebentearbeit

Что-то очень у тебя наворочено.
Проще надо. Функция ExecDBSQL у меня работает стабильно в ОDBC.
Разумеется сначала надо:

CDatabase dbInput;
dbInput.Open( NULL, FALSE, FALSE, szName, TRUE );
этого вполне достаточно
count = ExecDBSQL(&dbInput,("select id from job where id > 4031");


int ExecDBSQL( CDatabase* pdb, LPCTSTR pszStatement )
{
if( !pdb->IsOpen() )
return -2;
SWORD sRowCnt;
RETCODE rc = -1;
RETCODE rcExec = -1;
HSTMT hstmt;

// SQLAllocStmt( pdb->m_hdbc, &hstmt );
try
{
rcExec = SQLAllocHandle(SQL_HANDLE_STMT, pdb->m_hdbc, &hstmt);
if( rcExec >= 0 )
rcExec = SQLExecDirect(hstmt, (SQLCHAR*)pszStatement, SQL_NTS);

if( rcExec >= 0 )
rc = SQLFetch(hstmt);

if( rc >= 0 )
rc = SQLGetData(hstmt,1, SQL_C_SSHORT, &sRowCnt, sizeof(sRowCnt), NULL);

SQLFreeHandle( SQL_HANDLE_STMT,hstmt );

return (rc>=0) ? sRowCnt : ( (rcExec>=0) ? rcExec : -1 );
}
catch (CDBException* pDBException)
{
Display(_T("Exception during ExecDBSQL : %s"),
pDBException->m_strError.Trim());
pDBException->Delete();
return -1;
}
}
...
Рейтинг: 0 / 0
Stored Procedure
    #32696508
black zorro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а вот если после того как
Код: plaintext
1.
2.
3.
4.
 GetTaskIdCmd->ActiveConnection = pConnection; //это коннекшн типа _ConnectionPtr 
GetTaskIdCmd->CommandText = "sp_someget_proc"; //имя 
GetTaskIdCmd->CommandType = adCmdStoredProc; //тип 
GetTaskIdCmd->CommandTimeout =  15 ;
сделать
Код: plaintext
1.
GetTaskIdCmd->Parameters->Refresh ();
то можно будет и не создавать программно эти параметры а взять те которые будут получен с сервера.
Код: plaintext
1.
 GetTaskIdCmd->Parameters->Item [_bstr_t("@foo_param")]->Value = 100l;
и помоему это более правильный путь.
...
Рейтинг: 0 / 0
Stored Procedure
    #32697035
Sie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sie
Гость
авторто можно будет и не создавать программно эти параметры а взять те которые будут получен с сервера.
Код: plaintext
 GetTaskIdCmd->Parameters->Item [_bstr_t("@foo_param")]->Value = 100l;
и помоему это более правильный путь.

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


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