【问题标题】:Stored Procedure for Account Creation/Update/Delete/Authenticate帐户创建/更新/删除/验证的存储过程
【发布时间】:2011-09-18 08:31:11
【问题描述】:

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

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

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

【问题讨论】:

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


【解决方案1】:

这是您的 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

【讨论】:

    【解决方案2】:

    附带说明,如果您只想使用这些用户帐户(SqlMembershipProvider),ASP 内置并自动设置这些用户帐户。

    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)。

    【讨论】:

      【解决方案3】:

      如果你想使用 SqlMembershipProvider,你已经在 asp.net 中有一组可以帮助你的控件。您可能必须使用他们的表而不是您的 Customer 表,但这没关系,因为会员提供商会处理所有事情。只需 google 以获取有关会员提供程序和登录控件的更多信息。

      您在其他答案中有存储过程的示例,但为什么要使用存储过程? ORM 是一种更简单、更高效的做事方式。我最喜欢的是 NHiberntate。 LINQ to SQL、Entity Framework 都来自微软。只需在 Google 上搜索“linq to sql hello world”即可查看它是如何完成的。

      在 99.99% 的情况下,ORM 就可以了。在极少数情况下,您需要将 ORM 替换为 sql 查询或 sp。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-02-27
          • 1970-01-01
          • 1970-01-01
          • 2017-01-06
          • 2014-03-13
          • 2013-05-31
          • 2018-10-11
          相关资源
          最近更新 更多