MS SQL и строки

ODBC

Модератор: Andrew™

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7373
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

MS SQL и строки

Сообщение Игорь Столяров »

Привет всем !

Среда C62.0049 + MS SQL 2000

В Clarion написан вызов хранимой процедуры MS SQL, в которой в качестве параметра передается символьная строка, описанная как CString.

Хранимая процедура MS SQL записывает в эту строку некоторые данные, которые попадают назад в программу. Все работает OK !

Точнее работало ... ;(
Вопрос: какой максимальной длины строку таким образом (через параметр х.п.) можно использовать ?

И как вообще можно передать через параметр х.п. строку длиной, например до сотни килобайт ? (в моем случае это сформированный х.п. отчет в формате HTML, т.е. просто текст).

Заранее спасибо за любую подсказку !
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3133
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Сообщение Дед Пахом »

судя по тому, что varchar имеет макс. длину 8000 символов, а тип text допустим в объявлении процедурных параметров, может быть, им и воспользоваться?
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7373
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Сообщение Игорь Столяров »

Использовать TEXT мешает одна мелкая особенность MS SQL.
Вместо данных он подставляет ссылку на это поле, т.е. нет
передачи по значению. Если работать только в T.SQL - то
все равно, а вот если через вызов х.п. - то проблема ... ;)
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3133
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Сообщение Дед Пахом »

ну тогда может формировать html-файл и передавать в хп его имя, а внутри хп его читать.
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7373
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Сообщение Игорь Столяров »

Ха ! Тогда придется файловый доступ открывать. А я нехочу даже таблицы в MS SQL открывать, весь доступ к данным только через ХП, вызов которых очень сильно ограничен правами юзеров и протоколируется на стороне сервера MS SQL - кто, когда, что спрашивал и т.д. Безопасность хре..ва ! Иначе сертификацию органов система не пройдет. Да и сервер БД - совсем в другом городе ... ;)

В принципе - проблему решил. Если возвращаемый блок текста более 4000 Byte (UNICOD) - то он дробится на кусочки 4000 Byte и ими возвращается. А на стороне программы - кусочки склеиваются. Все работает. Прогнал для теста несколько раз блоки HTML текста по 30-40 Mbyte - все OK ! Просто как-то через ж...у - думал может можно проще ?
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

Сообщение Andrew™ »

Игорь Столяров писал(а): В принципе - проблему решил. Если возвращаемый блок текста более 4000 Byte (UNICOD) - то он дробится на кусочки 4000 Byte и ими возвращается. А на стороне программы - кусочки склеиваются. Все работает. Прогнал для теста несколько раз блоки HTML текста по 30-40 Mbyte - все OK ! Просто как-то через ж...у - думал может можно проще ?
чтобы снять ограничение на размер OUT параметра, его принимать надо как BLOB (TEXT), юзать при этом соответсвующие ODBC API функции SQLPUTDATA/SQLGETDATA, именно их т к DRIVER('MSSQL') работает именно через ODBC.

хотя, подумав, при использовании FILE,DRIVER('MSSQL') в C6 и выше, где появилась поддержка BLOB полей можно и проще, хотя сам не проверял, в ХП в конце делаешь select @retTEXT
в программе:

Код: Выделить всё

 FILE{PROP:SQL} = 'exec mySP'
 NEXT(FILE)
по идее в FILE:BLOBFIELD должЁн попасть результат из ХП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7373
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Сообщение Игорь Столяров »

По идее - да, точно знаю что техт (строку) так можно получить.
Будет ли произведена загрузка результата в BLOB ? Вопрос ...
Я попробую, спасибо. Хорошо, что есть варианты ... ;)

И существует еще "обратная сторона медали" - а как загнать
обратно - из программы в ХП большой объем строковых данных ?
Понятно, что передача кусками из программы и склеивание на
стороне ХП работать будет ...
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

Сообщение Andrew™ »

Игорь Столяров писал(а):По идее - да, точно знаю что техт (строку) так можно получить.
Будет ли произведена загрузка результата в BLOB ? Вопрос ...
Я попробую, спасибо. Хорошо, что есть варианты ... ;)

И существует еще "обратная сторона медали" - а как загнать
обратно - из программы в ХП большой объем строковых данных ?
Понятно, что передача кусками из программы и склеивание на
стороне ХП работать будет ...
тут опять есть сразу два варианта, немного сложный в реализации но короткий в исполнении и более простой в реализации и более длинный в исполнении:

1. юзаем SQLPUTDATA для передачи в ХП безразмерных полей типа TEXT

2. в DCT декларируем файл с BLOB полем, в качестве имени глобальная переменная, в программе создаём эту #временую таблицу
и штатными средствами загоняем туда запись, далее вызываем ХП которая читает эту запись из этой таблицы

есть ещё третий вариант, заюзать MAV Direct ODBC, там эти операции штатные.
Ответить