用LOAD DATA LOCAL infile导入文件,文件是存在本地的,但是导入却报 file xxxx not found (Errcode: 13) 的错误,想不明白。

解决方案 »

  1.   

          if FileExists(task.DatFile) then
          begin
            FOwner.FLogIntf.DoAddLog(Self, '批量导入 '+task.DatFile);
            name:= Q_ReplaceStr(task.DatFile, '\', '\\') ;
            sql := Format(SQL_LOAD_DATA,[name, task.TabName]);
            if 0 <> mysql_real_query(FLibHandle, PAnsiChar(sql), Length(sql)) then
            begin
              line  := mysql_error(FLibHandle);
              FOwner.FLogIntf.DoAddLog(Self, line );
            end
            else
            begin
              FOwner.FLogIntf.DoAddLog(Self, sql+'.OK.');
              //导入成功才删除
              FOwner.FLogIntf.DoAddLog(Self, '删除文件 '+task.DatFile);
              DeleteFileA(PAnsiChar(task.DatFile));
            end;
          end;
      

  2.   

    有时出错有时成功??确定两次使用的方法都一模一样吧?如果是一样的,不大可能结果不一样,除非有什么别的因素干扰了,又或者除非MySQL有bug。
      

  3.   


          if FileExists(task.DatFile) then
          begin
            FOwner.FLogIntf.DoAddLog(Self, '批量导入 '+task.DatFile);
            name:= Q_ReplaceStr(task.DatFile, '\', '\\') ;
            sql := Format(SQL_LOAD_DATA,[name, task.TabName]);
            if 0 <> mysql_real_query(FLibHandle, PAnsiChar(sql), Length(sql)) then
            begin
              line  := mysql_error(FLibHandle);
              FOwner.FLogIntf.DoAddLog(Self, line );
            end
            else
            begin
              FOwner.FLogIntf.DoAddLog(Self, sql+'.OK.');
              //导入成功才删除
              FOwner.FLogIntf.DoAddLog(Self, '删除文件 '+task.DatFile);
              DeleteFileA(PAnsiChar(task.DatFile));
            end;
          end;
      

  4.   

    方法确定是一样的,导入的SQL也是个常量,只要填入文件名和表名
      

  5.   

    对了,Linkor,你前面的可能是中文路径的问题?路径确实有中文,但是问题是也有导入成功的。
      

  6.   

    建议直接调试你的DELPHI程序,看看if 0 <> mysql_real_query(FLibHandle, PAnsiChar(sql), Length(sql)) then的时候sql变量的实际内容是什么 , 这样别人可以直接针对你的SQL语句进行分析修改,而不是分析你的DELIPH代码,毕竟懂MYSQL的未必熟悉DELPHI。得到 这个 sql变量的实际内容 后,可以直接到MYSQL中测试一下,如果有错误则把错误信息一同贴出以供分析。
      

  7.   

    根据acmain_chm的提议测试结果:
    导入失败记录的日志(括号中是SQL):
    导入失败:(LOAD DATA LOCAL infile 'C:\\省标服务\\轨迹\\MyData\\gps_2011_06_01_103024_0001.txt' IGNORE into table gps_2011_06 lines terminated by '\r\n' )File 'C:\省标服务\轨迹\MyData\gps_2011_06_01_103024_0001.txt' not found (Errcode: 13)把一个导入失败的SQL拿出来执行也没问题:Query OK,1024 rows affected(0.03 sec)
      

  8.   

    C:\省标服务\轨迹\MyData\gps_2011_06_01_103024_0001.txt是否存在更换为英文的目录名测试一下LOAD DATA LOCAL infile 'C://省标服务//轨迹//MyData//gps_2011_06_01_103024_0001.txt' IGNORE into table gps_2011_06 lines terminated by '\r\n'
    试试
      

  9.   

    'C:\\省标服务\\轨迹\\MyData\\gps_2011_06_01_103024_0001.txt' IGNORE into table gps_2011_06 lines terminated by '\r\n'
    这个拿出来执行都没错的
      

  10.   

    是LOAD DATA LOCAL infile 'C:\\省标服务\\轨迹\\MyData\\gps_2011_06_01_103024_0001.txt' IGNORE into table gps_2011_06 lines terminated by '\r\n'
    复制少了一段
      

  11.   

    我怀疑是不是LOAD DATA LOCAL INFILE的问题,这个好像是把本地文件传到MYSQL所在服务器进行导入?不过文件和MYSQL在同个服务器也会产生这种错误
      

  12.   

    你将gps_2011_06_01_103024_0001.txT COPY到短目录名下,比如C:\TEMP
    下,测试一下能否通过
      

  13.   

    怎么图这么小。。中心路径导入都没问题的,而且拿程序导入失败的SQL出来执行也没问题
      

  14.   

    SQL直接拷到MYSQL执行的,文本大概就是:
    mysql> LOAD DATA LOCAL infile 'C:\\省标服务\\轨迹\\MyData\\gps_2011_06_01_103024_0001.txt' IGNORE into table gps_2011_06 lines terminated by '\r\n' Query OK,1024 rows affected(0.03 sec)
      

  15.   

    在远程不好操作,用另外个内网服务器测试执行的结果如下(LOAD DATA LOCAL infile 'F:\\省标服务\\轨迹\\MyData\\gps_2011_06_01_103355
    _0041.txt' IGNORE into table gps_2011_06 lines terminated by '\r\n' 在程序中执行也是同样报错的):
    Microsoft Windows [版本 5.2.3790]
    (C) 版权所有 1985-2003 Microsoft Corp.C:\Documents and Settings\Administrator>mysql -h localhost -u root -p
    Enter password: ***
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 37
    Server version: 5.1.51-community MySQL Community Server (GPL)Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
    This software comes with ABSOLUTELY NO WARRANTY. This is free software,
    and you are welcome to modify and redistribute it under the GPL v2 licenseType 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> use track
    Database changed
    mysql> LOAD DATA LOCAL infile 'F:\\省标服务\\轨迹\\MyData\\gps_2011_06_01_103355
    _0041.txt' IGNORE into table gps_2011_06 lines terminated by '\r\n' ;
    Query OK, 1021 rows affected (0.06 sec)
    Records: 1024  Deleted: 0  Skipped: 3  Warnings: 0mysql> 
      

  16.   

    你将gps_2011_06_01_103024_0001.txT COPY到短目录名下,比如C:\TEMP
    下,测试一下能否通过确定是否是中文的问题
      

  17.   

    直接把这句 LOAD DATA LOCAL infile 'F:\\省标服务\\轨迹\\MyData\\gps_2011_06_01_103355_0041.txt' IGNORE into table gps_2011_06 lines terminated by '\r\n' ;
    放在你的程序中试一下。sql := "LOAD DATA LOCAL infile 'F:\\省标服务\\轨迹\\MyData\\gps_2011_06_01_103355_0041.txt' IGNORE into table gps_2011_06 lines terminated by '\r\n' ;";
            if 0 <> mysql_real_query(FLibHandle, PAnsiChar(sql), Length(sql)) then
            begin如果有问题则再试一下。sql := "LOAD DATA LOCAL infile 'F:\\\\省标服务\\\\轨迹\\\\MyData\\\\gps_2011_06_01_103355_0041.txt' IGNORE into table gps_2011_06 lines terminated by '\r\n' ;";
      

  18.   

    mysql> LOAD DATA LOCAL infile 'c:\\temp\\gps_2011_06_01_103355_0041.txt' IGNORE
    into table gps_2011_06 lines terminated by '\r\n' ;
    Query OK, 0 rows affected (0.01 sec)
    Records: 1024  Deleted: 0  Skipped: 1024  Warnings: 0
      

  19.   

    批量导入 F:\省标服务\轨迹\MyData\gps_2011_06_01_160943_0832.txt
    LOAD DATA LOCAL infile 'F:\\省标服务\\轨迹\\MyData\\gps_2011_06_01_103355_0041.txt' IGNORE into table gps_2011_06 lines terminated by '\r\n' .OK.按照你说的试了下导入成功,导入确实是有时失败有时成功的,而且有个特点,程序和MYSQL在同部机器导入成功率高,程序和MYSQL不同部机器导入成功率相对低一点。
      

  20.   

    忽略了个问题Errcode: 13,网上查了下好像是和权限有关?看来要从这里着手查下看看
      

  21.   

    应该是程序在导入文件时文件还在写操作,所以拿SQL出来执行又没问题,已经对程序做了修改,确保文件写完数据保存了才导入,目前暂时没发现问题。