Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Открытие dBase через ADO


Автор: Dr.Drunk 19.1.2006, 11:56
Доброго времени суток.

Собственно сабж.

Есть dbf-ки, есть моя прога. dbf-ки, которые делаю сам открываются нормально. dbf-ки, допустим с 1С, при открытии выдает: "Invalid variant type conversion" smile Притом не на всех, не которые окрывает нормально, а не которые даже без русских полей открывает с ошибкой.

Подключаюсь через OLE DB Provider for ODBC Driver.

Автор: ТоляМБА 20.1.2006, 06:40
Кинь мне на мыло небольшую dbf-ку кот. глючит и стукни в ПМ (я на мыло не часто хожу). Я гляну.
А так с лету можно только предположить что в числовое поле каким-то макаром попал символ.
Добавлено @ 06:42
И еще укажи версию файла.
А в Database Desktop пробовал открывать? Ругается, нет?

Автор: Dr.Drunk 20.1.2006, 07:56
ТоляМБА, самое смешное, что после этой ошибки таблицу он открывает.

Database Desktop не пробовал.

Версия скорее всего 3.

Автор: ТоляМБА 20.1.2006, 08:14
Цитата(ТоляМБА @ 20.1.2006, 06:40 Найти цитируемый пост)
Кинь мне на мыло небольшую dbf-ку кот. глючит и стукни в ПМ
Дык почему у меня мыло-то пустое??? Я бы у себя посмотрел - если у меня не будет глючить будем дальше разбираться.
Добавлено @ 08:15
Цитата(Dr.Drunk @ 20.1.2006, 07:56 Найти цитируемый пост)
Database Desktop не пробовал.
Почему? Это так долго? Или ты ее снес?

Автор: SergeBS 20.1.2006, 09:05
Dr.Drunk
1. Проверь на наличие Memo-полей и файлов тоже.
2. Через ADO работать с dbf - иметь некислые тормоза и кучу проблем. Причины - в архитектуре. ADO всегда работает через SQL-запросы. Лучше возьми что-либо типа TDbf/Halcyon. Это IMO правильное решение проблемы.

Автор: ТоляМБА 20.1.2006, 09:53
Вот если бы ты попробовал сразу открыть через Database Desktop, то увидел предупреждение: ‘Production index file missing, corrupt or cannot interpret index key’ что означает примерно следующее: ‘данная табла содержит индекс но ему писец или нет файла с индексом’. dBase хранит индексы в файлах с расширениями .mdx или .ndx (в зависимости от вида индекса) имя индексного файла такое же как у dbf-файла.
1-й выход правильный и быстрый:
1-й вариант (если нужны индексы) копируй индексные файлы с машины на которой брал .dbf
2-й вариант (если индексы не нужны) при выгрузке из 1С если это возможно укажи, чтоб индексы не выгружались (если такая фича там есть – я в глаза не видел 1С) и проверь будет ли ругаться Дэлфя.
2-й выход геморройный и долгий (если файлов много, но обработать их нужно только один раз и 1-й выход невозможен):
При открытии через Database Desktop при выходе предупреждения нужно выбрать ‘Open and Detach’, чтобы она убила индекс (только не знаю надо потом пересохранять или нет).
3-й выход (если 1-й не возможен а 2-й не подходит) написать прогу, которая будет убивать индексы.
Кстати, у меня 6-я Делфя и при коннекте она сразу выдала мне сообщение ‘[Microsoft] [Драйвер ODBC dBase] Индекс не найден’ и открыть таблу так и не дала. Но когда я убил индекса через Database Desktop табла открывалась без проблем.
Теперь по кодировке: ни какой прогой кроме Microsoft Visual FoxPro 6.0 я не смог прочитать что там написано, а в Фоксе указал кодировку Windows Russian и всё прочитал.
И еще вопрос не по теме: это по приколу цифирь в чарах хранить? Ну ладно в других полях могут быть и буквы и цифирь, но не в ID же.
Добавлено @ 09:55
Кстати Database Desktop пишет версию dBase IV

Автор: Dr.Drunk 20.1.2006, 10:12
ТоляМБА, это вопрос уже к 1Сникам, скорее всего там в конфигураторе выбирается что хранить число или чар, вот они и не стали заморачиваться.

Так не хотелось с индексами заморачиваться придется.

Database Desktop не разу не пользвался, поэтому и мучаюсь smile

Автор: bas 20.1.2006, 10:18
Цитата(ТоляМБА @ 20.1.2006, 09:53 Найти цитируемый пост)

dBase хранит индексы в файлах с расширениями .mdx или .ndx

C mdx полностью согласен. Но с .ndx можно даже и не думать, в хидере dbf об этом индексе никаих упоминаний нет.
Добавлено @ 10:19
Цитата(Dr.Drunk @ 20.1.2006, 10:12 Найти цитируемый пост)

Database Desktop не разу не пользвался

И не пользуйся - вредная штука.

Автор: Dr.Drunk 20.1.2006, 10:24
ТоляМБА, да с индексом промашка вышла, щас скину smile проверил в DD открывает, а в делфях на отладке все равно глюк smile

ADOTemp.ConnectionString:=Provider=MSDASQL.1;Persist Security Info=False;Data Source=Файлы dBASE;Mode=ReadWrite

при смене на dBase ODBC ошибка остается.

Вот код
Код

procedure TForm1.mnOpenClick(Sender: TObject);
var
    Name    : String;
    Patch   : String;
  PosDot  : Integer;
begin
  ADOTemp.Active:=False;
  if ODial.Execute() then
  begin
        PosDot:=LastDelimiter('\\',ODial.FileName);
        Name:=Copy(ODial.FileName, PosDot+1, Length(ODial.FileName)-PosDot);
        Patch:=Copy(ODial.FileName, 1, PosDot-1);

        ADOTemp.TableName:=Name;
        ADOTemp.Active:=True;  //после этого ошибка

        SB.Panels.Items[1].Text:= ODial.FileName;
    end;
end;

Автор: ТоляМБА 20.1.2006, 12:38
Dr.Drunk Вот ты скинул индексный файл и я сразу все понял (правда тебе от этого легче не будет smile )
CDX - это расширение индексных файлов FOX (FoxPro или FoxBase - точно не знаю). Поэтому то в фоксе у меня кодировка нормально и прочиталась. Жаль только я с фоксом не работал и помочь тут не смогу. Единственное только могу сказать: или проси у них dBase-овские файлы или убивай индексы у этих (если для твоей проги они не нужны)
Добавлено @ 12:41
В Дэлфе он файл нормально открывает, правда при попытке изменения ругается что нет индексного файла для dBase а в Обджект инспекторе в списке индексных файлов естественно пусто.

Автор: Dr.Drunk 20.1.2006, 13:03
ТоляМБА, спасибо, буду индексы бить, они особо не нужны )))

Автор: ТоляМБА 20.1.2006, 13:21
Через BDE пробовал убить с помощью SQL - отлично убиваются.
ЗЫ. Кстати в BDE и с кодировкой всё Ок!

Автор: Dr.Drunk 24.1.2006, 09:52
ТоляМБА, BDE - это конечно хорошо. Но мне хочется через OLE сделать, чтобы потом с БДЕ не носиться smile по разным машинам

Автор: bas 24.1.2006, 10:45
Dr.Drunk
Убивать индексы и не надо просто используй вместо драйвера DBase- Microsoft Dbase VFP or Microsoft FoxPro VFP

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)