如何使用C#.net中的存储过程防止SQL数据库中的重复条目

时间:2011-09-25 03:52:38

标签: asp.net

我正在尝试使用以下4个字段创建一个简单的用户注册表单

  • userid(这是唯一的)
  • 用户名(这是唯一的)
  • 密码
  • 电子邮件

现在我可以阻止用户在Sql数据库中输入重复的用户条目。但是,当用户提供相同的用户ID /用户名或“用户名/用户名不存在时,帐户创建成功”时,想要触发一个事件,该消息可以成功地向用户显示该帐户“已存在”。

请提供一些C#代码帮助(asp.net)来解决这个问题。 感谢。

2 个答案:

答案 0 :(得分:2)

您是否只能使用将测试和插入用户的存储过程并返回带有结果的输出参数?

CREATE PROC addUser @UserID decimal, @Username varchar()..., @Result varchar(50) output
as
if exists(Select UserId from Users  where username = @Username)
begin
 set @Result = 'Already there'
 return
end

insert Users ....
set @Result= 'Success'

答案 1 :(得分:1)

您可以在插入前处理检查。

要执行此操作,您可以使用OnItemInserting事件和DetailsView之类的事件,使用用户输入的值来检查用户名是否存在,如果存在,则取消插入。您可以使用OnItemInserted事件确认之后的新帐户。

你一定要做额外的输入检查和检查值等,但下面只是伪代码,可以帮助你找到正确的方向。

看看这些例子 OnItemInserting http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.detailsview.iteminserting.aspx

OnItemInserted http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.detailsview.iteminserted.aspx

示例(伪代码)

<asp:DetailsView ID="NewAccount" runat="server"
    DataSourceID="Account"
    AutoGenerateRows="false"
    OnItemInserted="NewAccount_ItemInserted"
    OnItemInserting="NewAccount_ItemInserting">
    <Fields>
      <asp:BoundField DataField="UserName" HeaderText="UserName" />
      <asp:TemplateField HeaderText="Password">
          <InsertItemTemplate>
            <%-- Put your password boxes here --%>
          </InsertItemTemplate>
      </asp:TemplateField>
      <asp:BoundField DataField="Email" HeaderText="Email" />
    </Fields>
  </asp:DetailsView>

背后的代码

void NewAccount_ItemInserted(object sender, DetailsViewInsertedEventArgs e)
  {
    // Account successfully inserted
    PanelAccountSuccessful.Visible = true; // Show the successful message

  }

  void NewAccount_ItemInserting(object sender, DetailsViewInsertEventArgs e)
  {
    // Check for account that exists
    SqlConnection ....
    SqlDataSource ....

    //use e.Values["key"] to compare
    // select an account that matches e.Values["UserName"] and/or e.Values["Email"]
    SqlDataReader reader ....

    while (reader.read())
    {
        // If you returned results then the account exists
        PanelAccountExists.Visible = true; // Show the error message that the account exists
        e.Cancel = true; // This cancels the insert
    }

    // Otherwise this will fall through and do the insert
    // Check that the passwords match and any other input sanitation you need
    if (Password1.Text.Trim() != Password2.Text.Trim())
        e.Cancel = true; // Cancel if passwords don't match
  }