powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Не возвращается ResultSet
20 сообщений из 20, страница 1 из 1
Не возвращается ResultSet
    #33439775
Eugene7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вызываю процедуру в базе(ASA) с помошью sybase central - резалт сет нормально возвращаеться. Вызываю из кода, SQLFetch() говорит SQL_NO_DATA. В может быть проблемма?
Код следующий:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
SQLAllocHandle(SQL_HANDLE_STMT, DB.hDbc, &DB.hStmt);
SQLPrepare(DB.hStmt, (SQLCHAR *)"{CALL rs.ResourceCol_get(?,?)}\0", SQL_NTS);
int SQLProcReturn;
SQLBindParameter(DB.hStmt,  1 , SQL_PARAM_OUTPUT, SQL_C_SLONG, SQL_INTEGER,  0 ,  0 , &SQLProcReturn,  0 ,  0 );
char ResourceName[ 30 ] = "ResourceName\0";
SQLBindParameter(DB.hStmt,  2 , SQL_PARAM_INPUT, SQL_C_TCHAR, SQL_VARCHAR, sizeof(ResourceName),  0 , ResourceName,  0 ,  0 );
if (!SQL_SUCCEEDED(SQLExecute(DB.hStmt)))
{
unsigned char szData[MAX_DATA];
unsigned char szSQLSTATE[ 10 ];
SDWORD nErr;
unsigned char msg[SQL_MAX_MESSAGE_LENGTH+ 1 ];
SWORD MsgLen;
if(SQLError( 0 ,  0 , DB.hStmt, szSQLSTATE, &nErr, msg, sizeof(msg), &MsgLen) != SQL_NO_DATA)
{
wsprintf((char *)szData,"Native error: %ld,\nSQLSTATE: %s,\nText error: '%s'",nErr,szSQLSTATE,msg);
MessageBox(NULL,(const char *)szData,"ODBC Error",MB_OK);
}
}
SQLINTEGER strlen;
SQLBindCol(DB.hStmt,  1 , SQL_C_CHAR, &ColName, sizeof(ColName), &strlen);
SQLBindCol(DB.hStmt,  2 , SQL_C_SLONG, &ColSize, sizeof(ColSize), &strlen);
char buffer[ 5 ];
if (SQLFetch(DB.hStmt) == SQL_NO_DATA) MessageBox(NULL, "SQL_NO_DATA", NULL, MB_OK);

Причем SQLExecute успешно исполняться, возвращает SQL_SUCCESS.
...
Рейтинг: 0 / 0
Не возвращается ResultSet
    #33439857
_Балтика
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Возможно проблема в типе ResourceName
Попробуй wchar_t*.
Кстати, ты в каком режиме компилишь, в Use Multi-Byte Character Set или в Unicode ?
...
Рейтинг: 0 / 0
Не возвращается ResultSet
    #33440070
Eugene7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Use Multi-Byte Character Set
...
Рейтинг: 0 / 0
Не возвращается ResultSet
    #33440144
Eugene7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_БалтикаПопробуй wchar_t*.
Не помогло
...
Рейтинг: 0 / 0
Не возвращается ResultSet
    #33440162
_Балтика
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не посмотрел сразу...
Во-первых, когда связываешь параметр нужно передавать не ResourceName , а &ResourceName
Во-вторых зачем нужно вот это???
Код: plaintext
1.
2.
3.
SQLINTEGER strlen;
SQLBindCol(DB.hStmt,  1 , SQL_C_CHAR, &ColName, sizeof(ColName), &strlen);
SQLBindCol(DB.hStmt,  2 , SQL_C_SLONG, &ColSize, sizeof(ColSize), &strlen);
Ведь ты уже сделал привязку SqlBindParametr
...
Рейтинг: 0 / 0
Не возвращается ResultSet
    #33440207
_Балтика
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И вообще, чтобы говорить более конкретно, хотелось бы посмотреть на исходник хранимой процедуры.
...
Рейтинг: 0 / 0
Не возвращается ResultSet
    #33440695
Eugene7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_БалтикаНе посмотрел сразу...
Во-первых, когда связываешь параметр нужно передавать не ResourceName , а &ResourceName
Во-вторых зачем нужно вот это???
Код: plaintext
1.
2.
3.
SQLINTEGER strlen;
SQLBindCol(DB.hStmt,  1 , SQL_C_CHAR, &ColName, sizeof(ColName), &strlen);
SQLBindCol(DB.hStmt,  2 , SQL_C_SLONG, &ColSize, sizeof(ColSize), &strlen);
Ведь ты уже сделал привязку SqlBindParametr

