【问题标题】:Asp.net Sql Parameter MissingAsp.net Sql 参数丢失
【发布时间】:2013-08-30 09:44:20
【问题描述】:

我正在尝试调用带有多个参数的存储过程,但收到错误

“过程或函数‘sp_User_Create’需要参数 '@adminUser',未提供。"

当我发送一个 0 值时

但是当我使用大于 0 的值调用存储过程时,它可以正常工作吗?

这是我的代码....

SqlConnection con;
SqlCommand cmd = new SqlCommand();
con = new SqlConnection("server=XXX.XXX.XXX.XXX; database=xxxxxxx; uid=xxxxxxx; pwd=xxxxx");
cmd = new SqlCommand("sp_User_Create", con);
cmd.CommandType = CommandType.StoredProcedure;

cmd.Parameters.Add(new SqlParameter("fullName", txtFirstName.Text + " " + txtLastName.Text));
cmd.Parameters.Add(new SqlParameter("emailAddress", txtEmailAddress.Text));
cmd.Parameters.Add(new SqlParameter("password", txtPassword.Text));
cmd.Parameters.Add(new SqlParameter("phoneNumber", txtPhoneNumber.Text));
cmd.Parameters.Add(new SqlParameter("jobTitle", txtJobTitle.Text));
cmd.Parameters.Add(new SqlParameter("createDate", DateTime.Now));
cmd.Parameters.Add(new SqlParameter("companyId", 116));
cmd.Parameters.Add(new SqlParameter("adminUser", 0));
cmd.Parameters.Add(new SqlParameter("userExpireDate", DateTime.Now.AddDays(7)));
cmd.Parameters.Add(new SqlParameter("userAccessLeaderboardClips", 99));
cmd.Parameters.Add(new SqlParameter("userAccessLeaderboardUsers", 99));
cmd.Parameters.Add(new SqlParameter("userAccessLeaderboardVideos", 99));
cmd.Parameters.Add(new SqlParameter("userAccessShared", 99));
cmd.Parameters.Add(new SqlParameter("userAccessEmbed", 99));
cmd.Parameters.Add(new SqlParameter("userAccessTinyUrl", 1));
cmd.Parameters.Add(new SqlParameter("userAccessAllowCreatedVideos", 1));
cmd.Parameters.Add(new SqlParameter("userAccessDownload", 99));
cmd.Parameters.Add(new SqlParameter("companyName", "My Company Name"));
cmd.Parameters.Add(new SqlParameter("logoName", "the logo name"));
cmd.Parameters.Add(new SqlParameter("postcode", "XXXX XXX"));
cmd.Parameters.Add(new SqlParameter("optIn", true));
cmd.Parameters.Add(new SqlParameter("accountType", ""));
cmd.Parameters.Add(new SqlParameter("transactionDesc", ""));
cmd.Parameters.Add(new SqlParameter("transactionDate", ""));
cmd.Parameters.Add(new SqlParameter("transactionAmount", ""));

con.Open();
cmd.ExecuteNonQuery();
con.Close();

我已经检查了存储过程并且它正在等待:

@adminUser as int

这是存储过程:

