程序报错validation error for column ZDJ,value "***null***"我跟踪了下ZDJ字段的值,是有值的,不为空,为什么还出这个错误呢。

解决方案 »

  1.   


    void __fastcall Tmainf::Button4Click(TObject *Sender)
    {
     if(CheckListBox1->ItemIndex==-1)
     {
       ShowMessage("请选择您要导入数据库的表名!");
       return;
     }
     long int count=0;
     bool p;
     TStringList * mzd=new TStringList();     //目的库字段
     TStringList * yzd=new TStringList();     //源库字段
     if(!CheckBox2->Checked)                  //是否检查字段
     {
     //以下是检查数据字段是否匹配
     for(int i=0;i<CheckListBox1->Items->Count;i++)
     {
       if(CheckListBox1->Checked[i])
       {
         count++;
         DM->IBDatabase1->GetFieldNames(""+CheckListBox1->Items->Strings[i]+"",mzd); //链接表获取字段
         DM->IBDatabase2->GetFieldNames(""+CheckListBox1->Items->Strings[i]+"",yzd);
         if(yzd->Count!=mzd->Count)
         {
           ShowMessage("两个数据库表中字段数量不一致!");
           delete mzd;
           delete yzd;
           return;
         }
         for(int j=0;j<yzd->Count;j++)
         {       for(int k=0;k<mzd->Count;k++)
             {
              p=false;
              if(yzd->Strings[j]==mzd->Strings[k])
                {
                  p=true;
                  break;
                }
             }
           if(p==false)
             {
              ShowMessage("两个数据库中字段不匹配!");
              delete mzd;
              delete yzd;
              return;
             }      }
       }
     }
    }
      //以下是往数据库导数据。
       ProgressBar1->Max=count;
       ProgressBar1->Step=1;
      for(int a=0;a<CheckListBox1->Items->Count;a++)
     {
       DM->IBTable1->Active=false;
       if(CheckListBox1->Checked[a])
       {
         int t=0;
         Label4->Caption="正在导入"+CheckListBox1->Items->Strings[a]+"表";
         Label4->Refresh();
         DM->IBTable1->TableName=CheckListBox1->Items->Strings[a];
         DM->IBTable1->Active=true;
         DM->IBTable1->GetFieldNames(mzd);
         DM->IBQuery1->Close();
         DM->IBQuery1->SQL->Clear();
         DM->IBQuery1->SQL->Add("select * from "+CheckListBox1->Items->Strings[a]+"");
         DM->IBQuery1->Open();
         DM->IBQuery1->GetFieldNames(yzd);
         long int a1=0;
         while(DM->IBQuery1->Eof!=true)
         {
            a1++;
            DM->IBQuery1->Next();
         }
         Label14->Caption="共"+IntToStr(a1)+"行";
         Label14->Refresh();
         DM->IBQuery1->First();
         while(DM->IBQuery1->Eof!=true)
         {
           t++;
           Label6->Caption="第"+IntToStr(t)+"行";
           Label6->Refresh();
           DM->IBTable1->Insert();   //准备插入
           for(int b=0;b<yzd->Count;b++)
           {
              if(CheckBox2->Checked)              //只导入相同字段
              {
                for(int k=0;k<mzd->Count;k++)
                {
                  if(yzd->Strings[b]==mzd->Strings[k])
                  {
                    DM->IBTable1->FieldValues[""+yzd->Strings[b]+""]=DM->IBQuery1->FieldByName(""+yzd->Strings[b]+"")->Value;
                    //p=true;
                    break;
                  }
                }
      
              }
              else
              {
                DM->IBTable1->FieldValues[""+yzd->Strings[b]+""]=DM->IBQuery1->FieldByName(""+yzd->Strings[b]+"")->Value;
              }
           }
           DM->IBTable1->Post();
           DM->IBQuery1->Next();
          }
         ProgressBar1->StepIt();
        }
      }
      ShowMessage("数据成功导入!");
      delete mzd;
      delete yzd;
      ProgressBar1->Position=0;
    }
      

  2.   

     for(int i=0;i<CheckListBox1->Items->Count;i++)检查越界
     for(int i=0;i<CheckListBox1->Items->Count-1 /* 减个1 */;i++)
      

  3.   

    把类似这种:IBTable1->FieldValues[""+yzd->Strings[b]+""] 换成:
                IBTable1->FieldByName(""+yzd->Strings[b]+"").AsString 试一下吧
      

  4.   


    这样是不行的,每个字段的数据类型不一样,不一定都是AsString,
    所以用的FieldValues,这个函数可以自己转换到字段的类型,就是速度会慢点。
      

  5.   

    DBX?
    是ZDJ字段所有行都会报错,还是个别行?
    用更简单的取数据代码会不会报错?
      

  6.   

    我的问题解决了,代码没有错。
    我跟踪的ZDJ这个字段,确实是有值的,而且,我取了它的值,然后再返给ZDJ字段,跟踪都有值,
    总是报错ZDJ字段值为空。后来无奈了,无聊了,觉得机器有点慢,然后就清理了下系统,
    然后......我又试了下,过去了,不报错了......
    请教大牛解答。
      

  7.   

    这个ZDJ字段,是限制不能为空的,我跟踪的ZDJ字段值,是有值的,并不为空。
    我把ZDJ字段不能为空的现在去掉,就不报错了。
    我就不明白了。
    妖哥等大牛们,你们啥时候来啊?
      

  8.   


    自己找到问题所在了,无奈了。
    感谢大家的解答。ZDJ字段,关联其他表中ZDJ字段,那个表中的ZDJ字段为空,检查约束限制,
    即使我给现表中的ZDJ字段付值,但也是空,问题所在。所以现把另外的表中ZDJ字段做好值,在弄现表中ZDJ字段值......