2010-12-09 108 views
4

我正在執行存儲過程在c#(通過vs2008)使用ado.net與ExecuteScalar命令。存儲的proc返回輸入的新記錄的pkey,但ExecuteScalar返回null。我查看數據庫並確實添加了一條記錄。我可以使用輸出參數來獲取值,但我不知道爲什麼這不起作用。Ado.net ExecuteScalar()返回null

當我在ssms中執行sp時,會返回pkey。

我在做什麼錯?

下面是C#代碼:

public int SaveNewPerson(EPerson ePerson) 
    { 
     int newPersonPkey; 
     SqlConnection cn = new SqlConnection(cnn.PersonData); 
     using (cn) 
     { 
      try 
      { 
       SqlCommand cmd = new SqlCommand(); 
       cmd.Connection = cn; 
       cmd.CommandType = CommandType.StoredProcedure; 
       cmd.CommandText = "People.dbo.AddNewPerson"; 
       cmd.Parameters.Add("@LastName", SqlDbType.VarChar, 150).Value = ePerson.LastName; 
       cmd.Parameters.Add("@FirstName", SqlDbType.VarChar, 150).Value = ePerson.FirstName; 
       cn.Open(); 
       object result = cmd.ExecuteScalar(); 
       newPersonPkey = int.Parse(result.ToString()); 
       cn.Close(); 
      } 
      catch (Exception e) 
      { 
       // call error method 
       throw new Exception(e.Message + " save new Person error "); 
      } 
     } 
     return newPersonPkey; 
    } 

這是SP:

PROCEDURE [dbo].[AddNewPerson] 
      @FirstName varchar(50) 
      ,@LastName varchar(50) 
AS 
BEGIN 
    SET NOCOUNT ON; 

INSERT INTO [People].[dbo].[Persons] 
      (
      [FirstName] 
      ,[LastName] 
      ) 
    VALUES 
      (
      @FirstName 
      ,@LastName 
      ) 
declare @persons_PKey int 
set @persons_PKey = @@IDENTITY 
return @persons_PKey 

end 

回答

8

ExecuteScalar方法返回結果第一條記錄的第一個字段,但由於查詢不會產生結果,它將返回null。

您可以選擇該值,而不是從存儲過程返回值,或者添加方向設置爲ParameterDirection.ReturnValue的參數以捕獲存儲過程返回的內容。

+0

當然!我以爲這已經奏效了。更改了return @persons_PKey以選擇@persons_PKey並且它工作正常。 – TheMoot 2010-12-09 16:29:14

2

嘗試改變存儲過程使用Select Statement返回的身份,而不是使用像這樣的回報:

SELECT CAST(scope_identity() AS int) 

從而改變你的程序進行:

PROCEDURE [dbo].[AddNewPerson] 
      @FirstName varchar(50) 
      ,@LastName varchar(50) 
AS 
BEGIN 
    SET NOCOUNT ON; 

INSERT INTO [People].[dbo].[Persons] 
      (
      [FirstName] 
      ,[LastName] 
      ) 
    VALUES 
      (
      @FirstName 
      ,@LastName 
      ) 
SELECT CAST(scope_identity() AS int) 
end 

ExecuteScalar() on MSDN的文檔,它說,它會在結果集中;否則爲null,如果結果集爲空返回第一行的第一列。