powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / SELECT из VIEW с конкатенацией падает в программе на C++
14 сообщений из 14, страница 1 из 1
SELECT из VIEW с конкатенацией падает в программе на C++
    #35370725
Бока
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У нас есть следующее VIEW:

ALTER VIEW "USER1"."VIEW1" as
select ID1,ID2,NAME1 || ' - ' || DESC1 as TYPE_NAME
from USER1.TABLE1 where ID3 > 0


Если делаешь SELECT ID1,ID2,TYPE_NAME FROM "USER1"."VIEW1" в ISQL, το работает нормально.
А если тот же SELECT делаем в программе на C++, то он падает.

Для коннекции в программе на C++ мы используем провайдер, как показано в функции ниже
hr = CoCreateInstance(CLSID_MSDASQL, NULL,
CLSCTX_INPROC_SERVER,
IID_IDBInitialize,
(void **) &pIDBInitialize);


Пробовали использовать во VIEW в качестве знака конкатенации "+" вместо знака "||" - результат тот же самый.

В чем проблема ?
...
Рейтинг: 0 / 0
SELECT из VIEW с конкатенацией падает в программе на C++
    #35370727
Бока
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Забыл сказать, что это ASA 10.0.1.
...
Рейтинг: 0 / 0
SELECT из VIEW с конкатенацией падает в программе на C++
    #35370728
Бока
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Κстати, говорят, что уже якобы есть ASA 10.5.0. Где можно взять бесплатно ?
...
Рейтинг: 0 / 0
SELECT из VIEW с конкатенацией падает в программе на C++
    #35370740
Dim2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Говорят, что кур доят .
____________________________________
- Гарфилд, мышь!
- Спасибо, я сыт!
...
Рейтинг: 0 / 0
SELECT из VIEW с конкатенацией падает в программе на C++
    #35370780
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
БокаДля коннекции в программе на C++ мы используем провайдер, как показано в функции ниже
hr = CoCreateInstance(CLSID_MSDASQL, NULL,
CLSCTX_INPROC_SERVER,
IID_IDBInitialize,
(void **) &pIDBInitialize);
Это не провайдер, это инициализация COM (и я подозреваю что ты используешь ADO).
Провайдер, это то что ты указываешь в строке коннекта в слове Provider.
В чем конкретно проблема не скажу, может быть в провайдере (не я не знаю какой именно провайдер ты используешь), в интерфейсе (ADO славен кривой работой с блобами) или в твоей программе (потому что она не умеет работать с блобами). Но источник скорее всего именно в блобах.
Когда ты склеиваешь несколько строк, SA не мудрствуя превращает результат формулы в long varchar. Можно обойти подправив вьюшку вот так:
Код: plaintext
1.
2.
3.
4.
ALTER VIEW "USER1"."VIEW1" as
select ID1,
      ID2,
      convert(varchar( 100 ), NAME1 || ' - ' || DESC1) as TYPE_NAME
from USER1.TABLE1 where ID3 >  0 


БокаΚстати, говорят, что уже якобы есть ASA 10.5.0. Где можно взять бесплатно ?11.0 не устраивает?
...
Рейтинг: 0 / 0
SELECT из VIEW с конкатенацией падает в программе на C++
    #35371348
iLLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И вообще не понятно, что именно падает, клиент или сервер...


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
SELECT из VIEW с конкатенацией падает в программе на C++
    #35371500
Бока
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl БокаДля коннекции в программе на C++ мы используем провайдер, как показано в функции ниже
hr = CoCreateInstance(CLSID_MSDASQL, NULL,
CLSCTX_INPROC_SERVER,
IID_IDBInitialize,
(void **) &pIDBInitialize);
Это не провайдер, это инициализация COM (и я подозреваю что ты используешь ADO).
Провайдер, это то что ты указываешь в строке коннекта в слове Provider.
В чем конкретно проблема не скажу, может быть в провайдере (не я не знаю какой именно провайдер ты используешь), в интерфейсе (ADO славен кривой работой с блобами) или в твоей программе (потому что она не умеет работать с блобами). Но источник скорее всего именно в блобах.
Когда ты склеиваешь несколько строк, SA не мудрствуя превращает результат формулы в long varchar. Можно обойти подправив вьюшку вот так:
Код: plaintext
1.
2.
3.
4.
ALTER VIEW "USER1"."VIEW1" as
select ID1,
      ID2,
      convert(varchar( 100 ), NAME1 || ' - ' || DESC1) as TYPE_NAME
