Ado.net ExecuteScalar()返回null

时间:2010-12-09 16:14:57

标签: c# stored-procedures ado.net

我正在使用带有ExecuteScalar命令的ado.net在c#中执行存储过程(通过vs2008)。存储过程返回输入的新记录的pkey,但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 

2 个答案:

答案 0 :(得分:9)

ExecuteScalar方法返回结果第一条记录的第一个字段,但由于查询没有产生结果,它将返回null。

您可以选择值而不是从存储过程返回值,也可以添加方向设置为ParameterDirection.ReturnValue的参数以捕获存储过程返回的值。

答案 1 :(得分:3)

尝试更改存储过程以使用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,否则结果集为空。