用于帐户创建/更新/删除/身份验证的存储过程

本文关键字:身份验证 存储过程 删除 更新 创建 用于 | 更新日期: 2023-09-27 17:59:28

我是开发存储过程的新手,所以在尝试中我有点不知所措。我基本上理解它们的概念,但在实现时存在问题。作为参考,我正在手工编写代码,但打算使用SQL Server、ASP.NET和C#技术。

用户的基本想法是创建自己的用户帐户,根据需要更新信息,删除帐户,并根据需要验证信息(用户名和密码、帐户信息等)。我认为这必须使用4个不同的存储过程来完成:createAccountmodAccountdelAccountauthentAccount

我的理解是,C#/ASP应该进行实际的数据收集,然后将数据传输到SQL以插入数据库。如果我错了,或者有更有效的方法,请纠正我(速度对此非常重要)。

开始使用第一个存储过程(创建)时,我编码为:

CREATE PROC createAccount
AS
INSERT INTO Customer (cssn, first_name, middle_name, last_name, company, address, phone_number, email, account, occupation, nationality, social, successful_invites)
VALUES ()
GO

我为价值观投入了什么?C#端使用的变量是什么?

我也不确定我应该如何将安全性纳入这个空间,安全性也很重要。

如果你能在解释中举例说明,那将是非常有帮助的。

用于帐户创建/更新/删除/身份验证的存储过程

以下是SP的基本形式(显示前3列):

create procedure createAccount
(
    @cssn varchar(100), 
    @first_name varchar(100), 
    @last_name  varchar(100), 
    ...  -- remaining columns
) 
as
begin
    insert into Customer (cssn, first_name, last_name, ... )
    values (@cssn, @first_name, @last_name, ... )
end

有一点需要注意,ASP内置了用户帐户,如果您只想使用这些帐户(SqlMembershipProvider),则会自动设置这些帐户。

CREATE PROCEDURE createAccount
    @cssn VARCHAR(100)
    , @first_name VARCHAR(100)
    , @middle_name VARCHAR(100)
    , @last_name VARCHAR(100)
    , @company VARCHAR(100)
    , @address VARCHAR(150)
    , @phone_number VARCHAR(20)
    , @email VARCHAR(100)
    , @account VARCHAR(100)
    , @occupation VARCHAR(100)
    , @nationality VARCHAR(100)
    , @social VARCHAR(100)
    , @successful_invites INT
AS
BEGIN
    INSERT INTO Customer ( cssn, first_name, middle_name, last_name, company, address, phone_number, email, account, occupation, nationality, social, successful_invites )
    VALUES ( @cssn, @first_name, @middle_name, @last_name, @company, @address, @phone_number, @email, @account, @occupation, @nationality, @social, @successful_invites )
END

我只是猜测了一下数据类型。至于安全性,您唯一需要添加的就是重新验证规则(即阻止VARCHAR字段中的HTML标记和内容)。否则,安全性是自动内置的,因为您使用的是参数和变量(而不是动态sql)。

如果您想使用SqlMembershipProvider,您已经在asp.net中提供了一组可以帮助您的控件。您可能必须使用他们的表,而不是您的Customer表,但这是可以的,因为会员资格提供商会处理所有事情。只需在谷歌上搜索有关会员资格提供商和登录控件的更多信息。

您在其他答案中有存储过程的示例,但为什么要使用存储过程?ORM是一种更简单、更高效的做事方式。我最喜欢的是NHibertate。LINQ到SQL、实体框架均来自微软。只需在谷歌上搜索一个"linq-to-sql-helloworld",看看它是如何做到的。

在99.99%的情况下,ORM是很好的。在极少数情况下,您需要用sql查询或sp替换ORM。

存储过程是将SQL脚本存储在中心位置的好方法。这是最基本、最简单的概念。如果您的代码中有一个带有(updateTABLE set EMAIL='"+EMAIL+"')的脚本,那么最好将其放入存储过程中。您甚至可以在返回现有/更新或新建记录的ID的相同过程中进行添加和更新。你可以和他们一起变得非常有创意。

当然,如果安全的话,您可以在相同的过程中进行更新和添加。

create usp_AddEmail(
    @email varchar(50)
)
AS
    DECLARE @EMAILID INT;
    SET @EMAILID = (SELECT ID FROM TABLE WHERE EMAIL = @EMAIL);
    IF ISNULL(@EMAILID,0) = 0
    BEGIN
        INSERT INTO TABLE(EMAIL) VALUES(@email);
        SET @EMAILID = (SELECT ID FROM TABLE WHERE EMAIL = @EMAIL);
    END
    SELECT @EMAILID AS EMAILID

在C#中,可以使用CommandType=CommandType.StoredProcedure让它知道它是一个存储过程。然后使用.Parameters.AddWithValue(sqlParameter,value)传递该值。(你可以把它包装成一种方法):

SqlConnection connLoc = new SqlConnection(YourConnectionSring);
SqlCommand commLoc = new SqlCommand();
SqlDataReader drLoc;
commLoc.Connection = connLoc;
commLoc.CommandType = CommandType.StoredProcedure;
commLoc.CommandText = "usp_AddEmail";
commLoc.Parameters.AddWithValue(@email, emailString);
connLoc.Open();
drLoc = commLoc.ExecuteReader(CommandBehavior.CloseConnection);