代码处理用户注册和发送激活链接的问题 [英] Problem with the Code Handling User Registration and Send Activation Link

查看:90
本文介绍了代码处理用户注册和发送激活链接的问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在研究我的学期项目。以下是管理员使用基本信息用户名电子邮件和cnic创建用户帐户的方案,然后将激活链接发送给用户到他的电子邮件,然后用户按照该电子邮件激活他的帐户并为其帐户设置密码然后登录到享受他的帐户设施。



但是当代码给出一些错误时,基本信息会成功插入数据库但激活码并没有存储在数据库中。这是完整的代码。如果有人可以帮助PLZ ...存储过程USP_Register_Candidate工作正常但存储过程USP_CandidateActivation没有将cand id和激活码插入数据库。

管理员添加候选代码

 使用系统; 
使用 System.Collections.Generic;
使用 System.Linq;
使用 System.Web;
使用 System.Web.UI;
使用 System.Web.UI.WebControls;
使用 System.Data.SqlClient;
使用 System.Configuration;
使用 System.Net;
使用 System.Net.Mail;
使用 System.Data;

public partial class AdminAddCandidate:System.Web.UI.Page
{
DBClass db1 = new DBClass();


受保护 void Page_Load( object sender,EventArgs e)
{

}

protected void BtnRegisterCand_Click1( object sender,EventArgs e)
{
int userId = 0 ;
db1.sqlcmd = new SqlCommand( USP_Register_Candidate);

使用(SqlDataAdapter sda = new SqlDataAdapter())
{
db1.sqlcmd.CommandType = CommandType.StoredProcedure;
db1.sqlcmd.Parameters.AddWithValue( @ UserName,TxtBxCandUsername.Text.Trim ());
db1.sqlcmd.Parameters.AddWithValue( @ CNIC,TxtBxCandCNIC.Text.Trim ());
db1.sqlcmd.Parameters.AddWithValue( @ Email,TxtBxCandEmail.Text.Trim ());
db1.sqlcmd.Parameters.AddWithValue( @ RecoveryEmail,TxtBxCandRecoveryEmail.Text.Trim ());
db1.sqlcmd.Connection = db1.sqlcon;
db1.sqlcon.Open();
userId = Convert.ToInt32(db1.sqlcmd.ExecuteScalar());
db1.sqlcon.Close();
}

string message = string .Empty;
switch (userId)
{
case -1:
message = 用户名已存在。\\ n请选择其他用户名。;
break ;
case -2:
message = 提供的电子邮件地址已被使用。;
break ;
case -3:
message = 提供的CNIC已被使用。;
break ;
默认
message = 注册成功。\\\\
User Id:
+ userId.ToString();
SendActivationEmail(userId);
break ;
}
ClientScript.RegisterStartupScript(GetType(), alert,< span class =code-string>
alert(' + message + '); true );
}

private void SendActivationEmail( int userId)
{
string activationCode = Guid.NewGuid()。ToString();
db1.sqlcmd = new SqlCommand( USP_CandidateActivation);
使用(SqlDataAdapter sda = new SqlDataAdapter())
{
db1.sqlcmd.CommandType = CommandType.StoredProcedure;
db1.sqlcmd.Parameters.AddWithValue( @ UserId,userId);
db1.sqlcmd.Parameters.AddWithValue( @ ActivationCode,activationCode);
db1.sqlcmd.Connection = db1.sqlcon;
db1.sqlcon.Open();
db1.sqlcmd.ExecuteNonQuery();
db1.sqlcon.Close();
}
使用(MailMessage mm = new MailMessage( sender@gmail.com,TxtBxCandEmail.Text))
{
mm.Subject = < span class =code-string>
帐户激活;
string body = Hello + TxtBxCandUsername.Text.Trim()+ ;
body + = < br />< br />请点击以下链接激活您的帐户;
body + = < br />< a href =' + Request.Url.AbsoluteUri.Replace( AdminAddCandidate.aspx CandidateAccountActivation.aspx?ActivationCode = + activationCode)+ '>点击此处激活您的帐户。< / a>;
body + = < br />< br />感谢< br /> ;选举信息系统;
mm.Body = body;
mm.IsBodyHtml = true ;
SmtpClient smtp = new SmtpClient();
smtp.Host = smtp.gmail.com;
smtp.EnableSsl = true ;
NetworkCredential NetworkCred = new NetworkCredential( someEmail @ gmail.com somePassword);
smtp.UseDefaultCredentials = true ;
smtp.Credentials = NetworkCred;
smtp.Port = 587 ;
smtp.Send(mm);
}
}
}



  CREATE   PROC  USP_CandidateActivation 
