|
|
|
ODBC, приём строки более 255 символов
|
|||
|---|---|---|---|
|
#18+
(mssql 2000 +pb9) Задача: получение строки с сообщением из хранимой процедуры. Делаю так: объявляю аргумент output типа varchar(1000) Код: plaintext 1. 2. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. Наивно попробовал объявить аргумент типом text , но этому типу в mssql 2000 присваивать низя. Что предложите? Сообщение об ошибке передавать через временную таблицу? Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2008, 12:48 |
|
||
|
ODBC, приём строки более 255 символов
|
|||
|---|---|---|---|
|
#18+
может быть из -за этого? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ОТСЮДА ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2008, 14:33 |
|
||
|
ODBC, приём строки более 255 символов
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2008, 14:43 |
|
||
|
ODBC, приём строки более 255 символов
|
|||
|---|---|---|---|
|
#18+
Uzrptav Код: plaintext Оно? Maximum characters per column Не оно, там про настройки Query Analyzer'а говориться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2008, 15:19 |
|
||
|
ODBC, приём строки более 255 символов
|
|||
|---|---|---|---|
|
#18+
Факт, что ODBC (и соответственно native драйвер PB) не переваривает char и varchar более (примерно) 255 символов, но столбцы таблиц с типом text нормально отбирает. А вот как быть с текстовым параметром процедуры? Да и вообще, всё что ли на интерфейсе OLE DB в PB работают? Как длинные строки из БД получаете? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2008, 15:30 |
|
||
|
ODBC, приём строки более 255 символов
|
|||
|---|---|---|---|
|
#18+
То есть, как длинные строки из хранимой процедуры получаете? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2008, 15:31 |
|
||
|
ODBC, приём строки более 255 символов
|
|||
|---|---|---|---|
|
#18+
при вызове процедуры передавайте ей переменную уже проиницилизированную строкой в 1000 символов string s_err = space(1000) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2008, 15:36 |
|
||
|
ODBC, приём строки более 255 символов
|
|||
|---|---|---|---|
|
#18+
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 = "Могло быть и хуже".. :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2008, 17:05 |
|
||
|
ODBC, приём строки более 255 символов
|
|||
|---|---|---|---|
|
#18+
savosin_sergeyКак длинные строки из БД получаете? Они в БД как blob. Получаю отлично. А потом перевожу в string. Так и живем. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2008, 21:17 |
|
||
|
ODBC, приём строки более 255 символов
|
|||
|---|---|---|---|
|
#18+
AIS savosin_sergeyКак длинные строки из БД получаете? Они в БД как blob. Получаю отлично. А потом перевожу в string. Так и живем. :) Из таблицы или из хранимой процедуры? Пример с получением длиннющей строки из хранимой процедурой можно? text - я считал его аналогом bloba, размер поля text - до 2Гигабайт ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2008, 22:05 |
|
||
|
ODBC, приём строки более 255 символов
|
|||
|---|---|---|---|
|
#18+
oleg_shishkin, Вы когда-нибудь хранимую вызывали с output-параметрами на power script? Это Вам не winapi, которым действительно достаточно проинициализировать переменную.. Здесь проблема ODBC. У нас все так происходит :) В вызываемую процедуру передается не переменная, а указатель, где хранится символьный массив . Соответсвенно если под него не будет выделено место, то возвращаемые данные будут просто усечены. Все массивы и строковые переменные передаются по ссылке (указателем - ref). Поэтому никто под них кроме Вас выделять место не будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2008, 08:05 |
|
||
|
ODBC, приём строки более 255 символов
|
|||
|---|---|---|---|
|
#18+
oleg_shishkin У нас все так происходит :) В вызываемую процедуру передается не переменная, а указатель, где хранится символьный массив . Соответсвенно если под него не будет выделено место, то возвращаемые данные будут просто усечены. Все массивы и строковые переменные передаются по ссылке (указателем - ref). Поэтому никто под них кроме Вас выделять место не будет. Пожалуйста, приведите пример. Не понимаю, о каких указателях на строку в хранимых процедурах идёт речь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2008, 09:19 |
|
||
|
ODBC, приём строки более 255 символов
|
|||
|---|---|---|---|
|
#18+
savosin_sergey (mssql 2000 +pb9) Задача: получение строки с сообщением из хранимой процедуры. Делаю так: объявляю аргумент output типа varchar(1000) Код: plaintext 1. 2. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. Указанный метод вызывает ошибку в 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) и далее по тексту ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2008, 08:14 |
|
||
|
ODBC, приём строки более 255 символов
|
|||
|---|---|---|---|
|
#18+
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 Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. Код: plaintext 1. Я же говорил, ODBC не обманешь - у неё varchar всегда не более 255 символов! другое дело - text или blob. А Вы уверены, что Ваш пример работает на native драйвере, а не на OLE DB? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2008, 20:37 |
|
||
|
ODBC, приём строки более 255 символов
|
|||
|---|---|---|---|
|
#18+
А что значит "Если инициализировать более чем 255-ю пробелами, но после вызова функции" ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2008, 22:21 |
|
||
|
ODBC, приём строки более 255 символов
|
|||
|---|---|---|---|
|
#18+
ФилиппА что значит "Если инициализировать более чем 255-ю пробелами, но после вызова функции" ? опечатка. Если инициализировать 256 - 1000 пробелами, ТО после вызова функции в SQLCA будет указанная ошибка ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2008, 22:37 |
|
||
|
ODBC, приём строки более 255 символов
|
|||
|---|---|---|---|
|
#18+
Вы определитесь - если вы используете драйвер MSS - то да он поддерживате только 255 символьные строки, драйвер ODBC (желатетельно Microsoft Native Client) - любые. Вот ссылка на Microsoft Native Client http://download.microsoft.com/download/4/4/D/44DBDE61-B385-4FC2-A67D-48053B8F9FAD/sqlncli.msi ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.07.2008, 08:12 |
|
||
|
ODBC, приём строки более 255 символов
|
|||
|---|---|---|---|
|
#18+
oleg_shishkinВы определитесь - если вы используете драйвер MSS - то да он поддерживате только 255 символьные строки, драйвер ODBC (желатетельно Microsoft Native Client) - любые. Используем драйвер MSS. Я не подумал, что кроме OLE DB и MSS драйверов есть ещё и ODBC! Столбцы типа text драйвер MSS переваривает, даже входные параметры процедуры типа text передаются нормально, а может и выходные нормально принимаются (не пробовал), но что от этого толку: я не знаю, как в хранимой процедуре переменной типа text присвоить сообщение об ошибке! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.07.2008, 11:53 |
|
||
|
ODBC, приём строки более 255 символов
|
|||
|---|---|---|---|
|
#18+
savosin_sergey oleg_shishkinВы определитесь - если вы используете драйвер MSS - то да он поддерживате только 255 символьные строки, драйвер ODBC (желатетельно Microsoft Native Client) - любые. Используем драйвер MSS. Я не подумал, что кроме OLE DB и MSS драйверов есть ещё и ODBC! Драйвер MSS больше не поддерживается. Переходите на Microsoft Native Client он содержит в себе ODBC и OLEDB драйвера и поддерживает все новые версии SQL сервера. И в нем нет проблем с длинными символьными строками. Если нужна строка соединения - выложу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2008, 08:08 |
|
||
|
ODBC, приём строки более 255 символов
|
|||
|---|---|---|---|
|
#18+
oleg_shishkin Драйвер MSS больше не поддерживается. Переходите на Microsoft Native Client он содержит в себе ODBC и OLEDB драйвера и поддерживает все новые версии SQL сервера. И в нем нет проблем с длинными символьными строками. Если нужна строка соединения - выложу. Да, покажите пожалуйста. А в чём его принципиальное отличие от OLE DB-драйвера, который поставляется с power builder? В чёи преимущество? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2008, 22:27 |
|
||
|
ODBC, приём строки более 255 символов
|
|||
|---|---|---|---|
|
#18+
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, и еще куча новых) - и менять каждый раз программу - одно мучение ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2008, 08:06 |
|
||
|
|

start [/forum/topic.php?fid=15&msg=35447272&tid=1336584]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
63ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
| others: | 15ms |
| total: | 173ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...