[C#] ストアドプロシージャを呼び出すときにC#で返された値とレコードのセットを取得する


Answers

すべてのSQL Serverストアドプロシージャは、 int戻りコードを返します。 デフォルトでは、 return文がすべて実行されない場合は0、値のない単純なreturn値が実行されます。 それ以外の場合、戻りコードはreturn文で指定された値( return @someIntegerValueなど)に設定されます。この戻りコードは、 DirectionプロパティをParameterDirection.ReturnValue設定してコマンドのパラメータのコレクションにパラメータを追加することによってアクセスできます。

また、 outputパラメータを使用して値を返すこともできます。

このコードはあなたに役立つはずです。 outputパラメータとプロシージャのint戻りコードの両方にアクセスする方法を示します。 私は結果セットをDataSet流し込んでいますが、 SqlDataReaderを開くことはまったく同じですが、 DataReaderが消費を終了するまで、出力パラメータやストアドプロシージャの戻りコードにアクセスすることはできません結果と最終的なコマンド実行。

static DataSet execSomeStoredProc( string tableName, out int columns , out DateTime? dtCreated )
{
  const string connectString = @"Server=localhost;Database=sandbox;Trusted_Connection=True;" ;

  DataSet ds = new DataSet();

  using ( SqlConnection session  = new SqlConnection(connectString) )
  using ( SqlCommand    cmd      = session.CreateCommand() )
  using ( SqlDataAdapter adapter = new SqlDataAdapter(cmd) )
  {

    cmd.CommandText = "dbo.my_simple_stored_procedure" ;
    cmd.CommandType = CommandType.StoredProcedure;

    // a simple input parameter
    cmd.Parameters.AddWithValue( "@tableName" , tableName ) ;

    // an output-only parameter
    SqlParameter outputParameter = new SqlParameter( "@creationDate" , SqlDbType.DateTime , 8 ) ;
    outputParameter.ParameterName = "@creationDate" ;
    outputParameter.Direction    = ParameterDirection.Output;
    outputParameter.IsNullable   = true ;
    cmd.Parameters.Add( outputParameter ) ;

    // the integer return code that all stored procedure returns.
    // The default value of 0 is return if no return statement is executed, or
    // a return statement with no value is executed.
    SqlParameter rc = new SqlParameter("@rc" ,SqlDbType.Int ) ;
    rc.Direction = ParameterDirection.ReturnValue;
    cmd.Parameters.Add( rc ) ;

    session.Open();
    adapter.Fill(ds) ;
    session.Close() ;

    columns = (int) rc.Value ;
    dtCreated = outputParameter.Value == DBNull.Value ? (DateTime?)null : (DateTime)outputParameter.Value ;

  }

  return ds ;
}

上記のコードは、このストアドプロシージャを実行する価値があります:

create procedure dbo.my_simple_stored_procedure

  @tableName   varchar(255) ,
  @creationDate datetime output

as

  set ansi_nulls              on
  set concat_null_yields_null on
  set nocount                 on

  declare @create_date datetime
  declare @rows        int

  select *
  from INFORMATION_SCHEMA.COLUMNS c
  where c.TABLE_SCHEMA = 'dbo'
    and c.TABLE_NAME = @tableName
  order by c.TABLE_CATALOG ,
           c.TABLE_SCHEMA  ,
           c.TABLE_NAME    ,
           c.ORDINAL_POSITION

  set @rows = @@rowcount

  select @create_date = st.create_date
  from sys.tables st
  where st.object_id = object_id( 'dbo.'+@tableName )

  set @creationDate = @create_date

  return @rows
go
Question

私は、2つの出力パラメータとレコードを返すストアドプロシージャを持っています。

しかし、C#では:

  • ExecuteReaderは戻り値を許可せず、レコードを許可します
  • ExecuteNonQueryは戻り値を許可しますが、レコードは許可しません。

私はどうすれば両方を得ることができますか?