unit Unit3;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, DB, ADODB, DBCtrls;type
   TEditPasswordForm = class(TForm)
    Label1: TLabel;
    Edit_oldPass: TEdit;
    Label2: TLabel;
    Edit_newPass: TEdit;
    Label3: TLabel;
    Edit_againPass: TEdit;
    BitBtn_passOk: TBitBtn;
    BitBtn_cancel: TBitBtn;
    Label4: TLabel;
    DBComboBox_User: TDBComboBox;
   procedure BitBtn_cancelClick(Sender: TObject);
   procedure FormCreate(Sender: TObject);
   procedure BitBtn_passOkClick(Sender: TObject);
   procedure Edit_oldPassKeyPress(Sender: TObject; var Key: Char);
   procedure Edit_newPassKeyPress(Sender: TObject; var Key: Char);
   procedure Edit_againPassKeyPress(Sender: TObject; var Key: Char);
   procedure DBComboBox_UserChange(Sender: TObject);
 
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  EditPasswordForm: TEditPasswordForm;
 //User_Password:string;
   mm:string;implementation{$R *.dfm}
uses unit1,unit2,Cuser_in,unit4;procedure TEditPasswordForm.FormCreate(Sender: TObject);
begin
    Edit_oldPass.Clear;
    Edit_newPass.Clear;
    Edit_againPass.Clear;
    DBComboBox_User.SetFocus;
    DBComboBox_User.DataField:='User_Name';
    DBCombobox_User.ItemIndex:=0;
  // while not DataModule2.ADODataSet1.Eof do
  // begin
   // DataModule2.ADODataSet1.First;
    DBCombobox_User.Items.Add(DataModule2.ADODataSet1.FieldByName('User_Name').asstring);
  //  DataModule2.ADODataSet1.Next;
  //  DataModule2.ADODataSet1.Close;
   //end;
end;procedure TEditPasswordForm.DBComboBox_UserChange(Sender: TObject);
begin
  DataModule2.ADODataSet1.Close;
  DataModule2.ADODataSet1.SQL.Clear;
  DataModule2.ADODataSet1.SQL.Add('select *from user_test where User_Name=''+DBCombobox_User.text+''');
  DataModule2.ADODataSet1.open;
  DataModule2.ADODataSet1.Locate('User_Name',DBCombobox_User.text,[]);
  mm:=DataModule2.ADODataSet1.FieldByname('User_Password').asstring ;//where User_Name:=DBCombobox_User.text;
 // mm:=DataModule2.ADODataSet1.Lookup('User_Name',DBCombobox_User.text,'User_Password').asstring;
  DataModule2.ADODataSet1.Close;
end;procedure TEditPasswordForm.BitBtn_passOkClick(Sender: TObject);
begin
  if Trim(Edit_oldPass.text)<>mm then
    Application.MessageBox('输入旧密码错误!','提示窗口',mb_Ok+mb_IconStop)
  else
  begin
    if Trim(Edit_newPass.text)<>Trim(Edit_againPass.text) then
       begin
       Application.MessageBox('您两次输入的密码不一致,请重新输入!','提示窗口',mb_Ok+mb_IconStop);
       Edit_oldPass.Clear;
       Edit_newPass.Clear;
       Edit_againPass.Clear;
       Edit_oldPass.SetFocus;
       end
    else
    begin
    if ((DBComboBox_User.Text<>'')and(Edit_oldPass.Text<>'')) then
      with DataModule2.ADODataSet1 do
        begin
         Open;
         Edit;
         FieldByName('User_Password').asstring:=Trim(Edit_newPass.text);
         Post;
         Close;
         Application.MessageBox('密码修改成功!','提示窗口',mb_Ok+mb_IconInformation)
        end ;
    end;
  end;
end;procedure TEditPasswordForm.BitBtn_cancelClick(Sender: TObject);
begin
  DataModule2.ADODataSet1.Close;
 // DBComboBox_User.Clear;
 // Edit_oldPass.Clear;
 // Edit_newPass.Clear;
 // Edit_againPass.Clear;
  EditPasswordForm.Close;
  MainForm.Enabled:=True;
end;end.
运行时出现错误“违反了PRIMARY KEY约束‘PK_name’。不能在对象‘use_test’中插入重复键。”
麻烦大家了,继续帮助,谢谢了!

