【问题标题】:Searching database for existing record problems在数据库中搜索现有记录问题
【发布时间】:2013-10-26 16:00:06
【问题描述】:

我正在制作一个具有注册页面并将数据保存到数据库的程序。我正在尝试验证用户名,这样就不会有人使用相同的用户名。用户名也是我数据库中的主键。当我单击提交按钮时,程序要么冻结,要么给我以下信息错误消息:“带有消息的异常类 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;

【问题讨论】:

  • 移动 tblUserInfo.First;在此之前,重新考虑您的策略
  • 如前所述,First 语句需要在循环之前执行,否则数据集游标会在每次迭代时一直返回到第一条记录。另外,为什么不做一个简单的查询select * from users where username = [username]?
  • 如果我这样做,它会在 while NOT 行上给我一个错误。错误是“未声明的标识符:'tblUserInfo'”和同一行代码上的另一个错误说“'DO'预期但找到标识符“EOF””
  • "给我一个错误" 可能是因为您已将 tblUserinfo.First 移到“with dmPredictGame ...”块之外。顺便说一句,避免像瘟疫这样的“with ...”结构。
  • 如果用户名是主键,为什么不尝试在事务中使用它呢?如果失败,事务将被回滚,您将知道用户名已被占用。

标签: database delphi validation


【解决方案1】:

要使用您的方法进行搜索,请务必将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;

【讨论】:

  • 哇,我不敢相信我没有尝试使用 Locate.. 现在感觉有点像个白痴哈哈.. 现在完美运行。谢谢马库斯
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-16
相关资源
最近更新 更多