233 / 95 / 15
Регистрация: 31.12.2009
Сообщений: 224
|
||||||
1 | ||||||
.NET 2.x Редактирование DBF файла15.06.2011, 11:01. Показов 4280. Ответов 10
Метки нет (Все метки)
Доброго времени суток, коллеги.
Изучаю C# и ADO.NET в частности. Работаю с DBF файлами посредством нетипизированных DataSet'ов. Собственно, вопрос: как организовать возможность править любой DBF файл, структура которого заранее неизвестна? Т.е. dataAdaper.SelectCommand очевидно какой-то такой
Заранее, благодарен.
0
|
15.06.2011, 11:01 | |
Ответы с готовыми решениями:
10
Чтение и редактирование DBF файлов Редактирование в DBGrid нескольких dbf DBF, DBASE, JAVA, парсинг, конвертирование, работа, редактирование Как программно из php-файла просмотреть содержимое dbf-файла на экране? |
334 / 270 / 18
Регистрация: 19.01.2011
Сообщений: 597
|
|||||||||||
15.06.2011, 12:20 | 2 | ||||||||||
Если при добавлении в датасет Вы будете использовать CommandBuilder - то UpdateCommand,DeleteCommand,InsertCommand будут генерироваться автоматически на основании SelectCommand.например так
0
|
233 / 95 / 15
Регистрация: 31.12.2009
Сообщений: 224
|
||||||
15.06.2011, 12:36 [ТС] | 3 | |||||
Спасибо за отзыв, я так и пробовал, но не работает, т.к. в DBF-ке нет PrimeryKey. А без него вылетает с ошибкой Dynamic SQL generation for the UpdateCommand is not supported against a SelectCommand that does not return any key column information Пробовал так же делать так:
P.S.: Редактирование произвольного DataSet'а в C# - нетривиальная задача?
0
|
334 / 270 / 18
Регистрация: 19.01.2011
Сообщений: 597
|
|
15.06.2011, 12:45 | 4 |
Нет. задача обычная. просто должен быть праймари кей. Иначе как узнать, какую запись обновлять. Если нет возможности добавить - создавайте UpdateCommand руками... С динамическим созданием праймари кея не колупался, надо пробовать.
1
|
233 / 95 / 15
Регистрация: 31.12.2009
Сообщений: 224
|
|
15.06.2011, 12:58 [ТС] | 5 |
Возможности нет, т.к. DBF-ка создаётся и используется сторонней DOS программой и будет меняться со временем.
Честно говоря, я в лёгком недоумении, т.к генерировать руками Update запрос это очень трудоёмко для такой простой задачи. Велосипед какой-то получется. На тех же старых добрых Дельфях всё решается намного проще. Кстати, о Primery Key. По логике он есть. Это 2 поля, которые я указал выше F1 и F2. Но во-первых, как указать DataTable'у, что это именно они, а во-вторых мне нужно update'ить именно их, а все остальные поля очищать. Т.е. задача всё-таки нетривиальная? Подскажите, куда копать, народ!
0
|
334 / 270 / 18
Регистрация: 19.01.2011
Сообщений: 597
|
|
15.06.2011, 12:59 | 6 |
Терпение... Изучаю вопрос
0
|
233 / 95 / 15
Регистрация: 31.12.2009
Сообщений: 224
|
||||||
15.06.2011, 13:45 [ТС] | 7 | |||||
Очень жду результатов
Т.е. изначально всё можно было бы решить одним запросом типа
0
|
334 / 270 / 18
Регистрация: 19.01.2011
Сообщений: 597
|
|
15.06.2011, 14:24 | 8 |
Ну. Поковырялся.
1) Можно обойти, попробовав переопределить у CommandBuilder-а метод GetSchemaTable, куда добавлять инфу о праймари кее, потому что этот метод возвращает схему на основании SelectCommand, а в нем о праймари кее ничего не известно. Вы добавляете праймари кей в структуру DataTable, а не в "select * from table". 2) Написать свой генератор SqlCommand для DataAdapter, что кстати, не так трудно как кажется. Но при этом возникает вопрос - как гарантировать в физической таблице без уникального ключа что where по всем колумнам вернет только одну запись??? Порядок записей в физической таблице может не совпадать с порядком записей в датасете, можно конечно опираться на индекс записи... Но это неправильно. Можно понадеяться на авось, что where по всем колумнам вернет одну запись. Так что тоже не лучший путь. 3) таки добавить праймари кей. Досовская программа как то же обновляет данные, какое-то поле она считает уникальным. Попробуйте сделать его ключом. Главное , чтобы оно было в select * from - тогда билдер сможет нормально обновлять данные.
1
|
233 / 95 / 15
Регистрация: 31.12.2009
Сообщений: 224
|
|
15.06.2011, 14:41 [ТС] | 9 |
Во-о-от. Это уже очень ценно! Ещё раз спасибо за потраченное время.
1-ый и 2-ой вариант считаю всё-таки трудоёмким (но реализуемым) для такого простого случая как мой, а вот третий ближе к к жизни. Действительно, как я и говорил выше, ключом логически считается поле F2, но как его сделать?
0
|
334 / 270 / 18
Регистрация: 19.01.2011
Сообщений: 597
|
||||||
15.06.2011, 15:51 | 10 | |||||
Имелось в виду - изменить поле в физической таблице... Долго копавшись в коде, пытаясь понять - все таки проще, если нету в физической таблице поля с типом Праймарикей - руками генерировать UpdateCommand.... Если кто найдет решение - сообщите
Добавлено через 52 секунды
0
|
233 / 95 / 15
Регистрация: 31.12.2009
Сообщений: 224
|
|
15.06.2011, 15:57 [ТС] | 11 |
Да, так тоже пробовал. И не помогло... Очень жду совета бывалого мастера
0
|
15.06.2011, 15:57 | |
15.06.2011, 15:57 | |
Помогаю со студенческими работами здесь
11
Кодировка dbf-файла Импорт DBF файла Cоздание файла *.dbf Чтение dbf файла Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |