Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Изменение длины "стрингового" поля [D6, dBase, FoxPro]


Drowsy ©   (2008-03-26 06:50:00) 

Нужно изменить длину поля типа ftString в заполненной таблице.
Я накарябал функцию. Работает.
Но, наверняка, можно сделать проще и изящнее.
Уважаемые посетители, кому не лень,
посмотрите и скажите об этом что-нибудь и предложите
как правильнее эту задачулю выполнить.

//===========================================================================
// Изменение длины стрингового поля в заполненной таблице.
//===========================================================================
function ChangeLengthOfStringField ( DBaseName, TblName, FldName : String;
                                    const NewFldSize : Integer = 0;
                                    const TestList : TStrings = Nil) : boolean;

var SQLSel, SQLNew : TQuery;
   TblRes : TTable;
   SQLStr : string;

begin
if Assigned(TestList) then begin
  TestList.Add(' База : ' + DBaseName + '   Таблица : ' + TblName );
  TestList.Add(' Изменение длины строкового поля : ' + FldName );
end;
SQLSel := TQuery.Create(Nil);
SQLNew := TQuery.Create(Nil);
TblRes := TTable.Create(Nil);

try
  // Сохраняем поле в наборе SQLSel
  with SQLSel do begin
    DatabaseName  := DBaseName;
    SQLStr := 'SELECT ' + FldName + ' FROM ' + TblName;
    SQL.Clear;
    SQL.Add(SQLStr);
    Open;

    if SQLSel.FindField(FldName) <> nil then
    begin
      if Assigned(TestList) then begin
         TestList.Add(' Поле : ' + FldName + '  найдено. ' );
         TestList.Add(' Изменение ... ');
      end;
    end;
  end;
  // Изменем длину поля
  with SQLNew do begin
    DatabaseName  := DBaseName;
    SQL.Clear;

    SQLStr := 'ALTER TABLE "' + TblName + '" ' +
               ' DROP ' + FldName + ', ADD ' + FldName + ' CHAR(' + IntToStr(NewFldSize) + ')' ;

    SQL.Add(SQLStr);
    ExecSQL;
  end;

  // заполняем поле реструктурированной таблицы.
  with TblRes do begin
    DatabaseName  := DBaseName;
    TableName := TblName;
    Open;
    SQLSel.First;

    While (not SQLSel.Eof) and (not TblRes.Eof) do begin
       Edit;
       FieldByName(FldName).AsString := SQLSel.FieldByName(FldName).AsString;
       SQLSel.Next;
       TblRes.Next;
    end;
  end;

  SQLSel.Close;
  TblRes.Close;

  SQLSel.Destroy;
  SQLNew.Destroy;
  TblRes.Destroy;

  result := true;

except on E : EDataBaseError do begin
         ShowMessage(E.Message);
    SQLSel.Destroy;
    SQLNew.Destroy;
    TblRes.Destroy;
    if Assigned(TestList) then
      TestList.Add(' ... Ошибка.');
  end;
end;
end;


Loginov Dmitry   (2008-03-26 07:54:00) [1]

открой справку
C:\Program Files\Common Files\Borland Shared\BDE\BDE32.HLP
там есть готовый пример для функции DbiDoRestructure()


Наверх

Титульная страница Поиск, карта сайта Написать письмо