SQLBindParameters() я биндил переменные в процедуру на вход(так знаки ? есть)
SQLBindCol() биндит переменные с резалт сетом. Т.е. например, вернулся резалт сет на две колонки. Я вызываю дважды SQLBindCol(), что бы после исполнения SQLFetch() первая строка записалась в эти переменные
Вот исходник процедуры:

Код: 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.
ALTER PROCEDURE rs."ResourceCol_get" (
 INOUT workresult integer                   //результат работы процедуры [0]-неуспешно,[1]-успешно,[-1]-ошибка
,IN v_ColResourceName char( 30 ) DEFAULT NULL //наименование обьекта к которому принадлежит колонка
//,IN v_ColName char(30) DEFAULT NULL         //название колонки не указано -> все колонки у обьекта
)
//      РАБОТАЕТ 2005.11.14_09.50
// Create variable qq1 integer; set qq1 = 40; CALL "rs"."ResourceCol_get"( qq1,'qq1' );
// 
//
RESULT (
 ColName char( 30 )	//название колонки
,ColSize integer)	//размер
BEGIN
	DECLARE v_IDColResourceName integer;
//ид названия ресурса
SET v_IDColResourceName = (SELECT "rs"."ResourceCol_1ResourceName"."IDResourceName"
                           FROM "rs"."ResourceCol_1ResourceName" 
                           WHERE "ResourceName" = v_ColResourceName);
// связанные с ним колонки и значения
IF v_IDColResourceName IS NOT NULL THEN 
 SELECT "ColName","ColSize"
 FROM "rs"."ResourceCol_3ColSize" JOIN "rs"."ResourceCol_2ColName"
   ON "rs"."ResourceCol_3ColSize"."FK_IDColName" = "rs"."ResourceCol_2ColName"."IDColName"
 WHERE "rs"."ResourceCol_2ColName"."FK_IDResourceName" = v_IDColResourceName
   AND "rs"."ResourceCol_3ColSize"."SK_Userid" = (SELECT SYS.SYSUSERPERMS."user_id" 
                                                    FROM SYS.SYSUSERPERMS 
                                                   WHERE SYS.SYSUSERPERMS."user_name" = CURRENT USER);
 SET workresult =  1 ;
ELSE //ошибка, запрашиваемый обьект не найден
 SET workresult =  0 ;
END IF;
END

Как я уже писал, если ее запускать интерактивно из sybase central, она успешно отрабатывает и возвращает резалт сет из двух столбцов
...
Рейтинг: 0 / 0
Не возвращается ResultSet
    #33440881
_Балтика
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ага, теперь понятнее, хотя умных мыслей по-прежнему немного. :)
Возможно, sysbase-овский ODBC драйвер воспринимает ResourceName как двухбайтовую строку. Не пробовал вместо SQL_VARCHAR SQL_CHAR?
----------------
А замена ResourceName на &ResourceName не помогла?
...
Рейтинг: 0 / 0
Не возвращается ResultSet
    #33440922
_Балтика
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вообщем-то по симптомам похоже, что именно ResourceName неправильно интерпретируется. Попробуй посмотреть в ResourceCol_get что там в ResourceName (закинь в какую-нибудь таблицу например).
...
Рейтинг: 0 / 0
Не возвращается ResultSet
    #33441702
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
временно замени хранимку на:
Код: plaintext
1.
2.
3.
ALTER PROCEDURE rs."ResourceCol_get" (INOUT workresult integer                  , IN v_ColResourceName char( 30 ) DEFAULT NULL)
BEGIN
   print now() || ' workresult=' || workresult || ' v_ColResourceName=' || v_ColResourceName;
END
и смотри сообщения в окне сервера. Если неправильно послал параметры в процедуру - сразу увидишь.

а пока на вскидку вижу одну ошибку вот тут:
SQLBindParameter(DB.hStmt, 2, SQL_PARAM_INPUT, SQL_C_TCHAR, SQL_VARCHAR, sizeof(ResourceName), 0, ResourceName, 0, 0);
последним параметром НАДО посылать указатель на int содеражащий SQL_NTS
...
Рейтинг: 0 / 0
Не возвращается ResultSet
    #33441715
