| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Базы данных под .NET > Сохранение результатов запроса к Interbase в DBF |
| Автор: XavierElf 6.8.2007, 09:15 | ||
| В общем возникла такая проблема: нужно сохранить результаты запроса к базе типа Interbase/Firebird в DBF. По форуму поискал, но что-то ничего путного не нашёл. Есть отдельно подключение к GDB базе, есть отдельно к DBF таблице(файлу), а так чтобы связать их - нету. Суть заключается в следующем: Примерный запрос к GDB базе:
DBF файл используется только для сохранения результатов этого запроса, причём каждый раз создаётся заново а не дополняется. Кто скалкивался с подобным посоветуйте плз, как реализовать? |
| Автор: LuMee 6.8.2007, 11:22 | ||
А в чем конкретно проблема? Выгружаем данные из Interbase в DataTable, потом создаем dbf-файлик и с помощью DataAdapter'a данные в него выгружаем. В лицах сохранение будет выглядеть наподобие такого:
|
| Автор: LuMee 6.8.2007, 14:17 |
| Не, ну INSERT-команда адаптеру полюбому нужна, чтобы он знал, как правильно данные сохранять. Можно попробовать без нее, вдруг догадается использовать названия полей DataTable'а (хотя сомневаюсь), тогда только надо будет ему connection string объяснить. P.S. да, под фразой "по числу полей" я подразумевал не 5000 наименований, а "по числу столбцов полученной выборки" |
| Автор: XavierElf 6.8.2007, 14:30 | ||
Так я в принципе разобрался, решил попробовать таким образом:
ЗЫЖ Создание dbf файла не стал указывать, это не так сложно... ЗЗЫЖ Сейчас опробую этот код и скажу результат. |
| Автор: XavierElf 6.8.2007, 15:43 | ||
Что-то не проходит эта команды выдаётся ошибка:
Что бы это могло значить - непонятно... |
| Автор: LuMee 7.8.2007, 07:36 | ||||
Надо посмотреть отладчиком, какой получается запрос. Вероятно, в каком-то поле выборки попалась, скажем, скобка или еще чего, в результате чего запрос получился кривой. Потому, собственно, и рекомендовал делать через параметры, тем более что полей в выборке вроде не так много. |
| Автор: XavierElf 8.8.2007, 10:15 | ||
Сделал таким образом:
Не экспортирует в dbf. Уже даже не знаю как быть... :( |
| Автор: LuMee 8.8.2007, 11:02 | ||
А что за ошибку пишет? |
| Автор: XavierElf 8.8.2007, 11:21 |
| Да в том-то и дело, что он даже ошибки не выдаёт... |
| Автор: LuMee 8.8.2007, 11:29 |
| Просто ничего не добавляет что ли получается? А у тебя названия параметров в INSERT-запросе и названия столбцов в сохраняемом DataTable одинаковые? |
| Автор: XavierElf 8.8.2007, 12:13 |
| Одинаковые. Самое интересное, что запрос INSERT не хочет выполняться даже для самой примитивной таблицы... |
| Автор: LuMee 8.8.2007, 13:09 | ||
Ну тогда остается генерить INSERT-запрос самостоятельно и пробовать его выполнять, типа такого:
|
| Автор: XavierElf 8.8.2007, 13:57 |
| Теперь он часть таблицы заполняет, а на другую часть выдаёт: "Не совпадает число значений запроса и число результирующих полей." |
| Автор: LuMee 8.8.2007, 14:09 |
| Что значит "часть таблицы"? В смысле, 10 записей добавил, а на 11ю сказал вышеозначенное сообщение? Если так, то вероятно где то в DataTable попался DBNull - нужно в этом месте писать в INSERT-запрос NULL. Посмотри отладчиком, как выглядит запрос, вызывающий ошибку |
| Автор: XavierElf 8.8.2007, 14:34 |
| с этим разобрался. просто все {0}, {1} ... и т.д. заключил в апострофы. однако теперь вопрос который у меня возник сначала и я его оставил на потом: почему когда я создаю таблицу и в ней поля типа NUMERIC вне зависимости от того, как я напишу (NUMERIC(11) или NUMERIC(11,0) или NUMERIC(11, 3)) у меня всегда создаются поля размерности 20 и точности 5. Почему? |
| Автор: LuMee 9.8.2007, 07:53 |
| Ну, это уже вопрос непростой... Возможно, тут дело в каких-то особенностях драйвера OLE DB для dbf. Если это так критично, то можно попробовать поискать другие драйверы и компоненты для доступа к dbf из .NET. Хотя на мной взгляд, лучше больше, чем лучше. Главное - все данные сохранятся без потерь точности. |