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

时间:2011-06-20 00:29:30

标签: c# asp.net sql tsql stored-procedures

我是开发存储过程的新手,所以在我的尝试中,我有点难以置信。我基本上理解它们在概念上是什么,但在实施时遇到问题。作为参考,我是手工编码,但打算使用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#端使用的变量?

我也不确定如何在这个空间中加入安全性,安全性也很重要。

如果你能提供解释的例子,那将非常有帮助。

4 个答案:

答案 0 :(得分:0)

以下是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

答案 1 :(得分:0)

另一方面,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

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

答案 2 :(得分:0)

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

您在其他答案中有存储过程的示例,但为什么使用存储过程? ORM是一种更容易,更高效的做事方式。我最喜欢的是NHiberntate。 LINQ to SQL,Entity Framework来自Microsoft。只需谷歌搜索“linq to sql hello world”,看看它是如何完成的。

在99.99%的情况下,ORM很好。当您需要用SQL查询或sp替换ORM时,很少见。

答案 3 :(得分:0)

存储过程是将SQL脚本存储在中心位置的好方法。这是最基本,最简单的概念。如果您的代码中有一个脚本(更新TABLE设置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);