71

Sql Server ストアド プロシージャから C# 変数に出力パラメータを返す際に問題が発生しています。ここだけでなく他のサイトでも、これに関する他の投稿を読みましたが、機能しません。これが私が現在持っているものです。現在、返された値を印刷しようとしています。次のコードは null 値を返します。私が返そうとしているのは主キーです。@@IDENTITYand SCOPE_INDENTITY()(ie )を使ってみSET @NewId = SCOPE_IDENTITY()ました。

ストアド プロシージャ:

CREATE PROCEDURE usp_InsertContract
    @ContractNumber varchar(7),

    @NewId int OUTPUT
AS
BEGIN

    INSERT into [dbo].[Contracts] (ContractNumber)
        VALUES (@ContractNumber)

    Select @NewId = Id From [dbo].[Contracts] where ContractNumber = @ContractNumber
END

データベースを開く:

pvConnectionString = "Server = Desktop-PC\\SQLEXPRESS; Database = PVDatabase; User ID = sa;
    PASSWORD = *******; Trusted_Connection = True;";

try
{
    pvConnection = new SqlConnection(pvConnectionString);
    pvConnection.Open();
}
catch (Exception e)
{
    databaseError = true;
}

コマンドの実行:

pvCommand = new SqlCommand("usp_InsertContract", pvConnection);

pvCommand.Transaction = pvTransaction;
pvCommand.CommandType = CommandType.StoredProcedure;    

pvCommand.Parameters.Clear();
pvCommand.Parameters.Add(new SqlParameter("@ContractNumber", contractNumber));

SqlParameter pvNewId = new SqlParameter();
pvNewId.ParameterName = "@NewId";
pvNewId.DbType = DbType.Int32;
pvNewId.Direction = ParameterDirection.Output;
pvCommand.Parameters.Add(pvNewId);

try
{
    sqlRows = pvCommand.ExecuteNonQuery();

    if (sqlRows > 0)
        Debug.Print("New Id Inserted =  ", 
            pvCommand.Parameters["@NewId"].Value.ToString()); 
    }
    catch (Exception e)
    {
        Debug.Print("Insert Exception Type: {0}", e.GetType());
        Debug.Print("  Message: {0}", e.Message);
    }
}
4

5 に答える 5

142

ストアド プロシージャを ( を使用するために) わずかに変更SCOPE_IDENTITYしたところ、次のようになりました。

CREATE PROCEDURE usp_InsertContract
    @ContractNumber varchar(7),
    @NewId int OUTPUT
AS
BEGIN
    INSERT INTO [dbo].[Contracts] (ContractNumber)
    VALUES (@ContractNumber)

    SELECT @NewId = SCOPE_IDENTITY()
END

私はこれを試してみましたが、うまく動作します(その変更されたストアドプロシージャで):

// define connection and command, in using blocks to ensure disposal
using(SqlConnection conn = new SqlConnection(pvConnectionString ))
using(SqlCommand cmd = new SqlCommand("dbo.usp_InsertContract", conn))
{
    cmd.CommandType = CommandType.StoredProcedure;
        
    // set up the parameters
    cmd.Parameters.Add("@ContractNumber", SqlDbType.VarChar, 7);
    cmd.Parameters.Add("@NewId", SqlDbType.Int).Direction = ParameterDirection.Output;

    // set parameter values
    cmd.Parameters["@ContractNumber"].Value = contractNumber;

    // open connection and execute stored procedure
    conn.Open();
    cmd.ExecuteNonQuery();

    // read output value from @NewId
    int contractID = Convert.ToInt32(cmd.Parameters["@NewId"].Value);
    conn.Close();
}

これはあなたの環境でも機能しますか?元のコードが機能しない理由はわかりませんが、VS2010 と SQL Server 2008 R2 でこれを行うと、問題なく動作します....

値が返されない場合は、テーブルContractsにプロパティを含む列が実際にない可能性がありますIDENTITY

于 2012-06-06T05:25:23.640 に答える
3

ストアドプロシージャを変更する前に、現在のプロシージャの出力を確認してください。SQL Server Managementで、次のコマンドを実行します。

DECLARE @NewId int
EXEC    @return_value = [dbo].[usp_InsertContract]
            N'Gary',
            @NewId OUTPUT
SELECT  @NewId

それが何を返すかを見てください。これにより、outパラメータが入力されない理由のヒントが得られる場合があります。

于 2012-06-06T05:52:17.560 に答える
1

ストアド プロシージャ........

CREATE PROCEDURE usp_InsertContract
    @ContractNumber varchar(7)
AS
BEGIN

    INSERT into [dbo].[Contracts] (ContractNumber)
        VALUES (@ContractNumber)

    SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY]
END

C#

pvCommand.CommandType = CommandType.StoredProcedure;

pvCommand.Parameters.Clear();
pvCommand.Parameters.Add(new SqlParameter("@ContractNumber", contractNumber));
object uniqueId;
int id;
    try
    {
    uniqueId = pvCommand.ExecuteScalar();
     id = Convert.ToInt32(uniqueId);
    }
    catch (Exception e)
    {
        Debug.Print("  Message: {0}", e.Message);
    }
}

編集:「私はまだ DBNull 値を返します....オブジェクトは DBNull から他の型にキャストできません。これは明日また取り上げます。他の仕事に取り掛かります」

SQL テーブルの Id 列は ID 列ではないと思います。

ここに画像の説明を入力

于 2012-06-05T22:21:12.353 に答える
0

C# コードでは、コマンドにトランザクションを使用しています。トランザクションをコミットするだけで、その後パラメーター値にアクセスすると、値が取得されます。私のために働いた。:)

于 2016-01-22T07:36:26.643 に答える