1

出力ストアド プロシージャ パラメータの解析が明らかに間違っているため、このエラーが発生しました。

制御が現在のメソッドを離れる前に、out パラメータ 'whichID' を割り当てる必要があります

コード:

public static bool CreateFilmTest(string param1, string param2, out int whichID)
{
            DbCommand com = GenericDataAccess.CreateCommand();
            com.CommandText = "CatalogCreateFilmTest";

            DbParameter param = com.CreateParameter();
            param.ParameterName = "@param1";
            param.Value = param1;
            param.DbType = DbType.String;
            param.Size = 200;
            com.Parameters.Add(param);
            ..........            
            param = com.CreateParameter();
            param.ParameterName = "@Fid";
            param.Direction = ParameterDirection.Output;
            param.DbType = DbType.Int32;
            com.Parameters.Add(param);

            int result = -1;

            try
            {
                result = GenericDataAccess.ExecuteNonQuery(com);

                whichID = Int32.Parse(com.Parameters["@Fid"].Value.ToString());

            }
            catch
            {
                // ....
            }


           return (result >= 1);
}

return 行の直前に:whichID = Int32.Parse(com.Parameters["@Fid"].Value.ToString()); 行を配置すると、メソッドは正常に実行され、正しい結果が得られます。

ただし、try ブラケット内に配置すると、冒頭で述べたエラーが発生します。

なんでそうなの?

私の最初の選択は、 try ブラケット内に配置することでした。これは、何らかの理由で IF がExecuteNonQuery失敗した場合、その出力パラメーター ( ) を処理する意味がないためwhichIDです。したがって、try ブロック内で 2 つの要素 (プロシージャーの実行とプロシージャーからの出力パラメーターの処理) を結合するのが最善であると考えましたcatch

ご意見をお待ちしております。ありがとう。アンナ

4

3 に答える 3

1

その理由は、トライ内に配置した場合、合理的に確実な割り当てが発生しないためです。メソッドの早い段階でデフォルト値を割り当てることで、これを回避できます (たとえば、最初の行でゼロに設定します)。

于 2012-06-12T11:58:47.903 に答える
1

メモリが機能する場合、これは がtryinner を含むようにコンパイルされているためですtry。つまり、プログラム フローはtry先に進む前に に正しくステップインしない可能性があります (通常、tryそれ自体がプログラム フローを中断しないと想定している場合でも) 、言う、ifする)。

outこれにより、メソッドを終了する前に、割り当てられているパラメーターに対するコンパイラ チェックがトリガーされます。

メソッドの一番上にある値をデフォルトに設定するだけです。


メモリは役立ちます...言語仕様はすべてを知っています。

12.3.3.15 Try-catch-finally ステートメント(具体的には の代入分析try-catch-finally)。

次の形式の try-catch-finally ステートメントの明確な代入分析:

try [try-block]
catch ( … ) [catch-block-1]
…
catch ( … ) [catch-block-n]
finally [finally-block]

ステートメントが、try-catch ステートメントを囲む try-finally ステートメントであるかのように実行されます。

try {
try [try-block]
catch ( … ) [catch-block-1]
…
catch ( … ) [catch-block-n]
}
finally [finally-block]

例:

class A
{
    static void F() {
        int i, j;
        try {
            goto LABEL;
            // neither i nor j definitely assigned
            i = 1;
            // i definitely assigned
        }
        catch {
            // neither i nor j definitely assigned
            i = 3;
            // i definitely assigned
        }
        finally {
            // neither i nor j definitely assigned
            j = 5;
            // j definitely assigned
        }
        // i and j definitely assigned
        LABEL:;
        // j definitely assigned
    }
}
于 2012-06-12T11:59:12.380 に答える