我正在使用带有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
答案 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,否则结果集为空。