起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 133|回复: 5

【搞定】无效的列类型**

[复制链接]
发表于 2007-6-13 11:40:22 | 显示全部楼层 |阅读模式
导出
procedure TYWGNZCT.btExportClick(Sender: TObject);
begin
  query1.CommandText:='select * from table_sbjbxx where '
    +' GUID=''6FE86CAA67BC4EFBABDB8061ECB22010'' AND SBXZ=''BM1501''';//'select * from table_bmkzb where dwdm=''S11JH001''';
  query1.Open;
  query1.SaveToFile('E:        able_sbjbxx.xml',TDataPacketFormat.dfXML);
  query1.Close
end;

导入
procedure TYWGNZCT.btImportClick(Sender: TObject);
var
  I,j:Integer;
  lValues,lFields,lInsertSQL:string;
  lFieldList:TFieldlist;
begin
Query2.LoadFromFile('E:        able_sbjbxx.xml');
  lFields:='';
  lValues:='';
  for i:=0 to query2.FieldCount-1 do
  begin
    if (i<query2.FieldCount-1) then
    begin
     lFields:=lFields+query2.FieldList.FieldName+',';
     lValues:=lValues+':'+query2.FieldList.FieldName+',' ;
    end
    else begin
      lFields:=lFields+query2.FieldList.FieldName ;
      lValues:=lValues+':'+query2.FieldList.FieldName;
    end
  end;
  lFields:='('+lFields+')';
  lValues:='Values('+lValues+')';
  lInsertSQL:='Insert into table_sbjbxx '+lFields+' '+lValues;
  QueryInsert.CommandText:=lInsertSQL;
  lFieldList:=query2.FieldList;
  While not query2.Eof do
  begin
    for I := 0 to lFieldList.Count - 1 do
    begin
      QueryInsert.Params.AssignFieldValue(lFieldList[I],lFieldList[I].Value);
    end;
    QueryInsert.Execute;//运行到该处出错,见图片
    query2.Next;
  end ;
end;
查其原因,是因为有一个字段JMFDS(number(10)),导出到XML的值
JMFDS=""。上面一段通用导数据表的程序基本不能用,以前发过其它贴,日期型字段空出现问题,blob字段有图片也出现问题。
不知道有什么其它通用方法,导入XML的数据。

未命名.jpg

13.19 KB, 下载次数: 110

回复

使用道具 举报

发表于 2007-6-13 11:53:41 | 显示全部楼层
楼主,
1/在执行哪句报出来的

2/当时是在导入啥类型的字段
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-6-13 14:54:45 | 显示全部楼层
QueryInsert.Execute;//运行到该处出错,见图片
    query2.Next;
  end ;
end;
查其原因,是因为有一个字段JMFDS(number(10)),导出到XML的值
JMFDS="",导出前原值为JMFDS=0。
回复 支持 反对

使用道具 举报

发表于 2007-6-13 15:56:22 | 显示全部楼层
哦,我测试一下,明天上午下班前给你结果
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-6-13 17:14:30 | 显示全部楼层
上面在方法导xml数据,确实有问题,,改用下面的代码,没有问题,blob字段导入没有问题,日期型字段为空也没有问题。
procedure TYWGNZCT.btImportClick(Sender: TObject);
var
  lFieldName:string;
  I:Integer;
begin
  Query1.LoadFromFile('E:\table_bmkzb.xml');
  Query2.CommandText:='SELECT * FROM TABLE_bmkzb WHERE 1<>1' ;
  Query2.open;

  While not Query1.Eof do
  begin
    Query2.Insert;
    for I := 0 to Query1.FieldList.Count-1  do
    begin
      lFieldName:=Query1.FieldList[I].FieldName;
      if (Query1.FieldList[I].DataType=TFieldType.ftOraBlob) then//二进制字段
        Query2.FieldByName(lFieldName).Assign(Query1.FieldByName(lFieldName))
      else
        Query2.FieldByName(lFieldName).Value:=Query1.FieldList[I].Value;
    end;
    Query2.ApplyUpdates;
    Query1.Next;
  end ;
end;
回复 支持 反对

使用道具 举报

发表于 2007-6-13 17:33:32 | 显示全部楼层
ok
谢谢楼主把方法共享,那我结贴了:)
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-1-11 14:51 , Processed in 0.042277 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表