【问题标题】:Output parameter value wrong输出参数值错误
【发布时间】:2011-09-20 05:20:15
【问题描述】:

我将值传递给存储过程中的参数,并将其方向声明为ParameterDirection.InputOutput。在存储过程中,参数也被声明为 OUTPUT 参数,并且从存储过程返回的值是正确的。我知道这一点是因为我已经测试了自己执行存储过程并使用PRINT 在整个过程中显示不同的值。此外,存储过程的最后一部分使用我期望返回的值将记录插入数据库,并且该值按预期显示。但是,当我在执行 SqlCommand 之后尝试从参数中检索值时,该值仍然是我传递给存储过程的先前值。我以前做过这个,我相信我做的没有什么不同。这是我的命令的一部分:

Dim cmd As New SqlCommand("StoredProcedure", Conn)
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.Add("@FileName", SqlDbType.NVarChar).Value = ImageFileNameNoExt
cmd.Parameters("@FileName").Direction = ParameterDirection.InputOutput
cmd.ExecuteNonQuery()
ImageFileName = cmd.Parameters("@FileName").Value

在这里,我期望 ImageFileName 是从存储过程返回的 @FileName 参数的值。但是,它仍然与最初传递给过程的ImageFileNameNoExt 相同。

谁能告诉我我做错了什么?谢谢。

编辑

ALTER PROCEDURE [dbo].[sp_ContentPages_Images_Update]
    @PageID int
    ,@FileName nvarchar(100) OUTPUT
    ,@Ext nvarchar(100)
AS
BEGIN
    SET NOCOUNT ON;

    --As the FileName is a unique key, ensure that the value being entered into the database will be unique.
    --If its not, then we can generate a new one
    SET @FileName = REPLACE(@FileName, ' ', '-')
    DECLARE @i int
            ,@FileNameCheck nvarchar(200)
    SET @i = 2
    SET @FileNameCheck = @FileName + @Ext
    WHILE (SELECT COUNT(*)
        FROM [ContentPages_Images]
        WHERE [FileName]=@FileNameCheck
        AND (@PageID IS NULL OR NOT @PageID=ID)
        ) > 0
    BEGIN
        SET @FileNameCheck = @FileName + '-' + CAST(@i as nvarchar(3)) + @Ext
        SET @i = @i + 1
    END

    SET @FileName = @FileNameCheck

    --Get new layout value
    DECLARE @Layout int
    SET @Layout = 1
    IF (SELECT COUNT(*) FROM [ContentPages_Images] WHERE PageID=@PageID) > 0
    BEGIN
        SET @Layout = (SELECT MAX(Layout) FROM [ContentPages_Images] WHERE PageID=@PageID) + 1
    END

    INSERT INTO [ContentPages_Images]
    (PageID, [FileName], [Layout])
    VALUES
    (@PageID, @FileName, @Layout)

END

【问题讨论】:

  • 提供你的sql过程代码,如果可以的话
  • 您的代码中缺少几个参数分配。 @PageID@Ext.
  • @Mikael Eriksson 是的,没关系,谢谢,我最初只是显示了文件名部分,因为那部分不起作用。其他 2 个参数也被传递。
  • 发布真实代码,而不是您认为合适的代码。您的编辑/更改可能会隐藏问题并使获得答案变得更加困难。这也可能导致人们浪费时间试图帮助你,却发现“这不是真正的代码。无论如何,谢谢。问题是......”。

标签: sql parameters sqlcommand output-parameter


【解决方案1】:

这很可能是因为您没有为参数指定大小。尝试更改代码以包含参数的大小,如下所示:

cmd.Parameters.Add("@FileName", SqlDbType.NVarChar, 100).Value = ImageFileNameNoExt

【讨论】:

  • 我刚刚试了一下,它成功了!太好了,非常感谢您的帮助。你知道这是为什么吗?
  • @Leah 因为nvarchar是变长数据类型,所以设置的长度与输入的字符串长度相同。因此,如果字符串为StackOverflow,则数据长度将设置为13。如果随后将 StackOverflow 更改为 StackOverflow-2,则现在为 15 个字符,并将被截断为 13 以适应参数数据类型。希望这会有所帮助:)
猜你喜欢
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-20
  • 2016-08-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多