@ UserId INT @ ActivationCode UNIQUEIDENTIFIER
AS
BEGIN
INSERT INTO CandidateActivation(CandID,ActivationCode) VALUES @ UserId @ ActivationCode
END



  CREATE   PROC  USP_Register_Candidate 
@UserName VARCHAR 30 ), @ CNIC VARCHAR 13 ), @ Email VARCHAR 50 ), @ RecoveryEmail VARCHAR (Max)
AS
BEGIN
SET NOCOUNT ON ;
IF EXISTS SELECT CandUserName FROM 候选人 WHERE CandUserName = @ UserName
BEGIN
SELECT -1 - 用户名存在。
END
ELSE IF EXISTS SELECT CandEmail FROM 候选人 WHERE CandEmail = @ Email
BEGIN
SELECT -2 - 电子邮件已存在。
END
ELSE IF EXISTS SELECT CandCNIC FROM 候选人 WHERE CandCNIC = @ Email
BEGIN
SELECT -3 - CNIC存在
END
ElSE
BEGIN
INSERT INTO 候选人(CandUserName,CandEmail,CandRecoveryEmail,CreatedDate,CandCNIC) VALUES @ UserName @ Email @ RecoveryEmail ,GETDATE(), @ CNIC SELECT @@ IDENTITY

SELECT SCOPE_IDENTITY () - CandID
END
END









用示例文本替换电子邮件和密码。

[/编辑]

解决方案

我可以看到您的USP_CandidateActivation过程需要作为UNIQUEIDENTIFIER的数据类型,但是您要为ActivationCode传递一个字符串值。这可能是一个问题。你可以试试这个:



 db1.sqlcmd.Parameters.Add(@ ActivationCode,SqlDbType.UniqueIdentifier).Value = Guid.NewGuid (); 


I am Working on My Semester Project. Here is the Scenario that the Admin Creates a User Account With Basic Info username email and cnic, then an activation link is send to user to his email and then user follow that email to activate his account and set password for his account and then login to enjoy facilities of his account.

But When The Code is Giving Some Errors, Basic info is inserted in the database successfully but the activation code and is not stored in the database. Here is the full code. If anyone can Help plz... The Store Procedure USP_Register_Candidate is Working Well but Store Procedure USP_CandidateActivation is not inserting cand id and activation code into the database.
Code For Admin to Add Candidate

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
using System.Configuration;
using System.Net;
using System.Net.Mail;
using System.Data;

public partial class AdminAddCandidate : System.Web.UI.Page
{
    DBClass db1 = new DBClass();


    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected void BtnRegisterCand_Click1(object sender, EventArgs e)
    {
        int userId = 0;
        db1.sqlcmd = new SqlCommand("USP_Register_Candidate");

        using (SqlDataAdapter sda = new SqlDataAdapter())
        {
            db1.sqlcmd.CommandType = CommandType.StoredProcedure;
            db1.sqlcmd.Parameters.AddWithValue("@UserName", TxtBxCandUsername.Text.Trim());
            db1.sqlcmd.Parameters.AddWithValue("@CNIC", TxtBxCandCNIC.Text.Trim());
            db1.sqlcmd.Parameters.AddWithValue("@Email", TxtBxCandEmail.Text.Trim());
            db1.sqlcmd.Parameters.AddWithValue("@RecoveryEmail", TxtBxCandRecoveryEmail.Text.Trim());
            db1.sqlcmd.Connection = db1.sqlcon;
            db1.sqlcon.Open();
            userId = Convert.ToInt32(db1.sqlcmd.ExecuteScalar());
            db1.sqlcon.Close();
        }

        string message = string.Empty;
        switch (userId)
        {
            case -1:
                message = "Username already exists.\\nPlease choose a different username.";
                break;
            case -2:
                message = "Supplied email address has already been used.";
                break;
            case -3:
                message = "Supplied CNIC has already been used.";
                break;
            default:
                message = "Registration successful.\\nUser Id: " + userId.ToString();
                SendActivationEmail(userId);
                break;
        }
        ClientScript.RegisterStartupScript(GetType(), "alert", "alert('" + message + "');", true);
    }

