2012-08-27 49 views
2

我正在使用ASP.NET 4.0,C#和SQL Server 2008 R2。我從網頁中的用戶處獲取UserName,以便存儲在SQL表User_Info2中。使用SQL Server 2008功能「計算列」,我使用存儲過程爲每個Insert自動生成Vendor_ID。在按鈕單擊時,在插入記錄後,我想用Vendor_ID顯示消息,那麼請任何人告訴我如何從存儲過程獲取Vendor_ID列?如何在存儲過程中獲得計算列值

CREATE TABLE User_Info2 
    ( SNo int Identity (2000,1) , 
     Vendor_ID AS 'VEN' + CAST(SNo as varchar(16)) PERSISTED PRIMARY KEY, 
     UserName VARCHAR(30) NOT NULL 
    ) 

存儲過程

ALTER PROCEDURE [dbo].[usp_User_Info2] @UserName VARCHAR(30) 
    AS 
    BEGIN 
     SET NOCOUNT ON; 

     INSERT INTO User_Info2 (UserName) VALUES (@UserName) 
    END 

C#代碼:

protected void BtnUserNext_Click(object sender, EventArgs e) 
{  
    SqlConnection SqlCon = new SqlConnection(GetConnectionString()); 
    SqlCommand cmd = new SqlCommand(); 
    cmd.CommandType = CommandType.StoredProcedure; 
    cmd.CommandText = "usp_User_Info2"; 
    cmd.Parameters.Add("@UserName", SqlDbType.VarChar).Value = txtUserName.Text.Trim();  
    cmd.Connection = SqlCon;  
    try 
    {  
    SqlCon.Open(); 
    cmd.ExecuteScalar(); 
    } 
    finally 
    { 
    string url = "../CompanyBasicInfo.aspx?Parameter=" + Server.UrlEncode ("+ Vendor_ID +"); 
    ClientScript.RegisterStartupScript(this.GetType(),"callfunction", 
    "alert('Login created successfully for "+ Vendor_ID +"'); 
    window.location.href = '" + url + "';", true); 
    SqlCon.Close();  
    }  
} 
+0

是否要插入id值? –

+0

使用選擇查詢最後一條記錄 –

+0

我必須像這樣在SP中聲明Vendor_ID? @Vendor_ID INT輸出? – Hari

回答

6

您可以輸出使用OUTPUT條款,然後插入值讀取它,當你執行存儲過程:

ALTER PROCEDURE [dbo].[usp_User_Info2] @UserName VARCHAR(30) 
AS 
BEGIN 
    SET NOCOUNT ON; 

    INSERT INTO User_Info2 (UserName) 
    OUTPUT Inserted.Vendor_ID 
    VALUES (@UserName) 
END 

,並在C#調用代碼:

object spResult; 
    string vendorID; 

    try 
    {  
    SqlCon.Open(); 
    spResult = cmd.ExecuteScalar(); 

    if(spResult != null) // check to make sure you got something back! 
    { 
     vendorID = spResult.ToString(); 
    }   
    } 
+0

** + 1 **很好的解釋 –

+1

+1好用的功能..有用的知道.. –

0

也ü可以這樣做

select top(1) Vendor_ID from User_Info2 order by SNo desc 
+0

這只是返回任何「頂1」行 - 但不一定插入一個....如果多個客戶端已插入多行或多或少地在同一時間?你只是回到最後 - 但它可能不是這個調用插入的那個..... –

+0

只有在插入後才執行這個查詢,所以它顯示最後一個插入記錄 –

+0

我明白你的方法 - 但是在系統下負載,這是**不是**可靠 - 完全沒有。 ....如果你有50個客戶端在數據庫上敲打 - 有**沒有保證**,你會回到你實際插入的行。您至少應該**也確保選擇正確的行:'WHERE UserName = @ UserName' - 但即使這樣也不是100%安全可靠。 –

1

你可以試試這個

ALTER PROCEDURE [dbo].[usp_User_Info2] @UserName VARCHAR(30) 
AS 
BEGIN 
    SET NOCOUNT ON; 

    declare @Id int 

    INSERT INTO User_Info2 (UserName) VALUES (@UserName) 

    SET @Id = Scope_Identity() 

    SELECT Vendor_ID From User_Info2 WHERE SNo = @Id 
END 

C#

try 
{  
    SqlCon.Open(); 
    string VendorID = cmd.ExecuteScalar() as string; 
} 
+0

現在我得到了不同的問題。請參考此問題http://stackoverflow.com/questions/12137760/how-to-get-computed-column-value-in-stored-procedure – Hari

+0

你是什麼意思?您可以提出一個新問題 – codingbiz

+0

是的。將參數傳遞給計算列Vendor_ID的問題。我無法找到錯誤「過程或函數usp_User_Info3指定了太多參數」的錯誤解決方案。因此,我在此處詢問了一個新問題http://stackoverflow.com/questions/12156132/stored-procedure-error-when-use-computed-column-for-id – Hari

0

你可以獲取當前插入行的幫助的SCOPE_IDENTITY()

SET @SNo = SCOPE_IDENTITY() 

及以下插入查詢可以執行對@SNo

選擇查詢,因此,這將是:

ALTER PROCEDURE [dbo].[usp_User_Info2] 
(
    @UserName VARCHAR(30), 
    @SNo int, 
    @Vendor_ID VARCHAR(50) OUTPUT 
) 
AS 
BEGIN 
    SET NOCOUNT ON; 

    INSERT INTO User_Info2 (UserName) VALUES (@UserName) 
    SET @SNo = Scope_Identity() 


    select @Vendor_ID as Vendor_ID from User_Info2 where SNo = @SNo 

END 

編輯:

SqlParameter[] param= new SqlParameter[1]; 

param[0] = new SqlParameter("@Vendor_ID", 0); 
param[0].Direction = ParameterDirection.Output; 

// Here there will be a Stored Procedure Call 

int VendorID = Convert.ToInt32(param[0].Value); 

所以現在你會@Vendor_ID這是一個Output變量。

+0

如何檢索前端C#代碼中的Vendor_ID? – Hari

+0

更新了答案...... @ Hari –

+0

請參閱本文並回復。在此先感謝http://stackoverflow.com/questions/12137760/how-to-get-computed-column-value-in-stored-procedure – Hari

相關問題