Eugene7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_БалтикаАга, теперь понятнее, хотя умных мыслей по-прежнему немного. :)
Возможно, sysbase-овский ODBC драйвер воспринимает ResourceName как двухбайтовую строку. Не пробовал вместо SQL_VARCHAR SQL_CHAR?
----------------
А замена ResourceName на &ResourceName не помогла?
Замена SQL_VARCHAR на SQL_CHAR не помогла. Замена ResourceName на &ResourceName тоже.

_БалтикаВообщем-то по симптомам похоже, что именно ResourceName неправильно интерпретируется. Попробуй посмотреть в ResourceCol_get что там в ResourceName (закинь в какую-нибудь таблицу например).
Сделал. Там лежит именно то, что я и передал
...
Рейтинг: 0 / 0
Не возвращается ResultSet
    #33441814
Eugene7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl
а пока на вскидку вижу одну ошибку вот тут:
SQLBindParameter(DB.hStmt, 2, SQL_PARAM_INPUT, SQL_C_TCHAR, SQL_VARCHAR, sizeof(ResourceName), 0, ResourceName, 0, 0);
последним параметром НАДО посылать указатель на int содеражащий SQL_NTS
Сделал, не помогло. Сделал так:

Код: plaintext
1.
SQLINTEGER SqlNts = SQL_NTS;
SQLBindParameter(DB.hStmt,  2 , SQL_PARAM_INPUT, SQL_C_TCHAR, SQL_VARCHAR, sizeof(ResourceName),  0 , ResourceName,  0 , &SqlNts);


White Owlвременно замени хранимку на:
Код: plaintext
1.
2.
3.
ALTER PROCEDURE rs."ResourceCol_get" (INOUT workresult integer                  , IN v_ColResourceName char( 30 ) DEFAULT NULL)
BEGIN
   print now() || ' workresult=' || workresult || ' v_ColResourceName=' || v_ColResourceName;
END
и смотри сообщения в окне сервера. Если неправильно послал параметры в процедуру - сразу увидишь.


Сделал. В окне сообщений сервера следующее:

2005-12-16 22:04:44.107000 workresult=-5 v_ColResourceName=CustomerListView

Так что получаеться параметры передались верно
...
Рейтинг: 0 / 0
Не возвращается ResultSet
    #33441820
Eugene7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
v_ColResourceName=CustomerListView потому что значение
Код: plaintext
char ResourceName[ 30 ] = "ResourceName\0";

сменил на
Код: plaintext
char ResourceName[ 30 ] = "CustomerListView\0";
...
Рейтинг: 0 / 0
Не возвращается ResultSet
    #33442074
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
SQLPrepare(DB.hStmt, (SQLCHAR *)"EXECUTE rs.ResourceCol_get(?,?)", SQL_NTS);
Э?
...
Рейтинг: 0 / 0
Не возвращается ResultSet
    #33442100
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще одна странная мысль: я напарывался на кривую работу с OUTPUT параметрами через ODBC. Попробуй убрать его вообще...
...
Рейтинг: 0 / 0
Не возвращается ResultSet
    #33442105
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А впрочем, вот. Набросал на скорую руку. Работает без проблем (ну разве что OUTUT параметр не возвращается :):
Код: 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.
#include <windows.h>
#include <stdio.h>
#include <sql.h>
#include <sqlext.h>
#include <odbcinst.h>

