2011-06-20 93 views
0

我是新來開發存儲過程,所以在我的嘗試,我有點難以置信。我基本理解他們在概念上是什麼,但在實施時遇到問題。作爲參考,我是手動編碼,但打算使用SQL Server,ASP.NET和C#技術。存儲過程帳戶創建/更新/刪除/驗證

基本思想是讓用戶創建自己的用戶帳戶,根據需要更新他們的信息,刪除他們的帳戶,並根據需要驗證信息(用戶名&密碼,帳戶信息等)。我認爲這必須用4個不同的存儲過程來完成:createAccountmodAccountdelAccount,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

不要聽起來很刺耳,但你爲什麼不嘗試先學習基礎知識,然後再問一些更具體的問題?有數百個教程(例如http://www.sql-server-performance.com/2003/stored-procedures-basics,http://www.csharp-station.com/Tutorials/AdoDotNet/Lesson07。 aspx和其他),這些可能比您在此期待的5行評論更有幫助。 – matk

回答

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 
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),所以安全性是自動內置的。

0

如果你想使用SqlMembershipProvider,你已經在asp.net中有一組控件可以幫助你。你可能不得不使用他們的表格而不是你的客戶表格,但這是可以的,因爲會員提供商會處理所有事情。只需google關於會員提供商和登錄控制的更多信息。

你有其他答案的存儲過程的例子,但爲什麼使用存儲過程? ORM是一種更簡單,更高效的做事方式。我最喜歡的是NHiberntate。 LINQ to SQL,Entity Framework都來自微軟。只是谷歌的「LINQ到SQL世界你好」,看看它是如何完成的。

在99.99%的情況下,ORM很好。當您需要用sql查詢或sp替換ORM時,極少有情況。

0

存儲過程是將SQL腳本存儲在中心位置以及其他事物的好方法。這是最基本的,最簡單的概念。如果你的代碼中有一個腳本(update 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);