主要功能:把excel数据读取到数据库中.之后再把每个字段里的数据去掉分隔符和英文把提取的数据再分别存入数据库中.在这过程中中文一点问题都没有.但是如果是日语再去掉英文字符后再存入数据库就存在非法字符.不知道具体是什么原因.这个是错误SQL:'insert into translate2(translate)values('腕'#0'')'
截取的原句:CASIO (カシオ) 腕時計 スタンダードウォッチ AW-80-1AJF メンズ正确的SQL:应该是 'insert into translate2(translate)values('腕時計')'错误信息:
Project Project1.exe raised exception class EOleException with message '[Microsoft][ODBC Microsoft Access Driver] 字符串的语法错误 在查询表达式 ''腕' 中。'. Process stopped. Use Step or Run to continue.请高手帮忙啊!急

解决方案 »

  1.   

    中间数据转移的时候,不要使用String(AnsiString),换用WideString.
      

  2.   

    1.从excel到数据库,数据是否正确?
    2.去掉分隔符、英文后数据是否正确?
    我觉得可能是去掉英文部分代码的问题。
      

  3.   

    procedure TStrToStr.Button2Click(Sender: TObject);
    var
      table, x, sql,p: WideString;
      i, j, Count: integer;
      reg: TPerlRegEx;
      list: tstrings;
    begin
      ADOQuery2.Close;
      ADOQuery2.sql.Clear;
      ADOQuery2.sql.Add('select count(*) as i from translate1');
      ADOQuery2.Open;  ADOQuery1.Close;
      ADOQuery1.sql.Clear;
      ADOQuery1.sql.Add('SELECT   * FROM   translate1');
      ADOQuery1.Open;
      for i := 0 to ADOQuery2.fieldByName('i').Value - 1 do
      begin
        p := ComboBox1.Text;
      if ComboBox1.Text ='' then
      begin
        showmessage('请输入要截取的字段!');
        exit;
        end
      else
      begin
        table := ADOQuery1.fieldByName(p).AsString;
        list := tstringlist.create;
        reg := TPerlRegEx.create(nil);
        list.Text := table;
        reg.Subject := list.Text;
        list.Clear;
        reg.RegEx := '[\w-\s()/.:,&]';
        reg.Split(list, MaxInt);
        reg.Options := [preSingleLine];
        x := reg.Subject;
        for Count := 0 to list.Count - 1 do
        begin
          x := list.Strings[Count];
    //      p:=AnsiToUtf8(x);
    //P:=codeDeUTF8(x);
          if x = '' then
            sql := 'insert into+ translate2(translate)values' + '(' + quotedstr(x) + ')'
          else
          begin
            sql := 'insert into translate2(translate)values' + '(' + quotedstr(x) + ')';
            ADOQuery3.Close;
            ADOQuery3.sql.Clear;
            ADOQuery3.sql.Add(sql);
            ADOQuery3.ExecSQL;
          end;
        end;
        ADOQuery1.next;
      end;
      end;
      FreeAndNil(reg);
      list.Free;
    end;
    这是我的那一段代码!
      

  4.   

    类似table := ADOQuery1.fieldByName(p).AsString; 
    改为table := ADOQuery1.fieldByName(p).Value;
      

  5.   

    WideString WideChar
    支持Unicode码
    而Char , String 是 ASC 编码
    僵哥 说的有道理
      

  6.   

    我用的类型都是WideString 类型的啊.你看下我的代码 
    类似table := ADOQuery1.fieldByName(p).AsString; 
    改为table := ADOQuery1.fieldByName(p).Value;
    我也该了 可是还是不行.
      

  7.   

    quotedstr会把WideString变为String,这个需要替换掉.
      

  8.   

        reg.RegEx := '\w';
        reg.Replacement := '-';
        reg.ReplaceAll;
    在这句代码的时候就已经出现了 乱码~~~~~~
      

  9.   

    问题很多,首先,那个list: TStrings要改为list:TWideStrings(Uses WideStrings)
    TPerlRegEx需要换WideString支持的.
      

  10.   

    TPerlRegEx 是个三方控件  需要改控件吗?