USE [vCreateDev]
GO
/****** Object:  StoredProcedure [dbo].[sp_User_Create]    Script Date: 29/08/2013 10:47:03 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:      Trevor Daniel
-- Create date: 28/8/2013
-- Description: Create a user
-- =============================================
ALTER PROCEDURE [dbo].[sp_User_Create]

-- UserLogin Fields
@fullName as varchar(100),
@emailAddress as varchar(100),
@password as varchar(20),
@phoneNumber as varchar(100),
@jobTitle as varchar,
@createDate as datetime,
@companyId as int,
@adminUser as int,
@userExpireDate as datetime,
@userAccessLeaderboardClips as int,
@userAccessLeaderboardUsers as int,
@userAccessLeaderboardVideos as int,
@userAccessShared as int,
@userAccessEmbed as int,
@userAccessTinyUrl as int,
@userAccessAllowCreatedVideos as int,
@userAccessDownload int,

-- ClientCompanyDetailsPerUser
@companyName varchar(200),
@logoName varchar(200),

-- UserCustomerDetails
@postcode varchar(15),
@optIn bit,
@accountType varchar(50),

-- UserTransactions
@transactionDesc varchar(150),
@transactionDate datetime,
@TransactionAmount smallmoney

-- Outputs
--@UserLoginID INT OUTPUT
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

-- Insert statements for procedure here
INSERT INTO UserLogin(
Username,
Password,
AuthID,
DateCreated,
LastLogin,
Fullname,
Title,
Mobile,
DDI,
Email,
AdminUser,
CompanyID,
UserExpireDate,
CurrentLogin,
LastActionDateTime,
ActiveLicense,
UserAccessLeaderboardClips,
UserAccessLeaderboardUsers,
UserAccessLeaderboardVideos, 
UserAccessShared, 
UserAccessEmbed,
UserAccessTinyUrl,
UserAccessAllowCreatedVideos,
UserAccessDownload)
VALUES(
@emailAddress,
@password,
null,
@createDate,
null,
@fullName,
@jobTitle,
@phoneNumber,
null,
@emailAddress,
@adminUser,
@companyId,
@userExpireDate,
null,
null,
null,
@userAccessLeaderboardClips,
@userAccessLeaderboardUsers,
@userAccessLeaderboardVideos,
@userAccessShared,
@userAccessEmbed,
@userAccessTinyUrl,
@userAccessAllowCreatedVideos,
@userAccessDownload)

DECLARE @NewUserID as int

SET @NewUserID = SCOPE_IDENTITY()

INSERT INTO ClientCompanyDetailsPerUser(CompanyName, CompanyLogoLocation, LargeCompanyLogoLocation, UserID)
VALUES (@companyName,@logoName,@logoName,@NewUserID)

INSERT INTO UserCustomerDetails(UserID, PostCode, OptIn, AccountType)
VALUES (@NewUserID,@postcode,@optIn,@accountType)

INSERT INTO UserTransactions(UserID, TransactionDesc, TransactionDate, TransactionAmount, AccountType, ResellerParameter, CampaignParameter)
VALUES (@NewUserID,@transactionDesc,@transactionDate,@TransactionAmount,@accountType,NULL,NULL)

END

我只是不明白为什么当发送一个零时它说参数丢失,但是当我发送大于零的东西时它工作得很好?

【问题讨论】:

  • 仅仅是 adminUser 参数还是任何其他 int 参数的行为方式相同??
  • 旁注:即使它在没有您的情况下也可以工作,也应该在命名参数的开头添加@-符号。根据documentation,即使缺少 ADO.NET 代码也建议添加它。由于它是一个未记录的功能,因此将来可能会被删除。所以不是new SqlParameter("fullName" ... 这个:new SqlParameter("@fullName" ...stackoverflow.com/a/10245581/284240
  • adminuser 是第一个引起问题的用户。如果我将 CompanyID 从 116 更改为 0,也会出现问题
  • @TrevorDaniel 尝试在SSMS 中运行您的查询,并将adminUserCompanyID 的值设置为0

标签: asp.net sql sql-server stored-procedures


【解决方案1】:

使用 SqlParameter 构造函数的此重载来指定整数参数值时要小心。由于此重载采用 Object 类型的值,因此必须在值为零时将整数值转换为 Object 类型。

如果您不执行此转换,编译器会假定您正在尝试调用 SqlParameter (string, SqlDbType) 构造函数重载。-MSDN

试试这个

cmd.Parameters.Add(new SqlParameter("@adminUser", SqlDbType.Int).Value=0);

【讨论】:

    【解决方案2】:

    您需要在传递给过程的所有参数的参数名称之前添加“@”

    cmd.Parameters.Add(new SqlParameter("@adminUser", 0));
    

    【讨论】:

    • 感谢您的建议。我只是尝试在所有参数名称前添加@符号,但我仍然得到过程或函数'sp_User_Create'需要参数'@adminUser',它没有提供错误:(
    【解决方案3】:

    宾果游戏! - 修复它。

    我已将代码更改为:

    cmd.Parameters.AddWithValue("@adminUser", 0);
    

    感谢您的关注和帮助!

    特雷夫

    【讨论】:

      【解决方案4】:

      您需要在每个参数名称之前添加 @ 符号,就像您添加的一样
      cmd.Parameters.AddWithValue("@adminUser", 0); for cmd.Parameters.Add(new SqlParameter("adminUser", 0));

      【讨论】:

        猜你喜欢
        • 2017-02-23
        • 2015-02-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-22
        • 2020-12-17
        相关资源
        最近更新 更多