![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Изменение длины "стрингового" поля [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()