Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Не возвращается ResultSet / 20 сообщений из 20, страница 1 из 1
16.12.2005, 09:43
    #33439775
Eugene7
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не возвращается ResultSet
Вызываю процедуру в базе(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
16.12.2005, 10:19
    #33439857
_Балтика
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не возвращается ResultSet
Возможно проблема в типе ResourceName
Попробуй wchar_t*.
Кстати, ты в каком режиме компилишь, в Use Multi-Byte Character Set или в Unicode ?
...
Рейтинг: 0 / 0
16.12.2005, 11:14
    #33440070
Eugene7
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не возвращается ResultSet
Use Multi-Byte Character Set
...
Рейтинг: 0 / 0
16.12.2005, 11:36
    #33440144
Eugene7
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не возвращается ResultSet
_БалтикаПопробуй wchar_t*.
Не помогло
...
Рейтинг: 0 / 0
16.12.2005, 11:40
    #33440162
_Балтика
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не возвращается ResultSet
Не посмотрел сразу...
Во-первых, когда связываешь параметр нужно передавать не 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
16.12.2005, 11:48
    #33440207
_Балтика
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не возвращается ResultSet
И вообще, чтобы говорить более конкретно, хотелось бы посмотреть на исходник хранимой процедуры.
...
Рейтинг: 0 / 0
16.12.2005, 13:44
    #33440695
Eugene7
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не возвращается ResultSet
_БалтикаНе посмотрел сразу...
Во-первых, когда связываешь параметр нужно передавать не 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
16.12.2005, 14:30
    #33440881
_Балтика
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не возвращается ResultSet
Ага, теперь понятнее, хотя умных мыслей по-прежнему немного. :)
Возможно, sysbase-овский ODBC драйвер воспринимает ResourceName как двухбайтовую строку. Не пробовал вместо SQL_VARCHAR SQL_CHAR?
----------------
А замена ResourceName на &ResourceName не помогла?
...
Рейтинг: 0 / 0
16.12.2005, 14:44
    #33440922
_Балтика
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не возвращается ResultSet
Вообщем-то по симптомам похоже, что именно ResourceName неправильно интерпретируется. Попробуй посмотреть в ResourceCol_get что там в ResourceName (закинь в какую-нибудь таблицу например).
...
Рейтинг: 0 / 0
16.12.2005, 18:21
    #33441702
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не возвращается ResultSet
временно замени хранимку на:
Код: 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
16.12.2005, 18:25
    #33441715
Eugene7
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не возвращается ResultSet
_БалтикаАга, теперь понятнее, хотя умных мыслей по-прежнему немного. :)
Возможно, sysbase-овский ODBC драйвер воспринимает ResourceName как двухбайтовую строку. Не пробовал вместо SQL_VARCHAR SQL_CHAR?
----------------
А замена ResourceName на &ResourceName не помогла?
Замена SQL_VARCHAR на SQL_CHAR не помогла. Замена ResourceName на &ResourceName тоже.

_БалтикаВообщем-то по симптомам похоже, что именно ResourceName неправильно интерпретируется. Попробуй посмотреть в ResourceCol_get что там в ResourceName (закинь в какую-нибудь таблицу например).
Сделал. Там лежит именно то, что я и передал
...
Рейтинг: 0 / 0
16.12.2005, 19:08
    #33441814
Eugene7
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не возвращается ResultSet
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
16.12.2005, 19:10
    #33441820
Eugene7
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не возвращается ResultSet
v_ColResourceName=CustomerListView потому что значение
Код: plaintext
char ResourceName[ 30 ] = "ResourceName\0";

сменил на
Код: plaintext
char ResourceName[ 30 ] = "CustomerListView\0";
...
Рейтинг: 0 / 0
16.12.2005, 22:48
    #33442074
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не возвращается ResultSet
Код: plaintext
1.
SQLPrepare(DB.hStmt, (SQLCHAR *)"EXECUTE rs.ResourceCol_get(?,?)", SQL_NTS);
Э?
...
Рейтинг: 0 / 0
16.12.2005, 23:45
    #33442100
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не возвращается ResultSet
Еще одна странная мысль: я напарывался на кривую работу с OUTPUT параметрами через ODBC. Попробуй убрать его вообще...
...
Рейтинг: 0 / 0
16.12.2005, 23:51
    #33442105
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не возвращается ResultSet
А впрочем, вот. Набросал на скорую руку. Работает без проблем (ну разве что 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
17.12.2005, 12:30
    #33442265
Eugene7
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не возвращается ResultSet
Вроде все также. Однако все равно не работает. Может проблема где то в процедуре зарыта?
В процедуре вставил такой код:
[SRC vatcomsql]INSERT INTO "rs"."temporary"("Variable") VALUES (v_ColResourceName);[/src]В таблице значение появляеться.
В чем же еще может быть проблема
...
Рейтинг: 0 / 0
17.12.2005, 20:46
    #33442585
Eugene7
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не возвращается ResultSet
White OwlРаботает без проблем (ну разве что OUTUT параметр не возвращается :):

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

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

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


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