Удаление записей из DBF

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Удаление записей из DBF

Сообщение VVitafresh » 26.12.2005 (Пн) 22:05

Нужно из *.dbf файла удалить все записи.
Пробую таким способом:
Код: Выделить всё

cn.Open "Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;Dbq=" & DbfFolder & ";"

cn.Execute "DELETE * FROM  " & DbfName
cn.close

Записи помечаются к удалению, но остаются в таблице. Как из VB пропаковать *.dbf файл, чтобы окончательно удалить все записи?

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Re: Удаление записей из DBF

Сообщение Andrey Fedorov » 27.12.2005 (Вт) 9:24

VVitafresh писал(а):Записи помечаются к удалению, но остаются в таблице. Как из VB пропаковать *.dbf файл, чтобы окончательно удалить все записи?


Если оно действительно надо то с языками а-ля FoxPro/Clipper шла утилитка это делающая из командной строки.

Если же надо чисто из VB - проще пересоздать таблицу.
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Re: Удаление записей из DBF

Сообщение VVitafresh » 27.12.2005 (Вт) 16:08

Andrey Fedorov писал(а):Если оно действительно надо то с языками а-ля FoxPro/Clipper шла утилитка это делающая из командной строки.

Если же надо чисто из VB - проще пересоздать таблицу.

Как временное решение, так и сделал: вызываю через шелл написанную для этого на фоксе утилиту. Но как-то это не солидно (да и объемная она получилась, как для такой цели).

Насчет второго варианта прошу помощи. Пробую создавать примерно таким кодом:
Код: Выделить всё

Public Sub CreateDbf(DbfFolder As String, DbfName As String)
    Dim cn As New ADODB.Connection
    Dim sDbfFile As String, SQL As String
   
    cn.Open "Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;Dbq=" & DbfFolder & ";"

    sDbfFile = DbfFolder & DbfName & ".dbf"
    On Error Resume Next
    GetAttr sDbfFile
    If Err.Number = 0 Then Kill sDbfFile
    On Error GoTo 0
   
    SQL = "CREATE TABLE " & sDbfFile & " (F1 INT, F2 DATE, F3 TEXT)"
   
    cn.Execute SQL
    cn.Close
End Sub


Проблема в том, что некоторые числовые поля у меня должны быть строго типа decimal(17,2) (или NUMERIC(17,2), как в фоксе принято). Как можно задать такой тип при создании? Перепробовал несколько вариантов, все бьют ошибку.

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 29.12.2005 (Чт) 13:36

Если невозможно создавать числовые поля через Create table, может есть какие-нибудь другие варианты, идеи. Очень не хочется таскать фоксовое приложение для пропаковки dbf (которое к тому же не понимает длинных путей). Должно же быть решение.

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 29.12.2005 (Чт) 16:24

Вообще-то задать тип столбца можно только одним способом - при его создании:
Код: Выделить всё
create table MyTable (
  MyColumn numeric(17,2) not null
)
-- Ну или так:
alter table MyTable
  add MyColumn numeric(17,2) not null

Т.е. конечно, ничто не помешает фоксу сказать "я особенный и ANSI SQL не понимаю", но вообще не должон артачиться. Хотя, не удивлюсь, если alter column он не поймет - старый все-таки.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 29.12.2005 (Чт) 17:00

Ennor писал(а):Вообще-то задать тип столбца можно только одним способом - при его создании:


Можно просто иметь шаблон таблички, который просто копируешь.

Или разобраться с форматом DBF и генерить заголовок самостоятельно.
В принципе можно брать его заготовку с существующего файла...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 29.12.2005 (Чт) 17:06

Andrey Fedorov писал(а):Или разобраться с форматом DBF и генерить заголовок самостоятельно.
В принципе можно брать его заготовку с существующего файла...

Я с пустого файла (из ресурсов) и делал.
Но лучше разобраться с форматом DBF и работать с ним напрямую. Я так не сделал из-за лени :) , но ничего сложного в этом нет.
Lasciate ogni speranza, voi ch'entrate.

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 30.12.2005 (Пт) 11:00

2 Ennor
В том то и дело, что при задании числового поля не INT, а напр.:
Код: Выделить всё

CREATE TABLE TEST (F1 NUMERIC(17,2) NOT NULL)

Бьет ошибку: -2147217900 - [Microsoft][Драйвер ODBC dBase] Ошибка синтаксиса в инструкции CREATE TABLE.

2 Alibek & Andrey Fedorov
С форматом dbf разобраться конечно интересно, но это потребует времени. Пока сделал эталонную dbf'ку отдельным файлом и при необходимости заменяю рабочую.
Хотелось бы конечно восстанавливать по вашему совету из файла ресурсов, но к своему стыду с ресурсами я еще не работал :oops:
Если можно коротенький пример или ссылку, как извлечь данные из ресурса и сохранить в файл.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 30.12.2005 (Пт) 11:07

Создаешь эталонный DBF-файл и помещаешь его в ресурсы с помощью Resource Editor в аддонах (Custom Resource).
Код: Выделить всё
Dim B() As Byte
B() = LoadResData("UNLOAD", "DBF")
I = FreeFile
Open P & F0 & ".dbf" For Binary As #I
Put #I, , B()
Close #I
Erase B()
Lasciate ogni speranza, voi ch'entrate.

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 30.12.2005 (Пт) 11:26

2 Alibek
Немного не разобрался с твоими переменными, но пример помог...
Вот так вроде работает:
Код: Выделить всё

    Dim a() As Byte
    Dim fn As Integer
    a() = LoadResData(101, "CUSTOM")
    fn = FreeFile(0)
    Open "C:\dbf\t.dbf" For Binary Access Write As fn
    Put #fn, , a()
    Close #fn


Спасибо за помощь!


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

    TopList  
cron