我是开发存储过程的新手,所以在我的尝试中,我有点难以置信。我基本上理解它们在概念上是什么,但在实施时遇到问题。作为参考,我是手工编码,但打算使用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#端使用的变量?
我也不确定如何在这个空间中加入安全性,安全性也很重要。
如果你能提供解释的例子,那将非常有帮助。
答案 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);