2011-06-22 14 views
3

ストアドプロシージャのパラメータに値を渡していて、その方向を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 

、私は@FileNameパラメータの値になるようにImageFileNameを期待しています、ストアドプロシージャから返されました。しかし、それは最初はImageFileNameNoExtと同じ値で、プロシージャに渡されました。

私が間違っていることを教えてもらえますか?ありがとう。

EDIT

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][email protected] 
     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 [email protected]) > 0 
    BEGIN 
     SET @Layout = (SELECT MAX(Layout) FROM [ContentPages_Images] WHERE [email protected]) + 1 
    END 

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

END 
+1

あなたが – VMAtm

+0

コード内で欠落しているパラメータの割り当てのカップルがありますことができれば、あなたのSQLプロシージャのコードを提供します。 '@PidID'と' @Ext'です。 –

+0

@Mikael Erikssonええ、大丈夫です、私はもともとファイル名の部分を示していましたが、これは動作していない部分だったからです。他の2つのパラメータも渡されます。 – Leah

答えて

3

あなたはパラメータのサイズを指定していないので、これが最も可能性が高いです。以下のようなパラメータのサイズを含むようにコードを変更してみてください:

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

私はこれを試してみました。それは素晴らしいです、あなたの助けをありがとう。なぜそれが分かっていますか? – Leah

+0

@Leah 'nvarchar'は可変長データ型なので、設定されている長さは入力されている文字列の長さと同じです。したがって、文字列が 'StackOverflow'の場合、データ長は' 13'に設定されます。 'StackOverflow'が' StackOverflow-2'に変更された場合、これは15文字になり、パラメータのデータ型に合わせて13に切り捨てられます。お役に立てれば :) – Curt

関連する問題