【问题标题】:Ado.Net Error Procedure or function 'usp_ProjectsCreateNew' expects parameter '@ProjectId', which was not suppliedAdo.Net 错误过程或函数“usp_ProjectsCreateNew”需要参数“@ProjectId”,但未提供
【发布时间】:2012-07-28 08:45:42
【问题描述】:

我有这样的参数;

    comm.CommandText = "usp_ProjectsCreateNew";

    SqlParameter param = comm.CreateParameter();
    param.ParameterName = "@ProjectId";
    param.Direction = ParameterDirection.Output;
    param.DbType = DbType.Int32;
    comm.Parameters.Add(param);

    param = comm.CreateParameter();
    param.ParameterName = "@ProjectHeading";
    param.Value = heading;
    comm.Parameters.Add(param);

    param = comm.CreateParameter();
    param.ParameterName = "@ProjectLongDescription";
    param.Value = longSummary;
    comm.Parameters.Add(param);

    param = comm.CreateParameter();
    param.ParameterName = "@ProjectUrl";
    param.Value = url;
    comm.Parameters.Add(param);

    param = comm.CreateParameter();
    param.ParameterName = "@PromoFront";
    param.Value = promoFront;
    comm.Parameters.Add(param);

    param = comm.CreateParameter();
    param.ParameterName = "@ProjectThumbnail";
    param.Value = thumbnailFileName;
    comm.Parameters.Add(param);

    param = comm.CreateParameter();
    param.ParameterName = "@ProjectImage2";
    param.Value = imageFileName1;
    comm.Parameters.Add(param);

    param = comm.CreateParameter();
    param.ParameterName = "@ProjectImage3";
    param.Value = imageFileName2;
    comm.Parameters.Add(param);

    param = comm.CreateParameter();
    param.ParameterName = "@ProjectImage4";
    param.Value = imageFileName3;
    comm.Parameters.Add(param);

    param = comm.CreateParameter();
    param.ParameterName = "@ProjectImage5";
    param.Value = imageFileName4;
    comm.Parameters.Add(param);

    comm.Transaction = tran;
    int result = comm.ExecuteNonQuery();

我的存储过程代码是这样的;

CREATE PROC [dbo].[usp_ProjectsCreateNew]
(
    @ProjectId INT output,
    @ProjectHeading varchar(100),
    @ProjectLongDescription varchar(max),
    @ProjectUrl varchar(100),
    @PromoFront bit,
    @ProjectThumbnail varchar(50),
    @ProjectImage2 varchar(50),
    @ProjectImage3 varchar(50),
    @ProjectImage4 varchar(50),
    @ProjectImage5 varchar(50)
)
AS
BEGIN TRY
    BEGIN TRAN
        INSERT INTO [Projects]([ProjectHeading], [ProjectLongSummary], [ProjectUrl],
            [PromoFront], [ProjectThumbnail], [ProjectImage2], [ProjectImage3], [ProjectImage4], [ProjectImage5])
        VALUES(@ProjectHeading, @ProjectLongDescription, @ProjectUrl, 
            @PromoFront, @ProjectThumbnail, @ProjectImage2, @ProjectImage3, @ProjectImage4, @ProjectImage5);

        SELECT @ProjectId = @@IDENTITY;
    COMMIT TRAN
END Try
BEGIN CATCH
    PRINT Error_Message();
    ROLLBACK TRAN
END CATCH

但我收到此错误;

消息:过程或函数“usp_ProjectsCreateNew”需要参数“@ProjectId”,但未提供。

来源:.Net SqlClient 数据提供者

方法:Void OnError(System.Data.SqlClient.SqlException, Boolean, System.Action`1[System.Action])

【问题讨论】:

  • 很奇怪,你有没有试过给参数一个值,即使它是一个输出参数?

标签: c# asp.net stored-procedures ado.net


【解决方案1】:

首先,你没有告诉SqlCommand这是一个存储过程!

添加这一行:

comm.CommandType = CommandType.StoredProcedure;

在设置comm.CommandText 属性之后。

然后:您的某些参数不清楚 - 我建议您使用类似的方法来创建参数并将其添加到 SqlCommand 对象:

cmd.Parameters.Add("@PromoFront", SqlDbType.Bit).Value = 1;

我总是会为每个参数明确定义一个SqlDbType,以明确它是什么。不这样做可能会导致不需要的结果。

【讨论】:

  • 他不应该按照文档的建议使用 AddWithValue,并将位值设置为 true,而不是 1?
  • @podiluska:我不喜欢.AddWithValue,因为它让 ADO.NET 来猜测您传入的数据类型。大多数情况下都可以,但是在某些情况下,它会失败。为什么不直接明确地这样做,从而始终完全清楚?我更喜欢那种明确的做事方式。另外:SQL Server BIT 的值为 0 (false) 和 1 (true) - 所以我相信你也必须将参数设置为 0 或 1
  • 多么愚蠢的错误。你的回答确实有帮助。问题是 comm.CommandType = CommandType.StoredProcedure。非常感谢你。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-01
  • 1970-01-01
  • 2015-01-25
  • 1970-01-01
  • 2013-09-09
  • 1970-01-01
  • 2020-12-14
相关资源
最近更新 更多