用于帐户创建/更新/删除/身份验证的存储过程
本文关键字:身份验证 存储过程 删除 更新 创建 用于 | 更新日期: 2023-09-27 17:59:28
我是开发存储过程的新手,所以在尝试中我有点不知所措。我基本上理解它们的概念,但在实现时存在问题。作为参考,我正在手工编写代码,但打算使用SQL Server、ASP.NET和C#技术。
用户的基本想法是创建自己的用户帐户,根据需要更新信息,删除帐户,并根据需要验证信息(用户名和密码、帐户信息等)。我认为这必须使用4个不同的存储过程来完成:createAccount
、modAccount
、delAccount
、authentAccount
。
我的理解是,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);