bianlx ,可以回答吗?数据库的转换问题,大家来看看!急(50分)

  • 主题发起人 主题发起人 keven_zk
  • 开始时间 开始时间
K

keven_zk

Unregistered / Unconfirmed
GUEST, unregistred user!
大哥,我的积分快完了,但是我的问题还没有解决,
你可不可以救救命,!可不可以解释一下foxpro 和sql server 的数据类型
转换一块的意思????

unit ConvertDBF;

interface

uses
Windows, Messages, SysUtils, Classes,
Graphics, Controls, Forms, Dialogs,
StdCtrls, DBTables, Db, Grids, DBGrids;

type
TfrmConvertDB = class(TForm)
btnOK: TButton;
Label1: TLabel;
db1: TDatabase; {用于连接老数据库系统}
db2: TDatabase; {用于连接新数据库系统}
dbg: TDBGrid;
tblSource: TTable; {dbg的Datasource}
qryInsert: TQuery;
{用于存放生成的SQL Insert语句}
srcSource: TDataSource;
tblDest: TTable; {DBGrid1的Datasource}
DBGrid1: TDBGrid;
srcDest: TDataSource;
edFromtbl: TEdit;
Label2: TLabel;
Label3: TLabel;
edToTbl: TEdit;
procedure btnOKClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
frmConvertDB: TfrmConvertDB;

implementation

{$R *.DFM}
procedure TfrmConvertDB.btnOKClick
(Sender: TObject);
var iField :integer;
begin
if ((edTotbl.text<>'') and
(edFromtbl.text<>''))then begin
tblSource.TableName:=edFromtbl.text;
{指定TableName}
tblDest.TableName:=edTotbl.text;
with tblSource do begin
Open; {打开老系统的表}
while EOF=FALSE do begin
{逐条记录处理}
qryInsert.SQL.Clear;
qryInsert.sql.Add
('Insert into '+edTotbl.text + '(');
for iField:=0 to dbg.FieldCount-1 do begin
qryInsert.sql.add
(dbg.Fields[iField].DisplayLabel);
if iField<>dbg.FieldCount-1 then
qryInsert.sql.add(',');
end;
qryInsert.sql.add(') values(');
for iField:=0 to dbg.FieldCount-1 do begin
{进行数据类型转换}
if dbg.fields[iField].DataType=ftInteger then
qryInsert.sql.add(inttostr
(dbg.fields[iField].asInteger));
if dbg.fields[iField].DataType=ftFloat then
qryInsert.sql.add(floattostr
(dbg.fields[iField].asFloat));
if dbg.fields[iField].DataType=ftDate then
qryInsert.sql.add(''''+datetostr
(dbg.fields[iField].asDateTime)+'''');
if dbg.fields[iField].DataType=ftString then begin
if dbg.fields[iField].asString<>'' then
qryInsert.sql.add(''''+dbg.fields
[iField].asString+'''')
else
qryInsert.sql.add('NULL');
end;
if iField<>dbg.FieldCount-1
then qryInsert.sql.add(',');
end;
qryInsert.sql.add(')');
qryInsert.ExecSQL;
{把数据插入到新系统的表中}
next;
end;
end;
tblDest.Close;
tblDest.Open;;
ShowMessage(' 转换完毕! ');
end
else
ShowMessage
('请输入要插入数据的表的名称 ');
end;
end.
 
直接利用sqlserver 导入和导出命令
或用batchmove 组件即可
 
我用delphi随机带的一个industr.dbf
把数据导入到远端的sybase数据库,然后用Tbatchmove执行
没有报什么错误,很正常,
你把你的出错信息,贴上来我看以下
 
我刚刚试了,我在form 上用了2个datasource 2个table 一个batchmove 还有一个
dbgrid 用来显示转换后的数据。
我的table1 用的是DBDEMOS的一个表animals.dbf 是delphi自带的
table2用来作为目标表,用的是foxpro(自己做的一个)表名是随便的一个,可不可以是
空的? 转换时报错,是 translate error .value out of bounds .我以前没用过batchmove
,请教!可不可以帮我分析一下上面的数据类型转换
 
我用本地库实验了以下:
query1
datbasename:DBDEMOS
SQL: select * from master
active :true;

datasource1
dataset : query1

table1
datbasename:DBDEMOS

dbgrid1
datasource:datasource1;


button1.onclicked事件代码:
procedure TForm1.Button1Click(Sender: TObject);
begin
if Query1.Active = False then
Exit;

Table1.TableName := 'test.dbf';
with BatchMove1 do
begin
Source := Query1;
Destination := Table1;
Mode := batCopy;
Execute;
ShowMessage(IntToStr(MovedCount) + ' records copied');
end;

end;

在本地数据库下面实现起来也没有问题,不知道你哪里是怎么回事?
 
請教bianlx,如用ADO來解決keven_Zk的問題(將debaseIII轉換成sql server)是否同樣
奏效呢?[:)]
 
我试了你的方法,是可以,但是我想要的是一个
foxpro 的数据表可以转换为一个 sql server 的表
因为他们的数据定义类型不一样的,难道这种方法也可以吗?
可能会出现什么问题?你有没有试过把你的两种表都显示,看看有什么不一样嘛??
 
試試ADO,不過要用到動態創建ODBC數據源,在用function SQLConfigDataSource(hwndParent: Integer; fRequest: Integer;這個函數
即可...
 
后退
顶部