Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.07.14;
Скачать: [xml.tar.bz2];

Вниз

Отсутствие индекса ???   Найти похожие ветки 

 
supersan   (2003-06-07 15:58) [0]

Господа, здравствуйте. Возник вопрос.
Есть dbf файл (какой именно СУБД, не знаю :-(). Пытаюсь с ним сконнектиться. Кидаю на форму (датамодуль) компонент TTable, прописываю DatabaseName (каталог, где он находится), выбираю TableName (таблицу эту находит нормально). Пытаюсь открыть, т.е. даблклик на Active. Выдается мессага:
"Index does not exist. File <name>.mdx"
Собственно проблема
1. Неужели нельзя без него обойтись? (без mdx то есть)
2. На несколько минут раньше коннект происходил нормально (т.е. сначала повыдавал такое сообщение, потом сконнектился), а сейчас не коннектится. Тут уж совсем руки опустились :-(
Подскажите, плиз, кто чем может.
PS Желательно, чтоб в рунтайме тоже этот способ действовал, т.е. чтоб можно было DatabaseName поменять
PPS Алиасы в BDE создавать не хочу, так что, если можно, то такое не советовать (разве что уж без этого никак)
PPPS Да,чуть не забыл. Есть еще TQuery, настроенная на это же DatabaseName, где происходит просто выборка из таблицы (вообще она там одна). Так при открытии TQuery начинает, помимо mdx требовать еще и cdx, хотя вот несколько минут назад ничего такого не было.
PPPPS Комп перезагрузил!


 
Desdechado   (2003-06-07 17:53) [1]

Попробуй поиграть с параметром LEVEL в настройках драйвера dbase у БДЕ
Число - это номер версии. 3 - самый стандартный формат, остальные - самые несовместимые между собой :(


 
Basic   (2003-06-08 03:02) [2]

открой hex редактором эту базу, и поменяй 29 символ с единицы на ноль, это признак что у базы должен быть индексный файл, и потом открывай заново, про индекс уже не вспомнит


 
supersan   (2003-06-08 09:18) [3]

2 Desdechado
Попробовал (имелось в виду настройки Configuration\Drivers\Native\DBase ?), имелось на выбор 4 значения (3,4,5,7), поначалу стояло 5. Попробовал все их, все равно проблема не исчезла
2 Basic
29 символ равен нулю и так, ты уверен, что не ошибся номером символа? Ближайшие, равные 1, в моем случае: 1C, 3F, 0B, 50, 5F. Больше в ближайшем окружении единичек нет. А где ты вообще взял такую информацию, может, кинешь ссылочку, я сам гляну?


 
Anatoly Podgoretsky   (2003-06-08 09:33) [4]

Basic © (08.06.03 03:02)
Ну ты даешь, найдешь что советовать, один так поменял


 
supersan   (2003-06-08 10:26) [5]

2 Anatoly Podgoretsky © (08.06.03 09:33)
А чем это дело чревато? И что можете посоветовать Вы? (извиняюсь, если обидел обращением на "Вы").


 
theodor_iv   (2003-06-08 11:00) [6]

2 supersan: вот 1С и меняй. Но лучше сделать так:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, DBTables, Grids, DBGrids, StdCtrls, BDE;

type
TForm1 = class(TForm)
Table1: TTable;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
FCBInputReq: CBInputDesc;
FCallBack: TBDECallback;
public
{ Public declarations }
function InputReqCallBack(CBInfo: Pointer): CBRType;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
// инициализация BDE -- без этого BDE будет ругаться в след. строке
Session.Open;
// нельзя вызывать эту строку раньше или без предыдущей
// регистрируем колбэк -- процедуру, которая будет вызываться
// при ошибках открытия БД, в т.ч. и MDX file missing
FCallback := TBDECallback.Create( Self, nil, cbINPUTREQ,
@FCBInputReq, SizeOf(FCBInputReq), InputReqCallBack, False);
try
Table1.Open;
finally
FCallBack.Free;
end;
end;

function TForm1.InputReqCallBack(CBInfo: Pointer): CBRType;
begin
// черная магия :) -- 3 означает Open And Detach (это про индексы)
PCBInputDesc(CBInfo)^.iSelection := 3;
Result := cbrCHKINPUT;
end;

end.


 
Anatoly Podgoretsky   (2003-06-08 11:56) [7]

Чревато повреждением, хакерский путь, грубо топором по файлу, а ведь есть легальные методы.
1. Открыть с помощью Database Desktop и если окажется, что данный формат известен системе, то отсоединить индекс.
2. тоже самое программно с помощью dbiRegisterCallback, пример есть в справке.
3. Если формат неизвестен, то сначала придется с этим разобраться, может и в корзину.


 
supersan   (2003-06-08 12:11) [8]

2 theodor_iv
Не знаю, накосячил или нет, но сделал так.
TDM = class(TDataModule)
q2: TQuery;
q1: TQuery;
tbStacion: TTable;
...
function InputReqCallBack(CBInfo: Pointer): CBRType;
private
{ Private declarations }
FCBInputReq: CBInputDesc;
public
{ Public declarations }
FCallBack: TBDECallback;
end;

function TDM.InputReqCallBack(CBInfo: Pointer): CBRType;
begin
PCBInputDesc(CBInfo)^.iSelection := 3;
Result := cbrCHKINPUT;
end;

procedure TDM.DataModuleCreate(Sender: TObject);
begin
Session.Open;
FCallback := TBDECallback.Create( Self,
nil,
cbINPUTREQ,
@FCBInputReq,
SizeOf(FCBInputReq),
InputReqCallBack, False);
end;

Потом в другой форме
procedure TfmRPriem.bbAnalizClick(Sender: TObject);
begin
SeeDBF;
end;
procedure SeeDBF;
begin
with DM.q1 do begin
//задаем имя папки, где лежит stacion.dbf
DatabaseName:=fmRPriem.dlb.Directory;
try
Open; //здесь
finally
if Assigned (DM.FCallBack)
then begin
DM.FCallBack.Free;
DM.FCallBack:=nil;
end;
end;
end;
with DM.q2 do begin
//задаем имя папки, где лежит stacion.dbf
DatabaseName:=fmRPriem.dlb.Directory;
try
Open;
finally
if Assigned (DM.FCallBack)
then begin
DM.FCallBack.Free;
DM.FCallBack:=nil;
end;
end;
end;
//некоторые действия
...
//открываем таблицу
with DM.tbStacion do begin
//задаем имя папки, где лежит stacion.dbf
DataBaseName:=fmRPriem.dlb.Directory;
TableName:="stacion.dbf";
try
Open;
finally
if Assigned (DM.FCallBack)
then begin
DM.FCallBack.Free;
DM.FCallBack:=nil;
end;
end;
end;
end;

Если нужно, то приведу еще значения q1.SQL и q2.SQL, но, наверное, это лишнее, там просто подмножество множества записей stacion.dbf
И это дело работает!! Большое спасибо!! Хотя, может, накосячил где?


 
supersan   (2003-06-08 12:18) [9]

2 Anatoly Podgoretsky © (08.06.03 11:56)
Вероятно, этот способ не подойдет, т.к. по смыслу задачи нужно принимать файлы из периферии в центральную БД, что не дает возможности с каждым файлом проводить индивидуальную работу (отсутствие времени, квалификации пользователей моей проги, да мало ли что еще :-))
Вероятно, предложенный Вами способ 2 более действенный, возможно, он и имелся в виду у theodor_iv © (08.06.03 11:00), что было реализовано supersan © (08.06.03 12:11). Или есть еще пути? (судя по справке dbiRegisterCallback, что-то похожее и было предложено theodor_iv © (08.06.03 11:00), если я правильно понял).
Спасибо за участие


 
theodor_iv   (2003-06-08 12:48) [10]

2 supersan © (08.06.03 12:18)

Только не нужно каждый раз создавать/освобождать FCallback. Создай его один раз в FormCreate и освободи в FormDestroy.

А способ действительно тот же, что и через dbiRegisterCallback.


 
supersan   (2003-06-08 13:32) [11]

2 theodor_iv © (08.06.03 12:48)
Ага, спасибо, буду делать так.


 
Anatoly Podgoretsky   (2003-06-08 18:05) [12]

supersan © (08.06.03 12:18)
dbiRegisterCallback позволяет делать тихое отсоединения индекса.


 
venoel   (2003-06-20 20:41) [13]

Насчет dbiRegisterCallback не знаю, а вот 28-ой байт поменять, что бы индекс не тербовало - это милое дело.



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2003.07.14;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.008 c
14-44854
Думкин
2003-06-26 06:31
2003.07.14
Родственники на работе


1-44723
petr_v_a
2003-06-30 11:24
2003.07.14
Создание экземпляра фрейма в DesignTime


6-44789
Igor__
2003-05-08 15:12
2003.07.14
Закачка


14-44830
MetalFan
2003-06-26 11:35
2003.07.14
NVidia GeForce 2 Pro (64mb)


14-44899
Shaman
2003-06-27 16:45
2003.07.14
Фильм





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский