2013-10-26 41 views
2

我正在制作一个程序,它有一个注册页面并将数据保存到数据库。我正在尝试验证用户名,以便不会有具有相同用户名的用户。用户名也是我数据库中的主键。当我单击提交按钮时,程序可能会冻结或给我下面的内容错误消息:“带消息的异常类EOIeException”您向表请求的更改不成功,因为它们会在索引,主键或关系中创建重复值。更改包含重复数据的字段中的数据,删除索引,或重新定义索引以允许重复项,然后再试一次”搜索数据库中存在的记录问题

我使用下面的代码,如果编辑框中的文字出现在数据库中,如果它做它应该显示一个消息框。但相反,它提供了搜索我如上所述的错误。

with dmPredictGame do 
    while NOT tblUserInfo.EOF do 
    begin 
     tblUserInfo.First; 
     if Uppercase(edtUsername.Text) = tblUserInfo['Username'] then 
     begin 
      MessageDlg('The username "' + edtUsername.Text + '" already exists!', mtError, [mbOK], 0); 
      edtusername.SetFocus; 
      exit; 
     end 
     else 
     tblUserInfo.Next; 
     tblUserInfo.Close 
    end; 
+4

move tblUserInfo.First;之前,重新考虑你的策略 – ComputerSaysNo

+2

如前所述,“First”语句需要在循环之前进行,否则数据集游标会在每次迭代时都返回到第一条记录。另外,为什么不只是做一个简单的查询'选择*从用户的用户名= [用户名]'? –

+0

如果我这样做,它会给我一个错误,而不是行。错误是“未声明的标识符:'tblUserInfo'”和另一个错误在同一行代码说''做'预期,但标识符'EOF'找到“ – user931018

回答

4

要搜索使用方法,一定要放First外循环,否则你会继续首发过,从来没有完成:

// Go to the beginning 
tblUserInfo.First; 
while NOT tblUserInfo.EOF do 
begin 
    // Set both to upper so they match 
    // Use FieldByName (it's not an array) 
    if Uppercase(edtUsername.Text) = Uppercase(tblUserInfo.FieldByName('Username').AsString) then 
    begin 
    MessageDlg('The username "' + edtUsername.Text + '" already exists!', mtError, [mbOK], 0); 
    edtUsername.SetFocus; 
    Exit; 
    end; 
    tblUserInfo.Next; 
end; 

然而,对于搜索,你应该考虑使用Locate

if tblUserInfo.Locate('UserName', edtUserName.Text, [loCaseInsensitive]) then 
begin 
    // Username exists 
end; 
+0

哇我不敢相信我没有尝试使用定位..感觉有点像一个白痴现在哈哈..现在完美的作品。谢谢Markus – user931018