4

ストアド プロシージャを使用して SQL Server に値を入力しています。プロシージャーは、追加された行に ID を追加します。この ID をコードに戻す必要があります。

現在、Visual Studio の OUTPUT ウィンドウに出力 ID が表示されますが、コードでそれをキャプチャできないようです。以下は、proc の要約版です。

SQL :

CREATE PROCEDURE dbo.DoSomething
(
    @var1 INT = NULL,
    @var2 INT = NULL,
    @var3 DATE = NULL
)
AS

BEGIN

    INSERT INTO atable
    (
        vara,
        varb,
        varc
    )
    VALUES
    (
        @var1,
        @var2,
        @var3
    )

    RETURN SCOPE_IDENTITY()

END

C#:

int result = 0;

/// create command
SqlCommand cmd = new SqlCommand("DoSomething", this.OpenSqlConnection());
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@var1", thing.value1);
cmd.Parameters.AddWithValue("@var2", thing.value2);
cmd.Parameters.AddWithValue("@var3", thing.value3);


/// send data to db
result = (int)cmd.ExecuteScalar();

そのため、エラーが発生しています:オブジェクト参照がオブジェクトのインスタンスに設定されていません。(int)cmd.ExecuteScalar() に到達したとき。

何か案は?

4

3 に答える 3

12
...
SELECT SCOPE_IDENTITY()

RETURN 値は、実際には特別な OUTPUT パラメータとして返されます。SELECT は、ExecuteScalar の結果セットを提供します。

別の SELECT の代わりにOUTPUT句を使用することもできます。

...
AS
BEGIN
    INSERT INTO atable
    (
        vara,
        varb,
        varc
    )
    OUTPUT INSERTED.IDCol
    VALUES
    (
        @var1,
        @var2,
        @var3
    )
END
GO

これは、複数の行でも機能します。

于 2011-03-06T17:49:58.510 に答える
5

次の方向を持つ別のパラメータを追加する必要がありますReturnValue

var param = cmd.Parameters.Create("@ReturnValue");
param.Direction = ParameterDirection.ReturnValue;
cmd.Parameters.Add(param);

実行後のこのパラメーターの値が戻り値になります。

var newId = cmd.Parameters["@ReturnValue"].Value;

Or

var newId = param.Value;
于 2011-03-06T17:52:18.823 に答える
0
SqlParameter retval = cmd.Parameters.Add("@returnValue", SqlDbType.Int); 
            retval.Direction = ParameterDirection.ReturnValue;
于 2011-03-06T17:54:17.213 に答える