我在SQL Server数据库中调用存储过程的服务中有一个方法,我收到一个错误:
过程或函数'GenerateInviteKey'需要参数'@inviterId',这是未提供的
当我在SQL Server Mgmt Studio中执行它时,我的存储过程正常工作,所以我很确定它是我的C#方法导致错误。我的代码如下所示:
public class Invite
{
public Int64 InviterId { get; set; }
public string InviterName { get; set; }
public string InviteeEmail { get; set; }
}
private string CreateInviteKey(Invite invite)
{
var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["conn"].ConnectionString);
try
{
conn.Open();
var command = new SqlCommand("GenerateInviteKey", conn);
command.Parameters.Add(new SqlParameter("@inviterId", SqlDbType.BigInt, 0, "inviter_id"));
command.Parameters.Add(new SqlParameter("@inviteeEmail", SqlDbType.VarChar, 100, "invitee_email"));
command.Parameters.Add(new SqlParameter("@inviteKey", SqlDbType.VarChar, 30, "invite_key"));
command.Parameters[0].Value = invite.InviterId;
command.Parameters[1].Value = invite.InviteeEmail;
command.Parameters[2].Direction = ParameterDirection.Output;
command.ExecuteNonQuery();
var inviteKey = (string)command.Parameters[2].Value;
return inviteKey;
}
catch (Exception ex)
{
var error = ex.Message;
return null;
}
finally
{
conn.Close();
conn.Dispose();
}
}
存储过程如下所示:
ALTER PROCEDURE [dbo].[GenerateInviteKey]
@inviterId int,
@inviteeEmail varchar(100),
@inviteKey varchar(30) OUT
AS
BEGIN
SET NOCOUNT ON;
exec dbo.GenerateRandomString 1, 1, 1, null, 30, @inviteKey OUT
INSERT INTO [dbo].[invite_key] ([invite_key], [inviter_id], [invitee_email], [eff_datetime])
SELECT
@inviteKey, @inviterId, @inviteeEmail, GETDATE()
END
我一直盯着这个东西一小时,现在试图找到我搞砸的东西,但我需要另外一双眼睛。
更新1:
我已经将参数更改为以下模式:
var command = new SqlCommand("GenerateInviteKey", conn);
command.Parameters.Add(new SqlParameter("@inviterId", invite.InviterId));
command.Parameters.Add(new SqlParameter("@inviteeEmail", invite.InviteeEmail));
command.Parameters.Add(new SqlParameter("@inviteKey", ParameterDirection.Output));
并将有问题的过程参数更改为具有相同结果的@inviterId bigint,
。
答案 0 :(得分:4)
您忘记将CommandType设置为CommandType.StoredProcedure
所以它最终会传递参数,然后按名称执行过程,并且永远不会将参数传递给该调用。
答案 1 :(得分:0)
在你的程序def中,它将@inviterid定义为int
,你的参数def试图将其强制转换为SqlDbType.BigInt
。不完全确定,但这可能是问题。
为什么不让代码自动确定类型:
var command = new SqlCommand("GenerateInviteKey", conn);
command.Parameters.Add(new SqlParameter("@inviterId", invite.InviterId));
command.Parameters.Add(new SqlParameter("@inviteeEmail", invite.InviteeEmail));
command.Parameters.Add(new SqlParameter("@inviteKey", ParameterDirection.Output));