procedure TForm1.Button1Click(Sender: TObject);
var
TableListOld, TableListNew: TStringList;
FieldListOld, FieldListNew: TStringList;
I, J: Integer;
t:tfieldtype;
fdtype:string; m, k: Integer;
adoxTables:Tables;
adoxTable: _Table;
adoxColumns: Columns;
adoxColumn: _Column;
adoxcatalog:_catalog;
begin
TableListOld := TStringList.Create;
FieldListOld := TStringList.Create;
TableListNew := TStringList.Create;
FieldListNew := TStringList.Create; ADOConnectionOld.GetTableNames(TableListOld);
ADOConnectionNew.GetTableNames(TableListNew); for I := 0 to TableListNew.Count - 1 do
begin
ADOConnectionNew.GetFieldNames(TableListNew[I], FieldListNew);
if TableListOld.IndexOf(TableListNew[I]) <> -1 then
begin
//旧数据库中表TableListNew[I]存在
ADOConnectionOld.GetFieldNames(TableListNew[I], FieldListOld);
for J := 0 to FieldListNew.Count - 1 do
begin
if FieldListOld.IndexOf(FieldListNew[J]) <> -1 then
begin
// showmessage('存在该字段'); { 旧数据库表TableListNew[I]中 字段FieldListNew[J]存在 }
end
else
begin
// showmessage('该字段不存在要创建');
// showmessage(FieldListNew[J]);
// showmessage(tablelistnew[i]);
//adotable1 连接新表
adotable1.Active:=false;
adotable1.TableName:=tablelistnew[i];
adotable1.Open; //判断字段类型
t:=adotable1.FieldByName(FieldListNew[J]).DataType; if t=ftWideString then
begin
fdtype:='varchar';
showmessage('ftWideString');
adoquery2.Close;
adoquery2.SQL.Clear;
adoquery2.SQL.Add('Alter table'+' ' +tablelistnew[i]+' '+'add'+' '+FieldListNew[J]+' '+fdtype+'(50)') ;
adoquery2.ExecSQL;
end; if t=ftBoolean then
begin
adoxCatalog:= CoCatalog.Create;
adoxCatalog.Set_ActiveConnection(ADOConnectionold.ConnectionObject);
adoxTables := adoxCatalog.Tables;
k := adoxTables.Count;
for m:=0 to k-1 do
begin
adoxTable := adoxTables.Item[m];
if UpperCase(adoxTable.Name)=tablelistnew[i] then
Break;//得到要修改的表
END;
adoxColumns := adoxTable.Columns;
adoxColumn := coColumn.Create;
adoxColumn.Name := FieldListNew[J];
adoxColumn.Type_ := adboolean;
adoxColumn.DefinedSize :=1;
//adoxColumn.Attributes := AdColNullable;
//adoxcolumn.Properties['Jet OLEDB:Allow Zero Length'].Value := false;
adoxColumns.Append(adoxColumn,adboolean,1);
{with adoxcolumn do
begin
Properties['Jet OLEDB:Allow Zero Length'].Value := true;
end;}
end;
if t=ftdatetime then
begin adoxCatalog:= CoCatalog.Create;
adoxCatalog.Set_ActiveConnection(ADOConnectionold.ConnectionObject);
adoxTables := adoxCatalog.Tables;
k := adoxTables.Count;
for m:=0 to k-1 do
begin
adoxTable := adoxTables.Item[m];
if UpperCase(adoxTable.Name)=tablelistnew[i] then
Break;//得到要修改的表
END;
showmessage(tablelistnew[i]);
showmessage( adoxTable.Name+'ok');
//adoxtable:=adoxtables.Item[i];
adoxColumns := adoxTable.Columns;
adoxColumn := coColumn.Create;
adoxColumn.Name := FieldListNew[J];
adoxColumn.Type_ := addate;
adoxColumn.DefinedSize :=8;
adoxColumn.Attributes := AdColNullable;
//adoxcolumn.Properties['Jet OLEDB:Allow Zero Length'].Value := false;
adoxColumns.Append(adoxColumn,addate,8); end;
{ 旧数据库表TableListNew[I]中 字段FieldListNew[J]不存在,修改表TableListNew[I]的字段 } end;
end;
end
else
begin
showmessage('该表不存在要创建');
{ 旧数据库中表TableListNew[I]不存在,创建表TableListNew[I] } end;
end;
TableListOld.Free;
TableListNew.Free;
FieldListOld.Free;
FieldListNew.Free;
end;
var
TableListOld, TableListNew: TStringList;
FieldListOld, FieldListNew: TStringList;
I, J: Integer;
t:tfieldtype;
fdtype:string; m, k: Integer;
adoxTables:Tables;
adoxTable: _Table;
adoxColumns: Columns;
adoxColumn: _Column;
adoxcatalog:_catalog;
begin
TableListOld := TStringList.Create;
FieldListOld := TStringList.Create;
TableListNew := TStringList.Create;
FieldListNew := TStringList.Create; ADOConnectionOld.GetTableNames(TableListOld);
ADOConnectionNew.GetTableNames(TableListNew); for I := 0 to TableListNew.Count - 1 do
begin
ADOConnectionNew.GetFieldNames(TableListNew[I], FieldListNew);
if TableListOld.IndexOf(TableListNew[I]) <> -1 then
begin
//旧数据库中表TableListNew[I]存在
ADOConnectionOld.GetFieldNames(TableListNew[I], FieldListOld);
for J := 0 to FieldListNew.Count - 1 do
begin
if FieldListOld.IndexOf(FieldListNew[J]) <> -1 then
begin
// showmessage('存在该字段'); { 旧数据库表TableListNew[I]中 字段FieldListNew[J]存在 }
end
else
begin
// showmessage('该字段不存在要创建');
// showmessage(FieldListNew[J]);
// showmessage(tablelistnew[i]);
//adotable1 连接新表
adotable1.Active:=false;
adotable1.TableName:=tablelistnew[i];
adotable1.Open; //判断字段类型
t:=adotable1.FieldByName(FieldListNew[J]).DataType; if t=ftWideString then
begin
fdtype:='varchar';
showmessage('ftWideString');
adoquery2.Close;
adoquery2.SQL.Clear;
adoquery2.SQL.Add('Alter table'+' ' +tablelistnew[i]+' '+'add'+' '+FieldListNew[J]+' '+fdtype+'(50)') ;
adoquery2.ExecSQL;
end; if t=ftBoolean then
begin
adoxCatalog:= CoCatalog.Create;
adoxCatalog.Set_ActiveConnection(ADOConnectionold.ConnectionObject);
adoxTables := adoxCatalog.Tables;
k := adoxTables.Count;
for m:=0 to k-1 do
begin
adoxTable := adoxTables.Item[m];
if UpperCase(adoxTable.Name)=tablelistnew[i] then
Break;//得到要修改的表
END;
adoxColumns := adoxTable.Columns;
adoxColumn := coColumn.Create;
adoxColumn.Name := FieldListNew[J];
adoxColumn.Type_ := adboolean;
adoxColumn.DefinedSize :=1;
//adoxColumn.Attributes := AdColNullable;
//adoxcolumn.Properties['Jet OLEDB:Allow Zero Length'].Value := false;
adoxColumns.Append(adoxColumn,adboolean,1);
{with adoxcolumn do
begin
Properties['Jet OLEDB:Allow Zero Length'].Value := true;
end;}
end;
if t=ftdatetime then
begin adoxCatalog:= CoCatalog.Create;
adoxCatalog.Set_ActiveConnection(ADOConnectionold.ConnectionObject);
adoxTables := adoxCatalog.Tables;
k := adoxTables.Count;
for m:=0 to k-1 do
begin
adoxTable := adoxTables.Item[m];
if UpperCase(adoxTable.Name)=tablelistnew[i] then
Break;//得到要修改的表
END;
showmessage(tablelistnew[i]);
showmessage( adoxTable.Name+'ok');
//adoxtable:=adoxtables.Item[i];
adoxColumns := adoxTable.Columns;
adoxColumn := coColumn.Create;
adoxColumn.Name := FieldListNew[J];
adoxColumn.Type_ := addate;
adoxColumn.DefinedSize :=8;
adoxColumn.Attributes := AdColNullable;
//adoxcolumn.Properties['Jet OLEDB:Allow Zero Length'].Value := false;
adoxColumns.Append(adoxColumn,addate,8); end;
{ 旧数据库表TableListNew[I]中 字段FieldListNew[J]不存在,修改表TableListNew[I]的字段 } end;
end;
end
else
begin
showmessage('该表不存在要创建');
{ 旧数据库中表TableListNew[I]不存在,创建表TableListNew[I] } end;
end;
TableListOld.Free;
TableListNew.Free;
FieldListOld.Free;
FieldListNew.Free;
end;
解决方案 »
- 怎么能让delphi 屏幕录像 录制falsh格式的文件?
- 怎么样设置TDBGRID 当前行某字段的焦点?
- 如何读取rtf文件的内容,在线等
- 在delphi中怎样对paradox7进行加密?急!
- 从此不再用以前地一个帐号了,重新开始,第一次提问,delphi中怎么自定义文件格式?该看那方面书籍?
- 一個串口編程問題﹕如何判斷一個信號在一秒鐘時間內連續接受了五次﹖
- 请高手将这段cpp代码转换成delphi的代码(很短的一段代码)
- Delphi6编译的程序在Win98下不兼容的问题
- 有谁知道在QREPORT中,怎样完成记录打完后能打空白行吗?
- 我有一個Delphi反匯編的程式,但是不太好用,有更好用的嗎?
- 那个Indy的demo发不出去?“authentication is required”验证,怎么做呀????
- 我这里有个ADOStoredProc调用问题,请各位看官帮帮忙,谢谢。
var
TableListOld, TableListNew: TStringList;
FieldListOld, FieldListNew: TStringList;
I, J: Integer;
t:tfieldtype;
fdtype:string; m, k: Integer;
adoxTables: Tables;
adoxTable: _Table;
adoxColumns: Columns;
adoxColumn: _Column;
adoxcatalog:_catalog;
begin
TableListOld := TStringList.Create;
FieldListOld := TStringList.Create;
TableListNew := TStringList.Create;
FieldListNew := TStringList.Create; ADOConnectionOld.GetTableNames(TableListOld);
ADOConnectionNew.GetTableNames(TableListNew); for I := 0 to TableListNew.Count - 1 do
begin
ADOConnectionNew.GetFieldNames(TableListNew[I], FieldListNew);
if TableListOld.IndexOf(TableListNew[I]) <> -1 then
begin
//旧数据库中表TableListNew[I]存在
ADOConnectionOld.GetFieldNames(TableListNew[I], FieldListOld);
for J := 0 to FieldListNew.Count - 1 do
begin
if FieldListOld.IndexOf(FieldListNew[J]) <> -1 then
begin
// showmessage('存在该字段'); { 旧数据库表TableListNew[I]中 字段FieldListNew[J]存在 }
end else
begin
adotable1.Active:=false;
adotable1.TableName:=TableListNew[i];
adotable1.Open; //判断字段类型
t:=adotable1.FieldByName(FieldListNew[J]).DataType; if t=ftWideString then
begin
fdtype:='varchar';
showmessage('ftWideString');
adoquery2.Close;
adoquery2.SQL.Clear; //应该确定ADOQuery2是否连接为旧数据库 ?????????????
adoquery2.SQL.Add('Alter table'+' ' +tablelistnew[i]+' '+'add'+' '+FieldListNew[J]+' '+fdtype+'(50)') ; adoquery2.ExecSQL;
end; if t=ftBoolean then
begin
adoxCatalog:= CoCatalog.Create;
adoxCatalog.Set_ActiveConnection(ADOConnectionold.ConnectionObject);
adoxTables := adoxCatalog.Tables;
k := adoxTables.Count;
for m:=0 to k-1 do
begin
adoxTable := adoxTables.Item[m];
if UpperCase(adoxTable.Name)=tablelistnew[i] then
Break;//得到要修改的表
END;
adoxColumns := adoxTable.Columns;
adoxColumn := coColumn.Create;
adoxColumn.Name := FieldListNew[J];
adoxColumn.Type_ := adboolean;
adoxColumn.DefinedSize :=1;
//adoxColumn.Attributes := AdColNullable;
//adoxcolumn.Properties['Jet OLEDB:Allow Zero Length'].Value := false;
adoxColumns.Append(adoxColumn,adboolean,1);
{with adoxcolumn do
begin
Properties['Jet OLEDB:Allow Zero Length'].Value := true;
end;}
end;
if t=ftdatetime then
begin adoxCatalog:= CoCatalog.Create;
adoxCatalog.Set_ActiveConnection(ADOConnectionold.ConnectionObject);
adoxTables := adoxCatalog.Tables;
k := adoxTables.Count;
for m:=0 to k-1 do
begin
adoxTable := adoxTables.Item[m];
if UpperCase(adoxTable.Name)=UpperCase(tablelistnew[i]) then////
//------------------- 可能是这儿的问题,小小安也可以用单步调试
//比较的时候if等号两边的都要UpperCase
Break;//得到要修改的表
END;
showmessage(tablelistnew[i]);
showmessage( adoxTable.Name+'ok');
//adoxtable:=adoxtables.Item[i];
adoxColumns := adoxTable.Columns;
adoxColumn := coColumn.Create;
adoxColumn.Name := FieldListNew[J];
adoxColumn.Type_ := addate;
adoxColumn.DefinedSize :=8;
adoxColumn.Attributes := AdColNullable;
//adoxcolumn.Properties['Jet OLEDB:Allow Zero Length'].Value := false;
adoxColumns.Append(adoxColumn,addate,8); end;
{ 旧数据库表TableListNew[I]中 字段FieldListNew[J]不存在,修改表TableListNew[I]的字段 } end;
end;
end else
begin
showmessage('该表不存在要创建');
{ 旧数据库中表TableListNew[I]不存在,创建表TableListNew[I] }
//下面就是一个简单的例子, 你扩展一下就能使用了, 现在创建了一个空表, 没有
//太多 时间给你写一个完整的代码了
with AdoQuery2 do
begin
Close;
SQL.Clear;
SQL.Add('Create Table aaa');
ExecSQL;
Close;
end; end;
end;
TableListOld.Free;
TableListNew.Free;
FieldListOld.Free;
FieldListNew.Free;end;