Таблица сервера SQL для проблем с таблицей FoxPro

Я пытаюсь получить некоторые таблицы SQL-сервера в FoxPro dbf.

Мне удалось успешно экспортировать данные bcp таким образом, что при использовании мастера импорта FoxPro данные импортируются правильно. Но когда я пытаюсь сделать это в командной строке, я могу в лучшем случае импортировать первые несколько столбцов, а все остальные столбцы исчезают.

В следующем каталоге я поместил файл .CSV и успешную таблицу импорта DBF.

директория с 2 файлами здесь

Мне нужно выяснить, как импортировать эти файлы CSV из командной строки в FoxPro.

Я пробовал различные комбинации;

APPEND FROM D:\work\oh\output\sqloutput.csv TYPE CSV
APPEND FROM D:\work\oh\output\sqloutput.csv DELIMITED WITH TAB

Ничего из этого не работает.

Любые идеи? Я знаю, что делал это раньше, я не помню, в чем была хитрость...


person RIDER    schedule 19.09.2012    source источник


Ответы (2)


Вау.. Я думаю, вы делаете это неправильно... Просто выполните простой SQLCONNECT() для базы данных SQL, запустите запрос к источнику данных, хранимой процедуре или чему-то еще, и он будет в курсоре в VFP.. Затем вы можете просто «скопировать» в DBF, и все готово... Что-то вроде

lnH = SQLCONNECT()

(появляется диалоговое окно соединений ODBC).

если бы не это, вы могли бы сделать

lnH = SQLStringConnect("Provider=... for sql server, server name, etc")

потом

if lnH > 0
   sqlexec( lnH, "select * from someTableOnServer where whateverConditon", "C_LocalCursor" )

   select C_LocalCursor
   copy to PermanentTable

   sqldisconnect( lnH )
endif 

Теперь, если есть столбцы, имена столбцов которых длиннее 10 символов, и вы НЕ используете контейнер базы данных, вам, возможно, придется настроить, либо изменив запрос на GET имена столбцов, либо повторно выбрав данные после того, как они будут локальными, чтобы соответствовать в 10-символьный контекст таблицы, отличный от dbc.

Другим примером построения запроса может быть -- для простоты чтения при наборе текста я использую текст/конечный текст, такой как

text to lcSQLCmd noshow pretext 1+2
   select
         t1.Column1,
         t1.AVeryLongColumnName as AVLColName,
         t1.AnotherLongColumn2  as ALC2,
         t1.SomeFlag,
         t2.ColumnFromAnotherTable as CFATbl,
         t2.AnotherCol
      from
         SQLDatabase.dbo.SQLTable1 t1
            join SQLDatabase.dbo.SQLTable2 t2
               on t1.SomeKey = t2.SomeKey
      where
         t1.SomeCriteria = 'whatever'
      order by
         t1.SomeFlag
endtext

*/ Then, to "clean up" the string for VFP to pass properly, 
*/ strip out the cr/lf from the text such as
lcSQLCmd = chrtran( lcSQLCmd, chr(13)+chr(10), "" )

*/ THEN, pass this command through sqlexec()
sqlexec( lnH, lcSQLCmd, "C_LocalCursor" )

Во-вторых, очевидно, НАМНОГО легче читать то, что вы пытаетесь получить, и обратите внимание, что я также предварительно сократил длинные имена столбцов до 10-символьного предела имени столбца VFP, отличного от DBC. Затем просто скопируйте, как в первом примере.

person DRapp    schedule 19.09.2012
comment
Я очень ценю ваш проницательный и подробный ответ. Я редко работаю в FoxPro и вообще не думал об этом подходе. (иногда, когда человек очень близок к рабочему решению с другим подходом, он даже не думает об изменении стратегии.) Это сработало отлично, и я также кое-чему научился. Спасибо. - person RIDER; 20.09.2012

Все ли поля в принимающей таблице FoxPro расположены в том же порядке и имеют тот же тип данных, что и столбцы в CSV, которые вы пытаетесь добавить в нее? Все ли они достаточно велики, чтобы справиться с данными? Убедились ли вы, что ни одно из текстовых полей в CSV не содержит разделитель полей в своем тексте?

person kevinw    schedule 19.09.2012
comment
Да, да. Если бы текстовое поле случайно содержало разделитель поля, я бы ожидал, что импорт прервется в середине записи, успешно импортировав по крайней мере начальные записи X.. (Я думаю?) - person RIDER; 20.09.2012