from USER1.TABLE1 where ID3 >  0 
Спасибо, буду пробовать.
Я забыл сказать, что этот же код с этим же VIEW, и использую тот же провайдер, у нас работал с ASA 7.0.1, а падать стал после перехода на ASA 10.0.1.
Kοд не мой, спрошу у автора насчет провайдера.

БокаΚстати, говорят, что уже якобы есть ASA 10.5.0. Где можно взять бесплатно ?11.0 не устраивает?[/quot]Если есть, то конечно устраивает.
...
Рейтинг: 0 / 0
SELECT из VIEW с конкатенацией падает в программе на C++
    #35371602
Бока
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl, ваше решение помогло, спасибо.
Мы используем OLEDB провайдер, который называется MSDASQL.

А что насчен ASA 11.0 ? Уточните пожалуйста
...
Рейтинг: 0 / 0
SELECT из VIEW с конкатенацией падает в программе на C++
    #35371670
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
БокаWhite Owl, ваше решение помогло, спасибо.
Мы используем OLEDB провайдер, который называется MSDASQL.Ответ опять не полный :)
MSDASQL это мост ODBC->OLDDB. То есть у вас сейчас данные проходят аж три конвертации - сначала их получает ODBC драйвер (по прежнему неизвестно какой версии), потом они превращаются в OLEDB формат внутри MSDASQL и потом в ADO, прежде чем наконец с ними начнет работать пользовательское приложение.
Молодцы, все собрали... вам бы еще туда прямые вызовы к dblib добавить и получится вообще замечательно.
Вы ж на Си пишете, работали бы уж напрямую с ODBC и проблем бы не было....

БокаА что насчен ASA 11.0 ? Уточните пожалуйстаА чего тут уточнять? SA 11 beta раздается бесплатно для тестеров. Линк на нее есть на главной странице sybase.com (называется SQL Anywhere Panorama Beta). Ходи туда, регестрируйся, выкачивай и играйся на здоровье. Только клиентам сервер ставить нельзя будет.
...
Рейтинг: 0 / 0
SELECT из VIEW с конкатенацией падает в программе на C++
    #35371859
Dim2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlВы ж на Си пишете, работали бы уж напрямую с ODBC и проблем бы не было....
Тогда уж с ESQL. Прямее не бывает ;).
...
Рейтинг: 0 / 0
SELECT из VIEW с конкатенацией падает в программе на C++
    #35372556
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dim2000 White OwlВы ж на Си пишете, работали бы уж напрямую с ODBC и проблем бы не было....
Тогда уж с ESQL. Прямее не бывает ;).Тоже верно. Удобнее, быстрее, фичастее :)
...
Рейтинг: 0 / 0
SELECT из VIEW с конкатенацией падает в программе на C++
    #35375266
Бока
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl БокаWhite Owl, ваше решение помогло, спасибо.
Мы используем OLEDB провайдер, который называется MSDASQL.Ответ опять не полный :)
MSDASQL это мост ODBC->OLDDB. То есть у вас сейчас данные проходят аж три конвертации - сначала их получает ODBC драйвер (по прежнему неизвестно какой версии), потом они превращаются в OLEDB формат внутри MSDASQL и потом в ADO, прежде чем наконец с ними начнет работать пользовательское приложение.
Молодцы, все собрали... вам бы еще туда прямые вызовы к dblib добавить и получится вообще замечательно.
Вы ж на Си пишете, работали бы уж напрямую с ODBC и проблем бы не было.... Спасибо.
A Вы не могли бы привести примерчик фрагмента кода в C++ с коннекцией напрямую с ODBC ?
...
Рейтинг: 0 / 0
SELECT из VIEW с конкатенацией падает в программе на C++
    #35375306
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
БокаA Вы не могли бы привести примерчик фрагмента кода в C++ с коннекцией напрямую с ODBC ?Иех, компоненто-любы.....
Ну вот, мой собственный микро-враппер над ODBC.
Код: 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.
///// SqlUtils.h
#include <windows.h>
#include <stdio.h>