void main() {
	SQLHENV hEnv;
	SQLHDBC hDbc;
	SQLHSTMT hStmt;

	int SQLProcReturn, ColSize;
	char ColName[ 32 ], TableName[ 32 ] = "customer";
	SQLINTEGER strlen, SQLProcReturnInd;

	if (!SQL_SUCCEEDED(SQLAllocHandle(SQL_HANDLE_ENV, NULL, &hEnv))) return;
	if (!SQL_SUCCEEDED(SQLSetEnvAttr(hEnv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3,  0 ))) return;
	if (!SQL_SUCCEEDED(SQLAllocHandle(SQL_HANDLE_DBC, hEnv, &hDbc))) return;
	if (!SQL_SUCCEEDED(SQLConnect(hDbc, "ASA 8.0 Sample", SQL_NTS, "DBA", SQL_NTS, "sql", SQL_NTS))) return;
	if (!SQL_SUCCEEDED(SQLAllocHandle(SQL_HANDLE_STMT, hDbc, &hStmt))) return;
	printf("connected\n");

/*	SQLExecDirect(hStmt,
 "alter procedure DBA.GetListOfColumns(INOUT pWorkResult integer, IN pTableName char(32) DEFAULT NULL) "
 "begin"
 "  declare mTable_Id integer;"
 "  select first table_id into mTable_Id from SYS.SYSTABLE where table_name=pTableName;"
 "  select count(*) into pWorkResult from SYS.SYSCOLUMN where table_id=mTable_Id;"
 "  select column_name, width from SYS.SYSCOLUMN where table_id=mTable_Id;"
 "end;"
		, SQL_NTS);*/

	if (!SQL_SUCCEEDED(SQLPrepare(hStmt, (SQLCHAR *)"{call DBA.GetListOfColumns(?,?)}", SQL_NTS))) goto StatementError;
	if (!SQL_SUCCEEDED(SQLBindParameter(hStmt,  1 , SQL_PARAM_INPUT_OUTPUT, SQL_C_SLONG, SQL_INTEGER,  0 ,  0 , &SQLProcReturn,  0 ,  0 ))) goto StatementError;
	if (!SQL_SUCCEEDED(SQLBindParameter(hStmt,  2 , SQL_PARAM_INPUT, SQL_C_TCHAR, SQL_VARCHAR, sizeof(TableName),  0 , TableName,  0 ,  0 ))) goto StatementError;
	if (!SQL_SUCCEEDED(SQLExecute(hStmt)))
	{
		unsigned char szSQLSTATE[ 10 ];
		SDWORD nErr;
		unsigned char msg[ 1024 ];
		SWORD MsgLen;
		int i;
	StatementError:
		for (i= 1 ; SQLGetDiagRec(SQL_HANDLE_STMT, hStmt, i, szSQLSTATE, &nErr,
						msg, sizeof(msg), &MsgLen) != SQL_NO_DATA; i++) {
			printf("Native error: %ld,\nSQLSTATE: %s,\nText error: '%s'", nErr, szSQLSTATE, msg);
		}
		return;
	}
	if (!SQL_SUCCEEDED(SQLBindCol(hStmt,  1 , SQL_C_CHAR, &ColName, sizeof(ColName), &strlen))) goto StatementError;
	if (!SQL_SUCCEEDED(SQLBindCol(hStmt,  2 , SQL_C_SLONG, &ColSize, sizeof(ColSize), &strlen))) goto StatementError;
	while (SQLFetch(hStmt) == SQL_SUCCESS) {
		printf("%s %d\n", ColName, ColSize);
	}
}
...
Рейтинг: 0 / 0
Не возвращается ResultSet
    #33442265
Eugene7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вроде все также. Однако все равно не работает. Может проблема где то в процедуре зарыта?
В процедуре вставил такой код:
[SRC vatcomsql]INSERT INTO "rs"."temporary"("Variable") VALUES (v_ColResourceName);[/src]В таблице значение появляеться.
В чем же еще может быть проблема
...
Рейтинг: 0 / 0
Не возвращается ResultSet
    #33442585
Eugene7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlРаботает без проблем (ну разве что OUTUT параметр не возвращается :):

А почему не возвращаеться? Что то не так прописано(вроде все правильно) или это глюк ODBC?
...
Рейтинг: 0 / 0
Не возвращается ResultSet
    #33443317
_Балтика
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Eugene7 White OwlРаботает без проблем (ну разве что OUTUT параметр не возвращается :):

А почему не возвращаеться? Что то не так прописано(вроде все правильно) или это глюк ODBC?
Чтобы возвратился SQLGetData надо вызвать
...
Рейтинг: 0 / 0
Не возвращается ResultSet
    #33445185
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Балтика Eugene7 White OwlРаботает без проблем (ну разве что OUTUT параметр не возвращается :):

А почему не возвращаеться? Что то не так прописано(вроде все правильно) или это глюк ODBC?
Чтобы возвратился SQLGetData надо вызвать
Э? SQLGetData() работает с резалтсетом, а не с параметрами.
Впрочем... вон, тестовый пример лежит открыто, если сможешь подправить его чтобы значение в SQLProcReturn прочиталось правильно - я буду очень благодарен :)
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Не возвращается ResultSet
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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