首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

为何会出现“由于将在索引、主关键字中创建重复的值,请求对表的改变没有成功。”

2012-11-06 
为什么会出现“由于将在索引、主关键字中创建重复的值,请求对表的改变没有成功。”请各位高手帮我看看,为什么

为什么会出现“由于将在索引、主关键字中创建重复的值,请求对表的改变没有成功。”
请各位高手帮我看看,为什么点击“保存”按钮后,会出现这样的错误信息:

“由于将在索引、主关键字中创建重复的值,请求对表的改变没有成功。改变该字段中的或包含重复数据的字段中的数据,删除索引或重新定义索引以允许重复的值并再试一次。”

我的代码如下:

procedure TfmHiddenRecord.fmHRBtnNew26Click(Sender: TObject);
begin
 DMMain.dsHiddenMaster.DataSet.Append;
 DMMain.dsHiddenDetails.DataSet.Append;
 fmHRedCode0.Text := '0000'+ IntToStr(DMMain.dsHiddenMaster.DataSet.RecordCount + 1);
end;

procedure TfmHiddenRecord.fmHRBtnSave30Click(Sender: TObject);
var
  HiddenLines, MeasureLines: Integer;
begin
 IF (DMMain.dsHiddenDetails.DataSet.State = dsInsert) And
  (fmHiddenRecord.fmHRreDetails7.Text = '') Then
  begin
  MessageBox(0, '隐患内容不能为空' + #13#10 + #13#10 +
  '本次操作将被取消!', '提示', mb_OK + mb_IconExclaMation);
  fmHiddenRecord.fmHRreDetails7.SetFocus;
  Abort;
  end;

 IF (DMMain.dsHiddenDetails.DataSet.State = dsInsert) And
  (fmHiddenRecord.fmHRreMeasure8.Text = '') Then
  begin
  MessageBox(0, '整改措施不能为空' + #13#10 + #13#10 +
  '本次操作将被取消!', '提示', mb_OK + mb_IconExclaMation);
  fmHiddenRecord.fmHRreMeasure8.SetFocus;
  Abort;
  end;

 IF (DMMain.dsHiddenMaster.DataSet.State <> dsInsert) OR (DMMain.dsHiddenDetails.DataSet.State <> dsInsert) Then
  Abort
 Else
  begin
  DMMain.dsHiddenMaster.DataSet.FieldByName('隐患编号').AsInteger :=
  StrToInt(fmHiddenRecord.fmHRedCode0.Text);
  DMMain.dsHiddenMaster.DataSet.FieldByName('检查日期').AsDateTime :=
  fmHiddenRecord.fmHRdtExamine1.Date;
  DMMain.dsHiddenMaster.DataSet.FieldByName('被检单位').AsString :=
  fmHiddenRecord.fmHRcboxUnit2.Text;
  DMMain.dsHiddenMaster.DataSet.FieldByName('负责人').AsString :=
  fmHiddenRecord.fmHRcboxReceived3.Text;
  DMMain.dsHiddenMaster.DataSet.FieldByName('检查人').AsString :=
  fmHiddenRecord.fmHRcboxRummager4.Text;
  DMMain.dsHiddenMaster.DataSet.FieldByName('检查单位意见').AsString :=
  fmHiddenRecord.fmHRedIdea6.Text;
  IF fmHiddenRecord.fmHRcboxDeadline5.Text <> '10天' Then
  begin
  DMMain.dsHiddenMaster.DataSet.FieldByName('整改期限').AsInteger :=
  StrToInt(Copy(fmHiddenRecord.fmHRcboxDeadline5.Text, 1,
  Pos('天', fmHiddenRecord.fmHRcboxDeadline5.Text) - 1));
  end
  ELSE
  begin
  DMMain.dsHiddenMaster.DataSet.FieldByName('整改期限').AsInteger :=
  StrToInt(Copy(fmHiddenRecord.fmHRcboxDeadline5.Text, 1,
  Pos('天', fmHiddenRecord.fmHRcboxDeadline5.Text) - 1));
  end;
  For HiddenLines := 0 to fmHiddenRecord.fmHRreDetails7.Lines.Count - 1 Do
  For MeasureLines := 0 to fmHiddenRecord.fmHRreMeasure8.Lines.Count - 1 Do
  begin
  DMMain.dsHiddenDetails.DataSet.Append;
  DMMain.dsHiddenDetails.DataSet.FieldByName('父编号').AsInteger :=
  StrToInt(fmHiddenRecord.fmHRedCode0.Text);
  DMMain.dsHiddenDetails.DataSet.FieldByName('编号').AsString :=
  fmHiddenRecord.fmHRedCode0.Text + '-' + '1';
  DMMain.dsHiddenDetails.DataSet.FieldByName('隐患内容').AsString :=
  fmHiddenRecord.fmHRreDetails7.Lines.Strings[HiddenLines];
  DMMain.dsHiddenDetails.DataSet.FieldByName('整改措施').AsString :=
  fmHiddenRecord.fmHRreMeasure8.Lines.Strings[MeasureLines];
  end;
  end;
 IF (DMMain.dsHiddenMaster.DataSet.State = dsInsert) And
  (DMMain.dsHiddenDetails.DataSet.State = dsInsert) Then
  begin
  DMMain.dsHiddenDetails.DataSet.Post;


  DMMain.dsHiddenMaster.DataSet.Post;
  end;
end;


[解决办法]
由于不清楚你的数据库结构,只能猜测如下:

估计 DMMain.dsHiddenDetails.DataSet 的“编号”字段是不许数值重复的字段,因而,

Delphi(Pascal) code
......   DMMain.dsHiddenDetails.DataSet.FieldByName('编号').AsString :=   fmHiddenRecord.fmHRedCode0.Text + '-' + '1';......
[解决办法]
重复了,检查看看那个字段是不允许重复的

另外用DB控件吧,可以省掉赋值的代码

热点排行