#include <sql.h>
#include <sqlext.h>
#include <sqldef.h>
#include <odbcinst.h>
#include <asaodbc.h>

BOOLEAN ConnectToDatabase(SQLCHAR *InConnectString);
void DisconnectFromDatabase(void);
void CloseCursor(void);
BOOLEAN Send(char *Format, ...);
BOOLEAN Fetch(void);
BOOLEAN ShowSqlError(char *FunctionName);

int GetColumnsCount(void);
char *GetColumnName(int ColumnIndex);
char *GetColumnAsString(int ColumnIndex);
char *GetFieldAsString(char *FieldName);
int GetColumnAsInteger(int ColumnIndex);
int GetFieldAsInteger(char *FieldName);
BOOLEAN IsColumnNull(int ColumnIndex);
BOOLEAN IsFieldNull(char *FieldName);
Код: 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.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
///// SqlUtils.c
#include "LogWindow.h"
#include "SqlUtils.h"

static HDBC hDbc;
static HENV hEnv;
HSTMT hStmt;
RETCODE RetCode;
static SQLCHAR SqlState[ 6 ], SqlMessage[SQL_MAX_MESSAGE_LENGTH];
static SQLINTEGER SqlError;
static SQLSMALLINT MessageLen;
static char Command[0x4000];

typedef struct {
	SQLSMALLINT ColumnType;
	SQLCHAR	ColumnName[ 64 ];
	char Data[ 8192 ];
	SQLINTEGER ColumnSize;
	SQLSMALLINT DecimalPoint;
	SQLLEN DataRetrieved;
} Column;

static Column *ResultSet;
static SQLSMALLINT ColumnsCount;


void SQL_CALLBACK my_msgproc(
   void *    sqlca,
   unsigned char     msg_type,
   long              code,
   unsigned short    len,
   char*             msg )
{
	if (msg_type == MESSAGE_TYPE_STATUS) {
		msg[len]= 0 ;
		Log(LOG_ITALIC, "%s\n", msg);
	}
}

