Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Конвертация General в Memo... / 2 сообщений из 2, страница 1 из 1
14.12.2007, 02:56
    #35009211
CTAC-KO
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертация General в Memo...
Привет!

Дело в том, что если я хранил в бд непосредственно файлы, в полях типа Memo, то когда конвертил их на mySQL, то обнаружилось, что там соотв. тип поля может быть TEXT либо BLOB. Попробовал юзать MEDIUMTEXT (mySQL схавал все нормально), но при выборке VFP расчехляет такие данные как CHAR и отрубает от них на показ мне тока первые 255 символов... Тогда я перешел на mySQL на тип поля BLOB. Но при выборке в VFP все оказалось еще интереснее, их он трактует как General. Но зато не режет и приходит там то что надо. Теперь стал вопрос о изъятии данных из General-a этого. Поиски по форуму на эту тему натолкнули на функцию CAST. В итоге наваял в myExecSQL() такую байду:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
lnFCount = AFIELDS(arrFields)
      IF ASCAN(arrFields,"G", 1 ,m.lnFCount, 2 )# 0 
         *MESSAGEBOX("Achtung! General Fields!")
         lsSQLConvStr="SELECT" && в сию переменную соберем конвертационную команду SELECT
         FOR lnF =  1  TO m.lnFCount
             field_name = arrFields(m.lnF, 1 )
             field_type = arrFields(m.lnF, 2 )
             IF field_type = "G"
                lsSQLConvStr = lsSQLConvStr +" "+"CAST(CAST(field_name AS W) AS M) AS "+field_name
             ELSE
                lsSQLConvStr = lsSQLConvStr +" "+field_name
             ENDIF
             IF lnF # lnFCount
                lsSQLConvStr = lsSQLConvStr +","
             ENDIF
         ENDFOR
         lcTempName = "tmp"+SYS( 3 )
         lcTempDBF = SYS( 2023 ) + "\" + m.lcTempName +".dbf"
         lcTempFPT = SYS( 2023 ) + "\" + m.lcTempName +".fpt"
         lsSQLConvStr = lsSQLConvStr + " FROM " + m.lcTempName + " INTO CURSOR " + m.lcCursor + " READWRITE"
         * полученный от SQL-сервера курсор радостно сливаем в загашнег
         COPY TO (lcTempDBF)
         * и теперь его копию оттедова подымаем
         USE (lcTempDBF)
         * исполняем конвертационный SELECT
         &lsSQLConvStr 
         * закрываем конвертированный курсор
         USE IN (m.lcTempName)
         * убиваем его DBF
         ERASE (lcTempDBF)
         * ну и FPT
         ERASE (lcTempFPT)
      ENDIF
lcCursor - имя курсoра в который делается SQL-выборка и передаваемый параметр в функцию myExecSQL(), к примеру myExecSQL('test'). Т.е. по ходу любая выборка пройдет этот ытап и я сменю таки General на необходимый Memo. Вот тока еси бд подвалит большая, а молотить ее будет клиентский "цилик-300", чувствую это может зятянуццо...

Собственно не похвастаццо, а спросить, мож это как-то можно элегантнее замутить, без таких наворотов?
А, да, еще попробовал тупо в хедере таблицы подменить G на M, с помощью HIEW - прошло на ура! Но такой вариант кабы не по-сложнее будет... И так или иначе не обойдеццо без предварительного копирования... с другой стороны обойдеццо без CAST()
...
Рейтинг: 0 / 0
14.12.2007, 12:29
    #35010137
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертация General в Memo...
А не пробовали использовать CursorAdapter и его свойство MapBinary = .T. ?
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Конвертация General в Memo... / 2 сообщений из 2, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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