2011-12-29 22 views
3

我的服務器上有一個存儲過程,插入一些參數並返回插入的ID。我寫一個表單很容易做到這一點,但我似乎無法得到傳回的參數。C#SQL存儲過程(插入) - 傳遞參數和檢索參數

爲了節省您一大堆可能毫無意義的閱讀,最好只關注我的C#代碼,讓我知道我需要做什麼才能傳遞參數並獲得回報。

C#的Default.aspx

connection = new SqlConnection(ConfigurationManager.AppSettings["ConnectionInfo"]); 
sql = "aStoredProc"; 

command = new SqlCommand(sql, connection); 
command.CommandType = CommandType.StoredProcedure; 

command.Parameter.Add(new SqlParameter("@FirstName", SqlDbType.VarChar)).Value = sFirstname; 
command.Parameter.Add(new SqlParameter("@SurName", SqlDbType.VarChar)).Value = sSurname; 

connection.Open(); 
int ID = command.ExecuteNonQuery(); 
connection.Close(); 

SQL aStoredProc

IF EXISTS(SELECT * FROM aTable WHERE ID = @ID) 
    -- User exists, update details 
    BEGIN 
    BEGIN TRAN 
     UPDATE aTable 
     SET 
      FirstName = @FirstName, 
      SurName = @SurName, 
      LastUpdate = GetDate() 
     WHERE ID = @ID 

     IF (@@Error != 0) 
      ROLLBACK TRAN 
     ELSE 
      COMMIT TRAN 
     END 
ELSE 
    -- New user 
    BEGIN 
    BEGIN TRAN 
     INSERT aTable (
     FirstName, 
     SurName, 
     GetDate() 
    ) 
     VALUES (
      @FirstName, 
      @SurName, 
      @LastUpdate 
    ) 

     SELECT @ID = @@IDENTITY 

     IF (@@Error != 0) 
     ROLLBACK TRAN 
     ELSE 
     COMMIT TRAN 
     END 

參數@ID在存儲過程被列爲:

@ID (int, Input/Output, No default) 

和proc有'返回整數'。這用於在SQL Server 2005升級之前使用VBA解決方案正常工作。

在此先感謝。

+3

見http://stackoverflow.com/questions/8633821/ scope-identity-always-returning-0/8633835#8633835相似的問題/答案。 –

+1

你在存儲過程中有一個邏輯缺陷。 (在else'new user'分支中):在檢查@@ ERROR之前執行的任何語句都將重置@@ ERROR –

+3

我還建議使用** SCOPE_IDENTITY()**而不是其他任何操作來獲取新插入的標識值。 [請參閱此博客文章,瞭解有關WHY的解釋](http://blog.sqlauthority.com/2007/03/25/sql-server-identity-vs-scope_identity-vs-ident_current-retrieve-last-inserted-identity -of-record /) –

回答

6
connection = new SqlConnection(ConfigurationManager.AppSettings["ConnectionInfo"]); 
sql = "aStoredProc"; 
command = new SqlCommand(sql, connection); 
command.CommandType = CommandType.StoredProcedure; 
command.Parameter.Add(new SqlParameter("@FirstName", SqlDbType.VarChar)).Value = sFirstname; 
command.Parameter.Add(new SqlParameter("@SurName", SqlDbType.VarChar)).Value = sSurname; 
command.Parameter.Add(new SqlParameter("@SurName", SqlDbType.VarChar)).Value = sSurname; 
SqlParameter ParamId = cmd.Parameters.Add("@Id", SqlDbType.Int); 
command.Direction = ParameterDirection.InputOutput; 
command.Parameter.Add(ParamId); 
connection.Open(); 
command.ExecuteNonQuery(); 
int ID = ParamId.Value; 
connection.Close(); 
  1. 你必須在參數集合添加輸出參數中。
  2. 閱讀上面的值。
+0

感謝隊友明天會試試這個。 –

+0

我認爲'vendor'應該是'ParamId'。但是這個錯誤在'int ID = ParamId.Value'行 - 不能將對象轉換爲int。 –

+1

int ID =(int)ParamId.Value; – dotnetstep

2

您的SQL錯誤,它應該是這樣的:

INSERT aTable (FirstName,SurName,LastUpdate) 
    VALUES (@FirstName, @SurName, GetDate()) 

不喜歡這樣的:

INSERT aTable (
    FirstName, 
    SurName, 
    GetDate() 
) 
    VALUES (
     @FirstName, 
     @SurName, 
     @LastUpdate 
) 
+0

是的,這不是我的確切的SQL,只是它的一個粗略的想法。 –

相關問題