BOOLEAN ConnectToDatabase(SQLCHAR *InConnectString) {
	SQLCHAR OutConnectString[ 1024 ];
	SQLCHAR FunctionName[ 32 ];
	int i;

	Log(LOG_DEBUG | LOG_ITALIC, "before decrypt: %s\n", InConnectString);
	//for (i=0; InConnectString[i]; i++) InConnectString[i] ^= 0xAA;
	Log(LOG_DEBUG | LOG_ITALIC, "after decrypt: %s\n", InConnectString);

	RetCode = SQLAllocHandle( SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv );
	if (RetCode != SQL_SUCCESS) {
		strcpy(FunctionName, "SQLAllocHandle(ENV)");
ENV_Error:
		for (i= 1 ; SQLGetDiagRec(SQL_HANDLE_ENV, hEnv, i, SqlState, &SqlError,
							SqlMessage, sizeof(SqlMessage), &MessageLen) != SQL_NO_DATA; i++) {
			Log(LOG_RED, "%s failed: %s %d %s\n", FunctionName, SqlState, SqlError, SqlMessage);
		}
		return FALSE;
	}

	RetCode = SQLSetEnvAttr(hEnv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3,  0 );
	if ((RetCode != SQL_SUCCESS) && ((RetCode != SQL_SUCCESS_WITH_INFO))) {
		strcpy(FunctionName, "SQLSetEnvAttr");
		goto ENV_Error;
	}

	RetCode = SQLAllocHandle( SQL_HANDLE_DBC, hEnv, &hDbc );
	if ((RetCode != SQL_SUCCESS) && ((RetCode != SQL_SUCCESS_WITH_INFO))) {
		strcpy(FunctionName, "SQLAllocHandle(DBC)");
DBC_Error:
		for (i= 1 ; SQLGetDiagRec(SQL_HANDLE_DBC, hDbc, i, SqlState, &SqlError,
							SqlMessage, sizeof(SqlMessage), &MessageLen) != SQL_NO_DATA; i++) {
			Log(LOG_RED, "%s failed(%d): %s %d %s\n", FunctionName, RetCode, SqlState, SqlError, SqlMessage);
		}
		return FALSE;
	}

	RetCode = SQLDriverConnect( hDbc, NULL, InConnectString, SQL_NTS,
								OutConnectString, sizeof(OutConnectString), &MessageLen,
								SQL_DRIVER_NOPROMPT );
	if ((RetCode != SQL_SUCCESS) && ((RetCode != SQL_SUCCESS_WITH_INFO))) {
		strcpy(FunctionName, "SQLDriverConnect");
		goto DBC_Error;
	}

	RetCode = SQLSetConnectOption(hDbc, SQL_AUTOCOMMIT, SQL_AUTOCOMMIT_OFF);
	if ((RetCode != SQL_SUCCESS) && ((RetCode != SQL_SUCCESS_WITH_INFO))) {
		strcpy(FunctionName, "SQLSetConnectOption");
		goto DBC_Error;
	}

	RetCode = SQLAllocHandle( SQL_HANDLE_STMT, hDbc, &hStmt );
	if ((RetCode != SQL_SUCCESS) && ((RetCode != SQL_SUCCESS_WITH_INFO))) {
		strcpy(FunctionName, "SQLAllocHandle(STMT)");
		goto DBC_Error;
	}

	ColumnsCount= 0 ;
	ResultSet=NULL;

	// Support for ASA extension statement: Message to Client
	RetCode = SQLSetConnectAttr(hDbc, ASA_REGISTER_MESSAGE_CALLBACK,
								(SQLPOINTER) &my_msgproc, SQL_IS_POINTER );
	if( RetCode != SQL_SUCCESS ) {
		strcpy(FunctionName, "SQLSetConnectAttr");
		goto DBC_Error;
	}

//	SQLGetInfo(hDbc, SQL_DRIVER_ODBC_VER, OutConnectString, sizeof(OutConnectString), &i);
//	Log(LOG_ITALIC, "ODBC version = %s\n", OutConnectString);

	return TRUE;
}

void DisconnectFromDatabase() {
	SQLDisconnect( hDbc );
	SQLFreeConnect( hDbc );
	SQLFreeEnv( hEnv );
}

void CloseCursor() {
	SQLCloseCursor(hStmt);
	Log(LOG_DEBUG | LOG_ITALIC, "previous cursor closed, free %d columns\n", ColumnsCount);
	if (ResultSet != NULL) {
		free(ResultSet);
	}
	ResultSet=NULL;
	ColumnsCount= 0 ;
	Log(LOG_DEBUG | LOG_ITALIC, "Columns and ResultSet cleared\n");
}

