Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Stored Procedure / 12 сообщений из 12, страница 1 из 1
09.09.2004, 16:40
    #32688025
Osipovic
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Stored Procedure
Проблема использованием 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
09.09.2004, 19:14
    #32688430
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Stored Procedure
OsipovicНапример sp_columns_rowset
Каким образом в программе на MS С++ получить и обработать результат работы этой процедуры?
И еще вопрос как использовать SQL- операторы
например:
m_db.ExecSQL( "select count(*) from Tab1 where ID < 10");
как получить этот результат работы этого оператора?


Что процедура, что не процедура - результаты получаются одинаково. Как - возми любой пример по использованию MFC-шных классов для работы с базами данных. (или это не MFC?)
...
Рейтинг: 0 / 0
10.09.2004, 10:41
    #32689013
Osipovic
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Stored Procedure
Не мог-бы ты уточнить.
Я работаю с SQL Server через ODBC.
Не видел в MSDN ни одного подходящего примера.
Наверно плохо искал.
...
Рейтинг: 0 / 0
13.09.2004, 08:37
    #32691153
Alex_VC
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Stored Procedure
Попробуй CRecordset (а лучше (кому-как, разумеется) на ADO переходи).
...
Рейтинг: 0 / 0
13.09.2004, 12:31
    #32691579
Osipovic
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Stored Procedure
В 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
14.09.2004, 11:41
    #32693301
Alex_VC
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Stored Procedure
Синтаксис точно не помню, но что-то наподобии было:

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
14.09.2004, 11:55
    #32693339
Osipovic
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Stored Procedure
Эта функция работает с 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
15.09.2004, 07:27
    #32694839
Siebentearbeit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Stored Procedure
Делать надо так:

Код: 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
15.09.2004, 08:17
    #32694867
Alex_VC
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Stored Procedure
Во-во, я же говорил, переходи на ADO!
...
Рейтинг: 0 / 0
15.09.2004, 15:43
    #32695976
Osipovic
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Stored Procedure
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
15.09.2004, 19:18
    #32696508
black zorro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Stored Procedure
а вот если после того как
Код: 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
16.09.2004, 10:38
    #32697035
Sie
Sie
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Stored Procedure
авторто можно будет и не создавать программно эти параметры а взять те которые будут получен с сервера.
Код: plaintext
 GetTaskIdCmd->Parameters->Item [_bstr_t("@foo_param")]->Value = 100l;
и помоему это более правильный путь.

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


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