1

SQL Server に既存のストアド プロシージャがあり、C# コードから呼び出して結果を取得する必要があります。SPはこんな感じ

CREATE PROCEDURE [dbo].[sp_MSnextID_DDB_NextID]
@tablesequence varchar(40)
AS
declare @next_id integer
begin transaction
update DDB_NextID
set DDB_SEQUENCE = DDB_SEQUENCE + 1
where DDB_TABLE = @tablesequence
select @next_id = DDB_SEQUENCE from DDB_NextID 
where DDB_TABLE = @tablesequence
commit transaction
RETURN @next_id

ここに私のC#コードがあります

using (OdbcConnection connection = new OdbcConnection(GetConnectionString()))
{
   using (IDbCommand command = new OdbcCommand())
   {
      command.CommandText = "sp_MSnextID_DDB_NEXTID";
      command.CommandType = CommandType.StoredProcedure;
      IDbDataParameter parameter1 = command.CreateParameter();
      parameter1.DbType = DbType.String;
      parameter1.ParameterName = "@tablesequence";
      parameter1.Value = "ddb_dc_document";
      parameter1.Direction = ParameterDirection.Input;
      command.Parameters.Add(parameter1);

      IDbDataParameter parameter2 = command.CreateParameter();
      parameter2.DbType = DbType.Int32;
      parameter2.ParameterName = "@Return_Value";
      parameter2.Direction = ParameterDirection.ReturnValue;
      command.Parameters.Add(parameter2);
      command.Connection = connection;
      connection.Open();
      command.ExecuteNonQuery();
      IDbDataParameter o = (command.Parameters)["@Return_Value"] as IDbDataParameter;
      //Got return value from SP in o.Value
   }
}

問題は、例外が発生していることです

[42000] [Microsoft][SQL Native Client][SQL Server] プロシージャまたは関数 'sp_MSnextID_DDB_NextID' には、指定されていないパラメーター '@tablesequence' が必要です。

説明も修正もできません。私は何が欠けていますか?

回避策を見つけるために、別のアプローチを試みていました:一時テーブルにデータを設定する次のクエリを実行します

create table #temp  (i integer); insert into #temp exec sp_MSNextID_DDB_NEXTID @tablesequence='ddb_dc_document';select * from #temp;

この場合、SP は正しく実行されますが、select はゼロ行を返します。

4

2 に答える 2

1

残念ながら、名前付きパラメータはOdbcCommand. 代わりに、ストアド プロシージャに対して call ステートメントを実行する必要があります。

using (OdbcConnection connection = new OdbcConnection(GetConnectionString()))
{
   using (IDbCommand command = new OdbcCommand())
   {
      command.CommandText = "{ ? = CALL sp_MSnextID_DDB_NEXTID(?) }";
      command.CommandType = CommandType.StoredProcedure;


      IDbDataParameter parameter2 = command.CreateParameter();
      parameter2.DbType = DbType.Int32;
      parameter2.ParameterName = "@Return_Value";
      parameter2.Direction = ParameterDirection.ReturnValue;
      command.Parameters.Add(parameter2);

      IDbDataParameter parameter1 = command.CreateParameter();
      parameter1.DbType = DbType.String;
      parameter1.ParameterName = "@tablesequence";
      parameter1.Value = "ddb_dc_document";
      parameter1.Direction = ParameterDirection.Input;
      command.Parameters.Add(parameter1);

      command.Connection = connection;
      connection.Open();
      command.ExecuteNonQuery();
      IDbDataParameter o = (command.Parameters)["@Return_Value"] as IDbDataParameter;
      //Got return value from SP in o.Value
   }
}
于 2012-04-08T05:58:36.743 に答える
0

回避策を機能させるには、交換する必要があります

RETURN @next_id 

あなたの手順で

SELECT @next_id 
于 2012-04-08T05:57:37.353 に答える