BOOLEAN Send(char *Format, ...) {
	int i;
    va_list ap;

	// clean previous resultset	
	if (ResultSet != NULL) {
		CloseCursor();
	}

    va_start(ap, Format);
    vsprintf(Command, Format, ap);
    va_end(ap);
	Log(LOG_DEBUG | LOG_ITALIC, "Command created\n");

	Log(LOG_DEBUG | LOG_ITALIC, "%s\n", Command);
	RetCode = SQLExecDirect( hStmt, (SQLCHAR FAR*)Command, SQL_NTS );
	if( (RetCode != SQL_SUCCESS) && (RetCode != SQL_SUCCESS_WITH_INFO) && (RetCode != SQL_NO_DATA_FOUND) ) {
		return ShowSqlError("SQLExecDirect");
	}
	Log(LOG_DEBUG | LOG_ITALIC, "Command send\n");

	// if last command returns result set - prepare to fetch it.
	RetCode = SQLNumResultCols(hStmt, &ColumnsCount);
	if((RetCode != SQL_SUCCESS) && (RetCode != SQL_SUCCESS_WITH_INFO)) return ShowSqlError("SQLNumResultCols");
	if (ColumnsCount> 0 ) {
		SQLSMALLINT dummy;

		ResultSet = (Column*)malloc(ColumnsCount * sizeof(Column));
		for(i= 0 ; i<ColumnsCount; i++) {
			RetCode = SQLDescribeCol(hStmt, i+ 1 , ResultSet[i].ColumnName, sizeof(ResultSet[i].ColumnName),
						&dummy, &(ResultSet[i].ColumnType),
						&(ResultSet[i].ColumnSize), &(ResultSet[i].DecimalPoint), &dummy);
			if( (RetCode != SQL_SUCCESS) && (RetCode != SQL_SUCCESS_WITH_INFO) )
				return ShowSqlError("SQLDescribeCol");
			Log(LOG_DEBUG | LOG_ITALIC, "%s %d %d\n", ResultSet[i].ColumnName, ResultSet[i].ColumnType, ResultSet[i].ColumnSize);

			switch(ResultSet[i].ColumnType) {
				case SQL_VARCHAR:
				case SQL_LONGVARCHAR:
				case SQL_NUMERIC:
					ResultSet[i].ColumnType = SQL_CHAR;
					break;
				case SQL_BIGINT:
					ResultSet[i].ColumnType = SQL_C_UBIGINT;
			}

			// and bind column to created buffer
			RetCode = SQLBindCol(hStmt, i+ 1 , ResultSet[i].ColumnType, (SQLPOINTER)(ResultSet[i].Data),
								sizeof(ResultSet[i].Data), &(ResultSet[i].DataRetrieved));
			if( (RetCode != SQL_SUCCESS) && (RetCode != SQL_SUCCESS_WITH_INFO) )
				return ShowSqlError("SQLBindCol");
		}
	}

	return TRUE;
}

BOOLEAN Fetch() {
	if(ResultSet==NULL) return FALSE;

	RetCode=SQLFetch(hStmt);
	if( (RetCode == SQL_SUCCESS) || (RetCode == SQL_SUCCESS_WITH_INFO) ) return TRUE;
	else if (RetCode == SQL_NO_DATA) {
		SQLCloseCursor(hStmt);
		return FALSE;
	}
	else return ShowSqlError("SQLFetch");
}

int GetColumnsCount(void) { return ColumnsCount; }

char *GetColumnName(int ColumnIndex) {
	if (ColumnIndex>=ColumnsCount) {
		//Log(LOG_RED, "Result set has only %d columns, can not read column %d\n", ColumnsCount, ColumnIndex);
		return NULL;
	}
	return ResultSet[ColumnIndex].ColumnName;
}


BOOLEAN IsColumnNull(int ColumnIndex) {
	if (ResultSet[ColumnIndex].DataRetrieved == SQL_NULL_DATA) {
		return TRUE;
	}
	return FALSE;
}

char *GetColumnAsString(int ColumnIndex) {
	if (ColumnIndex>=ColumnsCount) {
		Log(LOG_RED, "Result set has only %d columns, can not read column %d\n", ColumnsCount, ColumnIndex);
		return NULL;
	}

	if (ResultSet[ColumnIndex].DataRetrieved == SQL_NULL_DATA) {
		SqlMessage[ 0 ]= 0 ;
		return SqlMessage;
	}

	switch(ResultSet[ColumnIndex].ColumnType) {
	case SQL_C_UBIGINT:
		sprintf(SqlMessage, "%lu", *((unsigned _int64*)(ResultSet[ColumnIndex].Data)));
		return (char*)(SqlMessage);

	case SQL_INTEGER:
		sprintf(SqlMessage, "%ld", *((long int*)(ResultSet[ColumnIndex].Data)));
		return (char*)(SqlMessage);
		

	case SQL_DOUBLE:
		sprintf(SqlMessage, "%lg",
			*((long double*)(ResultSet[ColumnIndex].Data)));
		return (char*)(SqlMessage);

	case SQL_DATE:
		if(	(((TIMESTAMP_STRUCT*)(ResultSet[ColumnIndex].Data))->year ==  0 ) &&
			(((TIMESTAMP_STRUCT*)(ResultSet[ColumnIndex].Data))->month ==  0 ) &&
			(((TIMESTAMP_STRUCT*)(ResultSet[ColumnIndex].Data))->day ==  0 )) {
			SqlMessage[ 0 ]= 0 ;
		} else {
			sprintf(SqlMessage, "%04d-%02d-%02d", 
				((TIMESTAMP_STRUCT*)(ResultSet[ColumnIndex].Data))->year,
				((TIMESTAMP_STRUCT*)(ResultSet[ColumnIndex].Data))->month,
				((TIMESTAMP_STRUCT*)(ResultSet[ColumnIndex].Data))->day);
		}
		return (char*)(SqlMessage);

	case SQL_NUMERIC:
	case SQL_CHAR:
		//Log(LOG_DEBUG | LOG_ITALIC, "%s\n", (char*)(ResultSet[ColumnIndex].Data));
		return (char*)(ResultSet[ColumnIndex].Data);

	default:
		Log(LOG_RED, "Do not now how to convert field %s, type %d to string\n",
			ResultSet[ColumnIndex].ColumnName, ResultSet[ColumnIndex].ColumnType);
		return NULL;
	}
}