解决方案 »

  1.   

    我是个新手,好多不会,麻烦大家帮帮忙,好吗?对delphi热心的学者
      

  2.   

    ADODataSet1看这个数据集关联的表(use_test)中的主键是如何定义的,
    错误提示很明显了"运行时出现错误“违反了PRIMARY KEY约束‘PK_name’。不能在对象‘use_test’中插入重复键。”
      

  3.   

    出错的那一行是  mm:=DataModule2.ADODataSet1.FieldByname('User_Password').asstring ;//where User_Name:=DBCombobox_User.text; 
    可我真的不知道怎么改了,麻烦指教,谢谢了
      

  4.   

    看你數據庫里面的PK_name字段,是不是設置了主鍵
    如果是,主鍵值就不能相同,也不能為空。
    我懷疑是設置了主鍵,字段類型是int,但是沒有設置自增
      

  5.   

    主键是User_Name, 数据类型varchar,大小50,请教
      

  6.   

    字段类型是varchar,大小是50,请问自增怎么设置?
      

  7.   

    失望透顶了,csdn里这么多高手,却没一个愿意帮我的,终于明白了为什么delphi如此没落了基础差的人想学学不好,基础好的人不愿意教
      

  8.   

    把下面这部分改一下:
        if ((DBComboBox_User.Text <>'')and(Edit_oldPass.Text <>'')) then
          with DataModule2.ADODataSet1 do
            begin
            Open;
            Edit;
            FieldByName('User_Password').asstring:=Trim(Edit_newPass.text);
            Post;
            Close;
            Application.MessageBox('密码修改成功!','提示窗口',mb_Ok+mb_IconInformation)
            end ;
        end; 
    改成如下:
        if ((DBComboBox_User.Text <>'')and(Edit_oldPass.Text <>'')) then
          with DataModule2.ADODataSet1 do
            begin
            Close;
            CommandText := ' select * from use_test where User_Name='''+DBCombobox_User.text+'''';
            Open;
            Edit;
            FieldByName('User_Password').asstring:=Trim(Edit_newPass.text);
            Post;
            Close;
            Application.MessageBox('密码修改成功!','提示窗口',mb_Ok+mb_IconInformation)
            end ;
            Close;
            CommandText  := ' select * from user_test'; //重新刷新
            Open;
        end; 
    然后你再重新刷新一下.楼主也别感慨了....
      

  9.   

    你的方法我试过了,还是不行,和以前一样的错误“违反了PRIMARY KEY约束‘PK_name’。不能在对象‘use_test’中插入重复键。”
    错误的一行在 mm:=DataModule2.ADODataSet1.FieldByname('User_Password').asstring ;//where User_Name:=DBCombobox_User.text; 
    不过还是很感谢,你的代码比我的完善!
      

  10.   

        if ((DBComboBox_User.Text <>'')and(Edit_oldPass.Text <>'')) then
          with DataModule2.ADOQuery1 do
            begin
            Close;
            SQL.text := ' update use_test set user_password=''+trim(Edit_newPass.text)+'' where User_Name='''+DBCombobox_User.text+'''';
            Execsql;
            Close;
            end ;
          with DataModule2.ADODataSet1 do
          begin
            close;
            Open;
          end;
          Application.MessageBox('密码修改成功!','提示窗口',mb_Ok+mb_IconInformation)    end;看看这样执行如何,然后设断把SQL执行看看是什么错误,再检查 一下你表中的数据.
      

  11.   

    procedure TEditPasswordForm.DBComboBox_UserChange(Sender: TObject);
    begin
      DataModule2.ADODataSet1.Close;
      DataModule2.ADODataSet1.CommandText:='select * from user_test where User_Name='''+DBCombobox_User.text+'''';
      DataModule2.ADODataSet1.open;
     // DataModule2.ADODataSet1.Locate('User_Name',DBCombobox_User.text,[]);
      mm:=DataModule2.ADODataSet1.FieldByname('User_Password').asstring;// where User_Name:=DBCombobox_User.text;
     // mm:=DataModule2.ADODataSet1.Lookup('User_Name',DBCombobox_User.text,'User_Password').asstring;
      DataModule2.ADODataSet1.Close;
    end;我现在 改成这样了,可是DBComboBox_User下拉时能看到items,可是鼠标一点击别的控件如edit,DBComboBox_User的items就没有了,这是怎么回事啊?