powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / ODBC, приём строки более 255 символов
21 сообщений из 21, страница 1 из 1
ODBC, приём строки более 255 символов
    #35446823
Фотография savosin_sergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
(mssql 2000 +pb9)
Задача: получение строки с сообщением из хранимой процедуры. Делаю так: объявляю аргумент output типа varchar(1000)
Код: plaintext
1.
2.
create procedure mo_do_entrance @doc_id int, @s_err varchar( 1000 ) output
as
 ...
и на клиенте его считываю:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
declare a_proc procedure for mo_do_entrance @doc_id=:doc_id, @s_err='' OUTPUT;
execute a_proc;

if sqlca.sqlcode<> 0  then
	rollback;
	close a_proc;
	return;
end if

fetch a_proc into :s_err;
close a_proc;
commit;


if len(s_err)> 0  then
	messagebox('Принятие к учёту', 'Произошла ошибка:~r~n' +s_err, Exclamation!)
else
	messagebox('Принятие к учёту', 'Операция выполнена успешно.')
end if
Проблема: ODBC обрубает возвращаемую строку до (прибл.) 255 символов (точно не измерял). Как получить строку без обрубания?
Наивно попробовал объявить аргумент типом text , но этому типу в mssql 2000 присваивать низя. Что предложите? Сообщение об ошибке передавать через временную таблицу?
Спасибо.
...
Рейтинг: 0 / 0
ODBC, приём строки более 255 символов
    #35447237
Uzrptav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
может быть из -за этого?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
 10 . 4 . 1 . The CHAR and VARCHAR Types

The CHAR and VARCHAR types are similar, but differ in the way they are stored and retrieved.

The CHAR and VARCHAR types are declared with a length that indicates the maximum number of characters you want to store. For example, CHAR( 30 ) can hold up to  30  characters. 
(Before MySQL  4 . 1 , the length is interpreted as number of bytes.)

The length of a CHAR column is fixed to the length that you declare when you create the table. The length can be any value from  0  to  255 . (Before MySQL  3 . 23 , the length of CHAR may be from  1  to  255 .) 
When CHAR values are stored, they are right-padded with spaces to the specified length. When CHAR values are retrieved, trailing spaces are removed.

Values in VARCHAR columns are variable-length strings. 
The length can be specified as a value from  1  to  255  before MySQL  4 . 0 . 2  and  0  to  255  as of MySQL  4 . 0 . 2 .

ОТСЮДА
...
Рейтинг: 0 / 0
ODBC, приём строки более 255 символов
    #35447272
Uzrptav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
mssql  2000 
Сорри, не заметил..

Оно? Maximum characters per column
...
Рейтинг: 0 / 0
ODBC, приём строки более 255 символов
    #35447382
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Uzrptav
Код: plaintext
mssql  2000 
Сорри, не заметил..

Оно? Maximum characters per column
Не оно, там про настройки Query Analyzer'а говориться.
...
Рейтинг: 0 / 0
ODBC, приём строки более 255 символов
    #35447427
Фотография savosin_sergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Факт, что ODBC (и соответственно native драйвер PB) не переваривает char и varchar более (примерно) 255 символов, но столбцы таблиц с типом text нормально отбирает. А вот как быть с текстовым параметром процедуры?
Да и вообще, всё что ли на интерфейсе OLE DB в PB работают? Как длинные строки из БД получаете?
...
Рейтинг: 0 / 0
ODBC, приём строки более 255 символов
    #35447432
Фотография savosin_sergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То есть, как длинные строки из хранимой процедуры получаете?
...
Рейтинг: 0 / 0
ODBC, приём строки более 255 символов
    #35447449
oleg_shishkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
при вызове процедуры передавайте ей переменную уже проиницилизированную строкой в 1000 символов

string s_err = space(1000)
...
Рейтинг: 0 / 0
ODBC, приём строки более 255 символов
    #35447826
Фотография savosin_sergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oleg_shishkinпри вызове процедуры передавайте ей переменную уже проиницилизированную строкой в 1000 символов

string s_err = space(1000)
oleg_shishkin, Вы когда-нибудь хранимую вызывали с output-параметрами на power script? Это Вам не winapi, которым действительно достаточно проинициализировать переменную.. Здесь проблема ODBC.

Я спрашивал не о методе преодоления ограничения на varchar в аргументе процедуры, а о других работающих подходах к тому, чтобы получить сообщение об ошибке из хранимой процедуры!

Разъясняю ещё раз задачу: обработка данных производится в хранимой процедуре, на клиентскую часть необходимо передать длинное сообщение, например "Ошибка обработки такого-то объекта с параметрами: ...". Передача сообщения через output-аргумент процедуры приводит к отсечению части текста из-за особенности PB-native драйвера. Какие другие подходы предложите?

Один из вариантов -- использовать специальную таблицу, в которой в поле типа text хранить сообщение. Но как-то сложно для такой не очень долгой обработки. Если бы процедура отрабатывала длительное время -- то можно использовать таблицу-журнал, в которой хранить этап обработки и возможное сообщение пользователю. Но мой случай работает быстро, секунды, только сообщение пользователю большое.

