Страница 1 из 1

MS SQL и строки

Добавлено: 11 Январь 2006, 18:12
Игорь Столяров
Привет всем !

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

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

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

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

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

Заранее спасибо за любую подсказку !

Добавлено: 12 Январь 2006, 9:14
Дед Пахом
судя по тому, что varchar имеет макс. длину 8000 символов, а тип text допустим в объявлении процедурных параметров, может быть, им и воспользоваться?

Добавлено: 12 Январь 2006, 14:31
Игорь Столяров
Использовать TEXT мешает одна мелкая особенность MS SQL.
Вместо данных он подставляет ссылку на это поле, т.е. нет
передачи по значению. Если работать только в T.SQL - то
все равно, а вот если через вызов х.п. - то проблема ... ;)

Добавлено: 12 Январь 2006, 15:02
Дед Пахом
ну тогда может формировать html-файл и передавать в хп его имя, а внутри хп его читать.

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

В принципе - проблему решил. Если возвращаемый блок текста более 4000 Byte (UNICOD) - то он дробится на кусочки 4000 Byte и ими возвращается. А на стороне программы - кусочки склеиваются. Все работает. Прогнал для теста несколько раз блоки HTML текста по 30-40 Mbyte - все OK ! Просто как-то через ж...у - думал может можно проще ?

Добавлено: 16 Январь 2006, 8:51
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 должЁн попасть результат из ХП

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

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

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

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

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

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

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