为什么我不能处理存储过程的返回值是c#?
我在C#中是新的,并希望写与SQL Server存储过程的简单应用工作,在SQL Server写这个存储过程:
为什么我不能处理存储过程的返回值是c#?
USE [mammutRecruitment]
ALTER PROCEDURE [dbo].[FirstStep]
@Name nvarchar(max),@Family nvarchar(max),@FatherName nvarchar(max),@BirthCertificate bigint,@PlaceOfBirth nvarchar(max),@BirthDate datetime,
@NationalCode bigint,@Religion nvarchar(max),@faith nvarchar(max),@Nationality nvarchar(max),@BloodGroup nvarchar(max)
AS
BEGIN
DECLARE @MYID bigint
insert into [dbo].[UserMainSpecifications] values(@Name,@Family,@FatherName,@BirthCertificate,@PlaceOfBirth,1,@BirthDate,@NationalCode,
@Religion,@faith,@Nationality,@BloodGroup,12,'123','123',1,2015-1-1,'12','123','1234',1)
select @MYID=[UserID] from [mammutRecruitment].[dbo].[UserMainSpecifications]
where [NationalCode][email protected]
select @MYID as myID
END
和C#编写代码的调用:
using (SqlConnection con = new SqlConnection("Data Source=.;Initial Catalog=mammutRecruitment;Integrated Security=True"))
{
using (SqlCommand cmd = new SqlCommand("FirstStep", con))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@Name", SqlDbType.NVarChar).Value = m.Name;
cmd.Parameters.Add("@Family", SqlDbType.NVarChar).Value = m.Family;
cmd.Parameters.Add("@FatherName", SqlDbType.NVarChar).Value = m.FatherName;
cmd.Parameters.Add("@BirthCertificate", SqlDbType.BigInt).Value =Convert.ToInt64(m.BirthCertificate);
cmd.Parameters.Add("@PlaceOfBirth", SqlDbType.NVarChar).Value = m.PlaceOfBirth;
cmd.Parameters.Add("@BirthDate", SqlDbType.DateTime).Value =Convert.ToDateTime(dt.ToString());
cmd.Parameters.Add("@NationalCode", SqlDbType.BigInt).Value =Convert.ToInt64(m.NationalCode);
cmd.Parameters.Add("@Religion", SqlDbType.NVarChar).Value = m.Religion;
cmd.Parameters.Add("@faith", SqlDbType.NVarChar).Value = m.faith;
cmd.Parameters.Add("@Nationality", SqlDbType.NVarChar).Value = m.Nationality;
cmd.Parameters.Add("@BloodGroup", SqlDbType.NVarChar).Value = m.BloodGroup;
SqlParameter retval = cmd.Parameters.Add("@myID", SqlDbType.BigInt);
retval.Direction = ParameterDirection.ReturnValue;
con.Open();
cmd.ExecuteNonQuery();
var retunvalue = cmd.Parameters["@myID"].Value;
但在此行中我得到零值始终:
var retunvalue = cmd.Parameters["@myID"].Value;
发生了什么?我该如何解决这个问题?谢谢。
这条线:
cmd.ExecuteNonQuery();
正在执行查询并没有返回值。
cmd.ExecuteReader();
或者,如果你想在第一行的第一个字段的值,你可以这样做::
你可以通过观察用这个代替开始
var returnValue = cmd.ExecuteScalar();
哪样为您提供一个对象,然后您可以将其转换或转换为您的方法的适当类型。
感谢我的朋友,我6分钟后接受 –
您需要在您的存储过程定义,包括@myID作为输出参数:
ALTER PROCEDURE [dbo].[FirstStep]
@Name nvarchar(max),@Family nvarchar(max),@FatherName nvarchar(max),@BirthCertificate bigint,@PlaceOfBirth nvarchar(max),@BirthDate datetime,
@NationalCode bigint,@Religion nvarchar(max),@faith nvarchar(max),@Nationality nvarchar(max),@BloodGroup nvarchar(max)
, @myID bigint output
AS
然后取出线
DECLARE @MYID bigint
您还需要添加到CMD参数的C#代码:
cmd.Parameters.Add(retval);
SqlCommand.ExecuteNonQuery Method()
对连接执行Transact-SQL语句并返回 受影响的行数。
SqlCommand.ExecuteScalar Method()
执行查询,并在 返回第一行的第一列由查询返回的结果集。其他列或行是 忽略。
我相信你想要的第二种方法
其实,你需要更改声明:
retval.Direction = ParameterDirection.ReturnValue;
到
retval.Direction = ParameterDirection.Output
因为的ExecuteNonQuery回报:
执行对连接的Transact-SQL语句并返回th e受影响的行数。 虽然ExecuteNonQuery不返回任何行,但映射到参数的任何输出参数或返回值都会填充数据。
末包括你的参数过程定义: @myID BIGINT OUTPUT
USE [mammutRecruitment]
ALTER PROCEDURE [dbo].[Firststep] @Name NVARCHAR(max),
@Family NVARCHAR(max),
@FatherName NVARCHAR(max),
@BirthCertificate BIGINT,
@PlaceOfBirth NVARCHAR(max),
@BirthDate DATETIME,
@NationalCode BIGINT,
@Religion NVARCHAR(max),
@faith NVARCHAR(max),
@Nationality NVARCHAR(max),
@BloodGroup NVARCHAR(max),
@myID BIGINT output
AS
BEGIN
INSERT INTO [dbo].[usermainspecifications]
VALUES (@Name,
@Family,
@FatherName,
@BirthCertificate,
@PlaceOfBirth,
1,
@BirthDate,
@NationalCode,
@Religion,
@faith,
@Nationality,
@BloodGroup,
12,
'123',
'123',
1,
2015 - 1 - 1,
'12',
'123',
'1234',
1)
SELECT @myID = [userid]
FROM [mammutRecruitment].[dbo].[usermainspecifications]
WHERE [nationalcode] = @NationalCode
END
你需要定义@MYID作为输出参数。
USE [mammutRecruitment]
ALTER PROCEDURE [dbo].[FirstStep]
@MYID bigint output,@Name nvarchar(max),@Family nvarchar(max),@FatherName nvarchar(max),@BirthCertificate bigint,@PlaceOfBirth nvarchar(max),@BirthDate datetime,
@NationalCode bigint,@Religion nvarchar(max),@faith nvarchar(max),@Nationality nvarchar(max),@BloodGroup nvarchar(max)
AS
BEGIN
insert into [dbo].[UserMainSpecifications] values(@Name,@Family,@FatherName,@BirthCertificate,@PlaceOfBirth,1,@BirthDate,@NationalCode,
@Religion,@faith,@Nationality,@BloodGroup,12,'123','123',1,2015-1-1,'12','123','1234',1)
select @MYID = SCOPE_IDENTITY()
END
,并添加你的命令
SqlParameter pOut = new SqlParameter("@MYID", SqlDbType.BigInt);
pOut.Direction = ParameterDirection.Output;
cmd.Parameters.Add(pOut);
可以读取值现在
cmd.ExecuteNonQuery();
long newId = (long)pOut.Value;
您还没有返回值,你只是选择它。请将您的proc更改为'RETURN @ MyID'或将代码更改为'var returnvalue = cmd.ExecuteScalar()'。 – Siyual
您在C#代码中添加参数,但在存储过程的输入参数之间没有该参数。 – Steve
或者使用ExecuteScalar来获取查询返回的单个值,或者使该参数成为输出参数,并以此方式获取其值。 – ADyson