Второй подход -- собрать его на клиенте сообщение об ошибке основываясь на каких-либо кодах, которые занимают меньше места, чем output-переменная типа varchar.

Ещё один подход придумал -- использовать несколько output-переменных для сообщения и склеивать их на клиенте.

Но все эти подходы мне не нравятся, поделитесь, кто как возвращает сообщения из хранимой процедуры? Может это вообще "плохой тон", а возвращать надо только код ошибки и на клиенте его расшифровывать, типа 0 = "Всё хорошо", 1 = "Всё плохо", 2 = "Могло быть и хуже".. :-)
...
Рейтинг: 0 / 0
ODBC, приём строки более 255 символов
    #35448265
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
savosin_sergeyКак длинные строки из БД получаете?
Они в БД как blob. Получаю отлично. А потом перевожу в string. Так и живем. :)
...
Рейтинг: 0 / 0
ODBC, приём строки более 255 символов
    #35448303
Фотография savosin_sergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AIS savosin_sergeyКак длинные строки из БД получаете?
Они в БД как blob. Получаю отлично. А потом перевожу в string. Так и живем. :)
Из таблицы или из хранимой процедуры? Пример с получением длиннющей строки из хранимой процедурой можно?

text - я считал его аналогом bloba, размер поля text - до 2Гигабайт
...
Рейтинг: 0 / 0
ODBC, приём строки более 255 символов
    #35448563
oleg_shishkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
oleg_shishkin, Вы когда-нибудь хранимую вызывали с output-параметрами на power script? Это Вам не winapi, которым действительно достаточно проинициализировать переменную.. Здесь проблема ODBC.

У нас все так происходит :)
В вызываемую процедуру передается не переменная, а указатель, где хранится символьный массив
. Соответсвенно если под него не будет выделено место, то возвращаемые данные будут просто усечены. Все массивы и строковые переменные передаются по ссылке (указателем - ref). Поэтому никто под них кроме Вас выделять место не будет.
...
Рейтинг: 0 / 0
ODBC, приём строки более 255 символов
    #35448628
Фотография savosin_sergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oleg_shishkin
У нас все так происходит :)
В вызываемую процедуру передается не переменная, а указатель, где хранится символьный массив
. Соответсвенно если под него не будет выделено место, то возвращаемые данные будут просто усечены. Все массивы и строковые переменные передаются по ссылке (указателем - ref). Поэтому никто под них кроме Вас выделять место не будет.

Пожалуйста, приведите пример. Не понимаю, о каких указателях на строку в хранимых процедурах идёт речь
...
Рейтинг: 0 / 0
ODBC, приём строки более 255 символов
    #35451036
oleg_shishkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
savosin_sergey
(mssql 2000 +pb9)

Задача: получение строки с сообщением из хранимой процедуры. Делаю так: объявляю аргумент output типа varchar(1000)
Код: plaintext
1.
2.
create procedure mo_do_entrance @doc_id int, @s_err varchar( 1000 ) output
as
 ...
и на клиенте его считываю:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
declare a_proc procedure for mo_do_entrance @doc_id=:doc_id, @s_err='' OUTPUT;
execute a_proc;

if sqlca.sqlcode<> 0  then
	rollback;
	close a_proc;
	return;
end if

fetch a_proc into :s_err;
close a_proc;
commit;


if len(s_err)> 0  then
	messagebox('Принятие к учёту', 'Произошла ошибка:~r~n' +s_err, Exclamation!)
else
	messagebox('Принятие к учёту', 'Операция выполнена успешно.')
end if

Указанный метод вызывает ошибку в PB9 при работе с ODBC
правильней работать
объявляете у объекта транзакция в Local External Functions свою процедуру

FUNCTION long mo_do_entrance(int doc_id,ref string s_err) RPCFUNC ALIAS FOR "dbo.mo_do_entrance"

и вызываете соответственно

string s_err=space(1000)
long doc_id,ret_value

......
ret_value = sqlca.mo_do_entrance(doc_id,s_err)

и далее по тексту
...
Рейтинг: 0 / 0
ODBC, приём строки более 255 символов
    #35453184
Фотография savosin_sergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oleg_shishkin
Указанный метод вызывает ошибку в PB9 при работе с ODBC
правильней работать
объявляете у объекта транзакция в Local External Functions свою процедуру

FUNCTION long mo_do_entrance( int doc_id,ref string s_err) RPCFUNC ALIAS FOR "dbo.mo_do_entrance"

и вызываете соответственно

string s_err=space(1000)
long doc_id,ret_value

......
ret_value = sqlca.mo_do_entrance(doc_id,s_err)

и далее по тексту
oleg_shishkin, спасибо за ответ! Кстати, у меня в хранимой процедуре аргумент doc_id типа int, этому TSQL-типу в power script соответствует тип long.

Сделал, как Вы предложили - с использованием Local External Function, предварительно добавив наследника transaction в приложение. Объявил функцию:
Код: plaintext
function long mo_do_entrance(long doc_id, ref string s_err) RPCFUNC ALIAS FOR 'dbo.mo_do_entrance'
Вызываю её:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
long ret_value, doc_id
string s_err
s_err = space( 255 )

