Неверное значение выходного параметра - PullRequest
3 голосов
/ 22 июня 2011

Я передаю значение параметру в хранимой процедуре, а также объявляю его направление как 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

1 Ответ

3 голосов
/ 22 июня 2011

Это наиболее вероятно, потому что вы не указали размер для параметра.Попробуйте изменить код, включив в него размер параметра, как показано ниже:

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