    private void SendActivationEmail(int userId)
    {
        string activationCode = Guid.NewGuid().ToString();
        db1.sqlcmd = new SqlCommand("USP_CandidateActivation");
        using (SqlDataAdapter sda = new SqlDataAdapter())
        {
            db1.sqlcmd.CommandType = CommandType.StoredProcedure;
            db1.sqlcmd.Parameters.AddWithValue("@UserId", userId);
            db1.sqlcmd.Parameters.AddWithValue("@ActivationCode", activationCode);
            db1.sqlcmd.Connection = db1.sqlcon;
            db1.sqlcon.Open();
            db1.sqlcmd.ExecuteNonQuery();
            db1.sqlcon.Close();
        }
        using (MailMessage mm = new MailMessage("sender@gmail.com", TxtBxCandEmail.Text))
        {
            mm.Subject = "Account Activation";
            string body = "Hello " + TxtBxCandUsername.Text.Trim() + ",";
            body += "<br /><br />Please click the following link to activate your account";
            body += "<br /><a href = '" + Request.Url.AbsoluteUri.Replace("AdminAddCandidate.aspx", "CandidateAccountActivation.aspx?ActivationCode=" + activationCode) + "'>Click here to activate your account.</a>";
            body += "<br /><br />Thanks <br /> Electoral Information System";
            mm.Body = body;
            mm.IsBodyHtml = true;
            SmtpClient smtp = new SmtpClient();
            smtp.Host = "smtp.gmail.com";
            smtp.EnableSsl = true;
            NetworkCredential NetworkCred = new NetworkCredential("someEmail@gmail.com", "somePassword");
            smtp.UseDefaultCredentials = true;
            smtp.Credentials = NetworkCred;
            smtp.Port = 587;
            smtp.Send(mm); 
        }
    }
}


CREATE PROC USP_CandidateActivation
@UserId INT, @ActivationCode UNIQUEIDENTIFIER
AS
BEGIN
INSERT INTO CandidateActivation (CandID,ActivationCode) VALUES(@UserId, @ActivationCode)
END


CREATE PROC USP_Register_Candidate
@UserName VARCHAR(30),@CNIC VARCHAR(13), @Email VARCHAR(50),@RecoveryEmail VARCHAR(Max)
AS
BEGIN
      SET NOCOUNT ON; 
      IF EXISTS(SELECT CandUserName FROM Candidates WHERE CandUserName = @UserName)
      BEGIN
            SELECT -1 -- User Name exists.
      END
      ELSE IF EXISTS(SELECT CandEmail FROM Candidates WHERE CandEmail = @Email)
      BEGIN
	  SELECT -2 -- Email exists.
	  END
	  ELSE IF EXISTS (SELECT CandCNIC FROM Candidates WHERE CandCNIC = @Email)
	  BEGIN
	  SELECT -3 -- CNIC exists
	  END
	  ElSE
	  BEGIN
INSERT INTO Candidates (CandUserName,CandEmail,CandRecoveryEmail,CreatedDate,CandCNIC) VALUES(@UserName,@Email,@RecoveryEmail,GETDATE(),@CNIC) SELECT @@IDENTITY

            SELECT SCOPE_IDENTITY() -- CandID                 
     END
END




[Edit member="Tadit"]
Replaced Email and Password with example Texts.
[/Edit]

解决方案

As I can see your USP_CandidateActivation procedure is expecting as datatype of UNIQUEIDENTIFIER, but you are passing a string value for ActivationCode. That could be an issue. You may try this:

db1.sqlcmd.Parameters.Add("@ActivationCode", SqlDbType.UniqueIdentifier).Value = Guid.NewGuid();


这篇关于代码处理用户注册和发送激活链接的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