我在运行程序的时候,提示下面错误 Project ExpertExtract.exe raised exception class EVariantTypeCastError with message 'Could not convert variant of type(string) into type(Double)'. Process stopped. Use Step or Run to continue.
请问这个是什么毛病,应该怎么样解决啊,谢谢!

解决方案 »

  1.   

    string 类型和 double类型不匹配
      

  2.   

    可我定义的数据库中的表的字段中没有double类型的啊,那是怎么回事啊
    谢谢
    帮忙解决一下。
      

  3.   

    定义的数据库中的表的字段中没有double类型,,,
    那是不是有FLOAT类型的啊
      

  4.   


    function ExtractFunc(const m_count, e_count:integer; var TArray :array of integer): string;
    var
      x,i :integer;
      st :string;
    begin
      if e_count <=0 then exit;
      //如果e_count > m_count将出现死循环,于是判断并跳出循环
      if e_count > m_count then
      begin
        Application.MessageBox('抽取数目不能大于抽取总数. ', '提示信息', MB_OK);
        exit;
      end;
      i:=1;
      st:='';
      while i<=e_count do
      begin
        Randomize;
        x :=Random(m_count)+1;   //产生1~m_count的随机数
        //如果抽取到的随机数x是以前没有抽取到的,则把它保存到st中,用逗号分割
        if ansipos( Quotedstr(inttostr(x)) + ',', st) <= 0 then
        begin
          st :=st + Quotedstr(inttostr(x)) + ',' ;
          TArray[i-1] :=x;
          i :=i+1;
        end;
      end;
      result :=st;end;procedure TfrmExtract1.FormCreate(Sender: TObject);
    {程序说明:打开ADOTable1,打开ADOQuery2 }
    var
      SGroupId: String;
    begin
      ADOTable1.Close;
      ADOTable1.Connection:=frmMain.ADOConnection1;
      ADOTable1.TableName:='ExpertGroup';  //数据表名称!
      ADOTable1.Open;       //打开数据库表  //浏览ExpertGroup表
      ADOTable1.First;
      while not ADOTable1.Eof do
      begin
        SGroupId :=ADOTable1.FieldValues['组ID'];
        //计算每组的总人数
        with ADOQuery2 do begin
          Connection :=frmMain.ADOConnection1;
          Close;
          SQL.Clear;
          SQL.Add('select * from Expert where 组ID= :GroupID and 状态= :Status order by 组ID asc,专家ID asc');
          Parameters.ParamByName('GroupID').Value := SGroupId;
          Parameters.ParamByName('Status').Value := '正常';
          Prepared :=true;
          Open;   //select语句需用Open方法执行
        end;
        //修改ExpertGroup 的总人数,抽选人数
        ADOTable1.Edit;
        ADOTable1.FieldValues['总人数'] :=ADOQuery2.RecordCount;
        ADOTable1.FieldValues['抽选人数'] :=0;
        ADOTable1.Post;
        ADOTable1.Next;
      end;
      ADOTable1.First;  with ADOQuery2 do begin
          Connection :=frmMain.ADOConnection1;
          Close;
          SQL.Clear;
          SQL.Add('select * from Expert where 状态= :Status order by 组ID asc,专家ID asc');
          Parameters.ParamByName('Status').Value := '正常';
          Prepared :=true;
          Open;   //select语句需用Open方法执行
      end;
      //选择全部专家
      ADOQuery2.First;
      while not ADOQuery2.Eof do
      begin
        ADOQuery2.Edit;
        ADOQuery2.FieldValues['选中'] :=true;
        ADOQuery2.Post;
        ADOQuery2.Next;
      end;
      ADOQuery2.First;
      btnCancel.Caption :='取消全部选中';  Button4Click(Parent);
      button3.Enabled :=false;
    end;procedure TfrmExtract1.Button1Click(Sender: TObject);
    var
      sGroupId, sSearch, sReturn :string;
      iOptioncount,IExtracount :integer;
      tempArray1: array of integer;
      i :integer;
    begin  sReturn :='';
      sSearch :='';
      GsSearch :='';  //浏览ExpertGroup表
      ADOTable1.First;
      while not ADOTable1.Eof do
      begin
        SGroupId :=ADOTable1.FieldValues['组ID'];
        IOptioncount :=ADOTable1.FieldValues['总人数'];
        IExtracount :=ADOTable1.FieldValues['抽选人数'];
        if IExtracount <=0 then
        begin
          ADOTable1.Next;
          continue; // 抽选人数为0,则跳出本次循环
        end;    if IExtracount > IOptioncount then
        begin
          Application.MessageBox('抽选人数不能大于总人数, 请重新输入. ', '提示信息', MB_OK);
          exit;
        end;
        //计算出每组选中的专家总人数
        with ADOQuery1 do begin
          Close;
          Connection :=frmMain.ADOConnection1;
          SQL.Clear;
          SQL.Add('select * from Expert where 组ID like :GroupID and 选中= True and 状态= :Status Order by 组ID asc,专家ID asc');
          Parameters.ParamByName('GroupID').Value := SGroupId;
          Parameters.ParamByName('Status').Value := '正常';
          Prepared :=true;
          Open;   //select语句需用Open方法执行
        end;    if IExtracount > ADOQuery1.RecordCount then
        begin
          Application.MessageBox('抽选人数不能大于该组选中的专家总人数, 请重新输入. ', '提示信息', MB_OK);
          exit;
        end;
        setlength(TempArray1,IExtracount);  //根据抽选人数为数组分配内存空间
        //调用抽取函数, ADOQuery1.RecordCount是有效的专家总人数
        sReturn :=ExtractFunc(ADOQuery1.RecordCount,IExtracount,TempArray1);    for i :=low(TempArray1) to high(TempArray1) do
        begin
          ADOQuery1.first;
          ADOQuery1.MoveBy(TempArray1[i]-1);
          //构造查询字符串
          sSearch :=sSearch + ''''+ ADOQuery1.FieldValues['专家ID'] + ''',';
          GsSearch := GsSearch + '专家ID = ' + QuotedStr(ADOQuery1.FieldValues['专家ID']) + ' OR ';
        end;
        ADOTable1.Next;
      end;
      ADOTable1.First;   //完成浏览ExpertGroup表  tempArray1 :=nil;  //释放临时数组内存空间
      if sSearch = '' then //如果没有构造查询字符串,则构造
      begin
        sSearch :='''' + '''';
        GsSearch :='专家ID = ' + QuotedStr('')
      end
      else begin
        sSearch :=copy(sSearch,1,length(sSearch)-1);  //去掉结尾的逗号
        GsSearch :=copy(GsSearch,1,length(GsSearch)-3);  //去掉结尾的OR
      end;
      sSearch := 'select * from Expert where 专家ID in (' + sSearch + ') ' +
        ' Order by 组ID asc,专家ID asc';  //创建抽取结果窗口
      frmExtractResult :=TfrmExtractResult.Create(Application);
      with frmExtractResult.ADOQryResult do begin
          Close;
          SQL.Clear;
          SQL.Add(sSearch);
          Prepared :=true;
          Open;   //select语句需用Open方法执行
      end;
      frmExtractResult.ShowModal;  frmExtract1Rep :=TfrmExtract1Rep.Create(Application);
      with frmExtract1Rep.ADOTable1 do begin
        Close;
        Connection:=frmMain.ADOConnection1;
        TableName:='Expert';  //数据表名称!
        Filtered := False;
        Filter :=GsSearch ;
        Filtered :=true;
        Open;       //打开数据库表
      end;
      button3.Enabled :=true;
    end;
      

  5.   

    procedure TfrmExtract1.Button2Click(Sender: TObject);
    begin
      close;
    end;procedure TfrmExtract1.Button3Click(Sender: TObject);
    begin
      frmExtract1Rep.QuickRep1.Preview;
    end;procedure TfrmExtract1.SaveBoolean;
    begin
      DBGrid3.SelectedField.DataSet.Edit;
      if adoquery2.FieldValues['选中'] = false then
        adoquery2.FieldValues['选中'] := true
      else
        adoquery2.FieldValues['选中'] := false;
    //  DBGrid3.SelectedField.AsBoolean :=not DBGrid3.SelectedField.AsBoolean;
      DBGrid3.SelectedField.DataSet.Post;
    end;procedure TfrmExtract1.FormClose(Sender: TObject;
      var Action: TCloseAction);
    begin
      Action := caFree;
    end;procedure TfrmExtract1.Button4Click(Sender: TObject);
    begin
      ADOQuery2.First;end;
    procedure TfrmExtract1.DBGrid3DrawColumnCell(Sender: TObject;
      const Rect: TRect; DataCol: Integer; Column: TColumn;
      State: TGridDrawState);
    {  利用WIN32 API函数:DrawFrameControl(),此函数可以直接画出Checkbox组件,
     所以就无须在表单中实际添加组件。
      设定一个整型数组常数,返回的整数值是与布尔值相一致的,如果字段是逻辑字段,
    则只将其布尔值放入数组中,提供给DrawFrameControl()函数中的状态参数进行调用,
    从而实现了Checkbox组件在网格中的嵌入效果。
    }
    const
      //这个整数值将按照布尔值返回,并送入数组
      CtrlState : array[Boolean] of Integer = (DFCS_BUTTONCHECK,DFCS_BUTTONCHECK or DFCS_CHECKED);
      //CtrlState : array[Boolean] of Integer = (DFCS_BUTTONCHECK,DFCS_CHECKED );
    begin  //确保只有在逻辑字段才能插入组件
      if column.Field.DataType = ftBoolean then
      begin
        DBGrid3.Canvas.FillRect(Rect);
        DrawFrameControl(DBGrid3.Canvas.Handle,Rect,DFC_BUTTON,CtrlState[Column.Field.AsBoolean]);
      end;end;procedure TfrmExtract1.DBGrid3ColEnter(Sender: TObject);
    //当逻辑字段所在栏得到焦点时,要关闭TDBGrid.Options中dgEditing的可编辑模式。
    begin  //确保该栏是逻辑字段
      if DBGrid3.SelectedField.DataType = ftBoolean then
      begin
        //OriginalOptions :=DBGrid3.Options; //设定变量来存储原始的 TDBGrid.Options的所有属性值
        //DBGrid3.Options :=DBGrid3.Options -[dgEditing];
        DBGrid3.Options :=[dgTitles,dgIndicator,dgColumnResize,dgColLines,dgRowLines,dgTabs,dgConfirmDelete,dgCancelOnExit]
      end;
    end;procedure TfrmExtract1.DBGrid3ColExit(Sender: TObject);
    //当逻辑字段所在栏失去焦点时,要打开TDBGrid.Options中dgEditing的可编辑模式。
    begin
      //确保该栏是逻辑字段
      if DBGrid3.SelectedField.DataType = ftBoolean then
        //DBGrid3.Options := OriginalOptions;
        DBGrid3.Options :=[dgEditing,dgTitles,dgIndicator,dgColumnResize,dgColLines,dgRowLines,dgTabs,dgConfirmDelete,dgCancelOnExit]
        
    end;procedure TfrmExtract1.DBGrid3CellClick(Column: TColumn);
    //通过鼠标点击或敲打空格键改变布尔值
    begin
      //确保该栏是逻辑字段
      if DBGrid3.SelectedField.DataType = ftBoolean then
        SaveBoolean();end;procedure TfrmExtract1.DBGrid3KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    //通过鼠标点击或敲打空格键改变布尔值
    begin
      //确保该栏是逻辑字段和空格键在键盘中被敲击
      if (Key =VK_SPACE) and (DBGrid3.SelectedField.DataType = ftBoolean) then
        SaveBoolean();end;procedure TfrmExtract1.ADOTable1ExtractCountChange(Sender: TField);
    //var  I :integer;
    begin  if VarIsnull(ADOTable1.FieldValues['抽选人数']) then
      begin
        ADOTable1.Cancel;
      end;
    //  if not TryStrToInt(ADOTable1.FieldByName('抽选人数').Text,I) then
    //  begin
    //    ADOTable1.FieldByName('抽选人数').Text :=inttostr(I);
    //    ADOTable1.Cancel;
    //  end;  if ADOTable1.FieldValues['抽选人数'] < 0 then
      begin
        ADOTable1.Cancel;
      end;end;procedure TfrmExtract1.DBGrid1ColEnter(Sender: TObject);
    begin
      //确保该栏是逻辑字段
      if DBGrid1.SelectedField.FieldName = '抽选人数' then
      begin
        DBGrid1.Options :=[dgEditing,dgAlwaysShowEditor,dgTitles,dgIndicator,dgColumnResize,dgColLines,dgRowLines,dgTabs,dgConfirmDelete,dgCancelOnExit]
      end;
    end;procedure TfrmExtract1.DBGrid1ColExit(Sender: TObject);
    begin
      //确保该栏是逻辑字段
      if DBGrid1.SelectedField.FieldName = '抽选人数' then
      begin
        DBGrid1.Options :=[dgEditing,dgTitles,dgIndicator,dgColumnResize,dgColLines,dgRowLines,dgTabs,dgConfirmDelete,dgCancelOnExit]
      end;
    end;procedure TfrmExtract1.DBGrid1Exit(Sender: TObject);
    begin
      DBGrid1ColExit(Parent);
    end;procedure TfrmExtract1.btnExportClick(Sender: TObject);
    {
    var
      WordApp,WordDoc,WordTable :OleVariant;
      i,j:integer;
    }
    begin
    {
      WordApp:=CreateOleObject('Word.Application');
      WordApp.Visible:=True;
      WordDoc:=WordApp.Documents.Add;
      //在新建文档中增加表格,指定表格的行数与列数
      WordTable:=WordDoc.Tables.Add(WordApp.Selection.Range, DBGrid2.DataSource.DataSet.RecordCount+1, DBGrid2.Columns.Count);
      //插入表格的标题行
      for i:=1 to DBGrid2.Columns.Count do
        WordTable.Cell(1,i).Range.InsertAfter(DBGrid2.Columns[i-1].Title.Caption);  i:=2;
      DBGrid2.DataSource.DataSet.First;
      with DBGrid2.DataSource.DataSet do
      while not eof do
      begin
        for j:=1 to DBGrid2.Columns.Count do
        begin
          if varIsNull(DBGrid2.Columns[j-1].Field.Value) then
            WordTable.Cell(i,j).Range.InsertAfter('')
          else
            WordTable.Cell(i,j).Range.InsertAfter(DBGrid2.Columns[j-1].Field.Value);
        end;
        Next;
        i:=i+1;
      end;
      DBGrid2.DataSource.DataSet.First;
    }
    end;procedure GoToWord(db_GRID: TDBGRID; q2: TADOQuery; f1: string); //从DBGRID导数据到Word
    var
      i, j: integer;
      WordApp, WordDoc, WordParagraph, WordRange, WordTable: variant;
      SltRec, SltCol: integer;
    begin
      if not (q2.Active) then //数据集没有打开就返回
      begin
        ShowMessage('导出的数据集没有打开!');
        Exit;
      end;  try
        WordApp := CreateOleObject('word.Application');
        WordApp.Visible:=True;
        WordDoc := WordApp.documents.Add;
    //    wordapp.application.visible:=true;
        WordParagraph := WordApp.activedocument.paragraphs.Add;
        WordRange := WordParagraph.range;
      except
        ShowMessage('请确认WORD安装正确!');
        WordDoc.close;
        WordApp.Quit;
        WordApp := Unassigned; //释放VARIANT变量
        Exit;
      end;  try
        SltRec := q2.recordcount;
        SltCol := db_GRID.Columns.Count;
        //在新建文档中增加表格,指定表格的行数与列数
        WordTable := WordApp.activedocument.tables.Add(WordRange, SltRec + 1, SltCol);
        //插入表格的标题行
        i := 1;
        for j := 1 to db_GRID.Columns.Count do
        begin
          if db_GRID.Columns[j-1].Visible then
            WordTable.Cell(i, j).range.InsertAfter(db_GRID.Columns[j-1].Title.Caption);
        end;
        //插入表格的内容行
        i := 2;
        q2.First;
        while not q2.Eof do
        begin
          for j := 1 to db_GRID.Columns.Count do
          begin
            if db_GRID.Columns[j-1].Visible then
              WordTable.Cell(i, j).range.InsertAfter(q2.fieldbyname(db_GRID.Columns[j-1].FieldName).AsString);
          end;
          i := i + 1;
          q2.next;
        end;
        q2.First;
    //    WordApp.activedocument.saveas(f1);
    //    WordApp.activedocument.close;
      except
        ShowMessage('不能正确操作Word文件。可能是该文件已被其他程序打开,或系统错误。');
        WordDoc.close;
        WordApp.Quit;
        WordApp := Unassigned; //释放VARIANT变量
        Exit;
      end;
    end;
    代码比较长,大家看看吧
      

  6.   

    把这条语句加点东西
    sSearch := sSearch +''''+inttostr(ADOQuery1.fieldbyname('专家ID').value)+''',';
    你试试这回应该好使了
      

  7.   

    强制转换格式:
    把所有从表中取字段值的语句 XXXX.fields[X].value 改为 .asString