MS SQL и строки
Модератор: Andrew™
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
- Игорь Столяров
- Ветеран движения
- Сообщения: 7373
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 13 раз
- Поблагодарили: 48 раз
MS SQL и строки
Привет всем !
Среда C62.0049 + MS SQL 2000
В Clarion написан вызов хранимой процедуры MS SQL, в которой в качестве параметра передается символьная строка, описанная как CString.
Хранимая процедура MS SQL записывает в эту строку некоторые данные, которые попадают назад в программу. Все работает OK !
Точнее работало ... ;(
Вопрос: какой максимальной длины строку таким образом (через параметр х.п.) можно использовать ?
И как вообще можно передать через параметр х.п. строку длиной, например до сотни килобайт ? (в моем случае это сформированный х.п. отчет в формате HTML, т.е. просто текст).
Заранее спасибо за любую подсказку !
Среда C62.0049 + MS SQL 2000
В Clarion написан вызов хранимой процедуры MS SQL, в которой в качестве параметра передается символьная строка, описанная как CString.
Хранимая процедура MS SQL записывает в эту строку некоторые данные, которые попадают назад в программу. Все работает OK !
Точнее работало ... ;(
Вопрос: какой максимальной длины строку таким образом (через параметр х.п.) можно использовать ?
И как вообще можно передать через параметр х.п. строку длиной, например до сотни килобайт ? (в моем случае это сформированный х.п. отчет в формате HTML, т.е. просто текст).
Заранее спасибо за любую подсказку !
- Игорь Столяров
- Ветеран движения
- Сообщения: 7373
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 13 раз
- Поблагодарили: 48 раз
- Игорь Столяров
- Ветеран движения
- Сообщения: 7373
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 13 раз
- Поблагодарили: 48 раз
Ха ! Тогда придется файловый доступ открывать. А я нехочу даже таблицы в MS SQL открывать, весь доступ к данным только через ХП, вызов которых очень сильно ограничен правами юзеров и протоколируется на стороне сервера MS SQL - кто, когда, что спрашивал и т.д. Безопасность хре..ва ! Иначе сертификацию органов система не пройдет. Да и сервер БД - совсем в другом городе ...
В принципе - проблему решил. Если возвращаемый блок текста более 4000 Byte (UNICOD) - то он дробится на кусочки 4000 Byte и ими возвращается. А на стороне программы - кусочки склеиваются. Все работает. Прогнал для теста несколько раз блоки HTML текста по 30-40 Mbyte - все OK ! Просто как-то через ж...у - думал может можно проще ?
В принципе - проблему решил. Если возвращаемый блок текста более 4000 Byte (UNICOD) - то он дробится на кусочки 4000 Byte и ими возвращается. А на стороне программы - кусочки склеиваются. Все работает. Прогнал для теста несколько раз блоки HTML текста по 30-40 Mbyte - все OK ! Просто как-то через ж...у - думал может можно проще ?
чтобы снять ограничение на размер OUT параметра, его принимать надо как BLOB (TEXT), юзать при этом соответсвующие ODBC API функции SQLPUTDATA/SQLGETDATA, именно их т к DRIVER('MSSQL') работает именно через ODBC.Игорь Столяров писал(а): В принципе - проблему решил. Если возвращаемый блок текста более 4000 Byte (UNICOD) - то он дробится на кусочки 4000 Byte и ими возвращается. А на стороне программы - кусочки склеиваются. Все работает. Прогнал для теста несколько раз блоки HTML текста по 30-40 Mbyte - все OK ! Просто как-то через ж...у - думал может можно проще ?
хотя, подумав, при использовании FILE,DRIVER('MSSQL') в C6 и выше, где появилась поддержка BLOB полей можно и проще, хотя сам не проверял, в ХП в конце делаешь select @retTEXT
в программе:
Код: Выделить всё
FILE{PROP:SQL} = 'exec mySP'
NEXT(FILE)
- Игорь Столяров
- Ветеран движения
- Сообщения: 7373
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 13 раз
- Поблагодарили: 48 раз
По идее - да, точно знаю что техт (строку) так можно получить.
Будет ли произведена загрузка результата в BLOB ? Вопрос ...
Я попробую, спасибо. Хорошо, что есть варианты ...
И существует еще "обратная сторона медали" - а как загнать
обратно - из программы в ХП большой объем строковых данных ?
Понятно, что передача кусками из программы и склеивание на
стороне ХП работать будет ...
Будет ли произведена загрузка результата в BLOB ? Вопрос ...
Я попробую, спасибо. Хорошо, что есть варианты ...
И существует еще "обратная сторона медали" - а как загнать
обратно - из программы в ХП большой объем строковых данных ?
Понятно, что передача кусками из программы и склеивание на
стороне ХП работать будет ...
тут опять есть сразу два варианта, немного сложный в реализации но короткий в исполнении и более простой в реализации и более длинный в исполнении:Игорь Столяров писал(а):По идее - да, точно знаю что техт (строку) так можно получить.
Будет ли произведена загрузка результата в BLOB ? Вопрос ...
Я попробую, спасибо. Хорошо, что есть варианты ...
И существует еще "обратная сторона медали" - а как загнать
обратно - из программы в ХП большой объем строковых данных ?
Понятно, что передача кусками из программы и склеивание на
стороне ХП работать будет ...
1. юзаем SQLPUTDATA для передачи в ХП безразмерных полей типа TEXT
2. в DCT декларируем файл с BLOB полем, в качестве имени глобальная переменная, в программе создаём эту #временую таблицу
и штатными средствами загоняем туда запись, далее вызываем ХП которая читает эту запись из этой таблицы
есть ещё третий вариант, заюзать MAV Direct ODBC, там эти операции штатные.