BOOLEAN IsFieldNull(char *ColumnName) {
	int i;
	for(i= 0 ; i<ColumnsCount; i++) {
		if (strcmpi(ColumnName, ResultSet[i].ColumnName)== 0 ) {
			if (ResultSet[i].DataRetrieved == SQL_NULL_DATA) {
				return TRUE;
			} else {
				return FALSE;
			}
		}
	}
	Log(LOG_RED, "Can not find column %s in current result set\n", ColumnName);
	return TRUE;
}

char *GetFieldAsString(char *ColumnName) {
	int i;
	for(i= 0 ; i<ColumnsCount; i++) {
		if (strcmpi(ColumnName, ResultSet[i].ColumnName)== 0 )
			return GetColumnAsString(i);
	}
	Log(LOG_RED, "Can not find column %s in current result set\n", ColumnName);
	return NULL;
}


int GetColumnAsInteger(int ColumnIndex) {
	if (ColumnIndex>=ColumnsCount) {
		Log(LOG_RED, "Result set has only %d columns, can not read column %d\n", ColumnsCount, ColumnIndex);
		return  0 ;
	}

	switch(ResultSet[ColumnIndex].ColumnType) {
	case SQL_C_UBIGINT:
		return (int)(*((unsigned _int64*)(ResultSet[ColumnIndex].Data)));

	case SQL_INTEGER:
		return *((long int*)(ResultSet[ColumnIndex].Data));

	case SQL_NUMERIC:
	case SQL_CHAR:
		return atoi((char*)(ResultSet[ColumnIndex].Data));

	default:
		Log(LOG_RED, "Do not now how to convert field %s, type %d to integer\n",
			ResultSet[ColumnIndex].ColumnName, ResultSet[ColumnIndex].ColumnType);
		return  0 ;
	}
}

int GetFieldAsInteger(char *ColumnName) {
	int i;
	for(i= 0 ; i<ColumnsCount; i++) {
		if (strcmpi(ColumnName, ResultSet[i].ColumnName)== 0 )
			return GetColumnAsInteger(i);
	}
	Log(LOG_RED, "Can not find column %s in current result set\n", ColumnName);
	return  0 ;
}



BOOLEAN ShowSqlError(char *FunctionName) {
	int i;
	for (i= 1 ; SQLGetDiagRec(SQL_HANDLE_STMT, hStmt, i, SqlState, &SqlError,
						SqlMessage, sizeof(SqlMessage), &MessageLen) != SQL_NO_DATA; i++) {
		Log(LOG_RED, "%s failed: %s %d %s\n%s\n", FunctionName, SqlState, SqlError, SqlMessage, Command);
	}
	return FALSE;
}
...
Рейтинг: 0 / 0
SELECT из VIEW с конкатенацией падает в программе на C++
    #35375458
Бока
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо!
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / SELECT из VIEW с конкатенацией падает в программе на C++
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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