ret_value = sqlca.mo_do_entrance(doc_id, s_err)
if sqlca.sqlcode<> 0  then
	sqlcode = sqlca.sqlcode
	sqlerrtext = sqlca.sqlerrtext
	rollback;
	messagebox('Обработка', 'Внимание! Ошибка:~n' +&
		'(' +string(sqlcode) +') ' +sqlerrtext, StopSign!)
	return  0 ;
end if

if len(s_err)> 0  then
	messagebox('Произошла ошибка', s_err, Exclamation!)
	return  0 
end if
Если строковую переменную не инициализировать, то ничего не получаю в ней после вызова, если инициализирую - то насколько я её пробелами заполнил, настолько результата в ней и получаю. Но! Если инициализировать более чем 255-ю пробелами, но после вызова функции, получаю ошибку:
Код: plaintext
1.
(- 1 ) A SQLServer request resulted in a bad return code or status but no error message was returned

Я же говорил, ODBC не обманешь - у неё varchar всегда не более 255 символов! другое дело - text или blob.

А Вы уверены, что Ваш пример работает на native драйвере, а не на OLE DB?
...
Рейтинг: 0 / 0
ODBC, приём строки более 255 символов
    #35453272
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что значит "Если инициализировать более чем 255-ю пробелами, но после вызова функции" ?
...
Рейтинг: 0 / 0
ODBC, приём строки более 255 символов
    #35453742
Фотография savosin_sergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ФилиппА что значит "Если инициализировать более чем 255-ю пробелами, но после вызова функции" ?
опечатка. Если инициализировать 256 - 1000 пробелами, ТО после вызова функции в SQLCA будет указанная ошибка
...
Рейтинг: 0 / 0
ODBC, приём строки более 255 символов
    #35454425
oleg_shishkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вы определитесь - если вы используете драйвер MSS - то да он поддерживате только 255 символьные строки, драйвер ODBC (желатетельно Microsoft Native Client) - любые. Вот ссылка на
Microsoft Native Client
http://download.microsoft.com/download/4/4/D/44DBDE61-B385-4FC2-A67D-48053B8F9FAD/sqlncli.msi
...
Рейтинг: 0 / 0
ODBC, приём строки более 255 символов
    #35454816
Фотография savosin_sergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oleg_shishkinВы определитесь - если вы используете драйвер MSS - то да он поддерживате только 255 символьные строки, драйвер ODBC (желатетельно Microsoft Native Client) - любые.
Используем драйвер MSS. Я не подумал, что кроме OLE DB и MSS драйверов есть ещё и ODBC!
Столбцы типа text драйвер MSS переваривает, даже входные параметры процедуры типа text передаются нормально, а может и выходные нормально принимаются (не пробовал), но что от этого толку: я не знаю, как в хранимой процедуре переменной типа text присвоить сообщение об ошибке!
...
Рейтинг: 0 / 0
ODBC, приём строки более 255 символов
    #35459268
oleg_shishkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
savosin_sergey oleg_shishkinВы определитесь - если вы используете драйвер MSS - то да он поддерживате только 255 символьные строки, драйвер ODBC (желатетельно Microsoft Native Client) - любые.
Используем драйвер MSS. Я не подумал, что кроме OLE DB и MSS драйверов есть ещё и ODBC!

Драйвер MSS больше не поддерживается. Переходите на Microsoft Native Client
он содержит в себе ODBC и OLEDB драйвера и поддерживает все новые версии SQL сервера. И в нем нет проблем с длинными символьными строками. Если нужна строка соединения - выложу.
...
Рейтинг: 0 / 0
ODBC, приём строки более 255 символов
    #35461596
Фотография savosin_sergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oleg_shishkin
Драйвер MSS больше не поддерживается. Переходите на Microsoft Native Client
он содержит в себе ODBC и OLEDB драйвера и поддерживает все новые версии SQL сервера. И в нем нет проблем с длинными символьными строками. Если нужна строка соединения - выложу.
Да, покажите пожалуйста. А в чём его принципиальное отличие от OLE DB-драйвера, который поставляется с power builder? В чёи преимущество?
...
Рейтинг: 0 / 0
ODBC, приём строки более 255 символов
    #35461837
oleg_shishkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
savosin_sergey
Да, покажите пожалуйста. А в чём его принципиальное отличие от OLE DB-драйвера, который поставляется с power builder? В чёи преимущество?
SQLCA.DBMS = "ODBC"
SQLCA.DBParm = "ConnectString='DRIVER=SQL Native Client;SERVER={SERVER};DATABASE={DATABASE};Uid={LOGID};Pwd={LOGPASS};Trusted_Connection=no;APP={APP}',прочие_параметры_соединения"

в {} указываете ваши данные

стандарту ODBC больше десятка лет и это СТАНДАРТ, а мелкомягкие меняют объекты и методы доступа к данным каждые 3 года (MSS,объекты DAO,ADO,OLEDB v1 и v2, и еще куча новых) - и менять каждый раз программу - одно мучение
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / ODBC, приём строки более 255 символов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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