1

2 つのパラメーター (入力/出力) を持つストアド プロシージャを呼び出す簡単なプログラムを作成しました。コードはエラーなしで実行されましたが、出力パラメーターの値が出力ウィンドウに表示されません。私のストアドプロシージャ:

CREATE PROCEDURE [dbo].[sp_return_orders_by_employeeid_and_show_order_count]
(
@empid int,
@ordercount int=0 output
)
as
select *
from Orders
where orders.EmployeeID=@empid;
select *
from Orders
where Orders.EmployeeID=@empid
return @ordercount

そして、以下の C# コードを書きました。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;

namespace DB02
{
    class Program
    {
        static void Main(string[] args)
        {
            SqlConnection connection = new SqlConnection(@"server=.\sqlexpress;
            integrated security=true; database=northwind");
            try
            {
                connection.Open();
                SqlCommand cmd = connection.CreateCommand();
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.CommandText = "sp_return_orders_by_employeeid_and_show_order_count";
                SqlParameter inparam = cmd.Parameters.Add("@empid", SqlDbType.Int);
                inparam.Direction = ParameterDirection.Input;
                inparam.Value = 2;
                SqlParameter outparam = cmd.Parameters.Add("@ordercount", SqlDbType.Int);
                outparam.Direction = ParameterDirection.Output;

                SqlDataReader rdr = cmd.ExecuteReader();
                while (rdr.Read())
                {
                    Console.WriteLine("{0}\t{1}\t{2}\t", rdr[0].ToString(), rdr[1].ToString(),
                        rdr[9].ToString());
                } 
                Console.WriteLine("Numbers of Orders= {0}", outparam.Value);          
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            finally
            {
                connection.Close();
            }

            }
    }
}

出力:

「outparam」の値が表示されません! 有益な回答ありがとうございます。

4

6 に答える 6

3

(C# コードを見て) SQL Server を使用していると思うので、値を返すべきではありません。次のように、出力変数を返したい値に設定するだけです。

SET @ordercount = 10;

Stored Proc を次のように変更してみてください。

CREATE PROCEDURE [dbo].[sp_return_orders_by_employeeid_and_show_order_count]
(
    @empid INT,
    @ordercount INT OUTPUT
)
AS BEGIN

    SELECT @ordercount = COUNT(*)
    FROM Orders
    WHERE Orders.EmployeeID = @empid;

END
于 2012-02-14T09:53:39.237 に答える
2

Sebastian の回答に従って、@ordercount を割り当ててから返します。

または、RETURN @ordercountSPROC からも使用できるため、次を使用することもできますParameterDirection.ReturnValue

こちらをご覧ください

于 2012-02-14T09:54:17.433 に答える
1

RETURNは@ordercountを設定しません(特別なパラメーターを設定します)

結果セットレコード数の両方を返すには、このようなものが必要になります

...
as
select *
from Orders
where orders.EmployeeID=@empid;
SET @ordercount = @@ROWCOUNT;
GO
于 2012-02-14T09:57:57.673 に答える
1

ストアド プロシージャは、実際にはこの出力パラメーターに値を割り当てません。ストアド プロシージャを変更し、select @ordercount = count(*) のような操作を行う必要があります。

それが役立つことを願っています。

于 2012-02-14T09:53:44.187 に答える
0

私は私の問題を解決します。ストアド プロシージャを次のように変更します。

CREATE PROCEDURE sp_return_orders_by_employeeid_and_show_order_count
(
    @empid int,
    @ordercount int=0 output
)
as
select *
from Orders
where orders.EmployeeID=@empid;
select @ordercount=COUNT(*)
from Orders
where Orders.EmployeeID=@empid

また、C# ソース コードでは、SqlDataReader の実行後に接続を閉じます。次に接続を再度開き、ExecuteNonQuery() を呼び出します。現在、出力パラメーターに値があります。また、SqlParameter定義セクションを変更しますが、必要ありません。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
namespace DB02
{
    class Program
    {
        static void Main(string[] args)
        {
            SqlConnection connection = new SqlConnection(@"server=.\sqlexpress;
            integrated security=true; database=northwind");
            try
            {
                connection.Open();
                SqlCommand cmd = connection.CreateCommand();
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.CommandText = "sp_return_orders_by_employeeid_and_show_order_count";
                //SqlParameter Definition Section.
                SqlParameter inparam = new SqlParameter("@empid", SqlDbType.Int);
                inparam.Direction = ParameterDirection.Input;
                inparam.Value = 2;
                cmd.Parameters.Add(inparam);
                SqlParameter outparam = new SqlParameter("@ordercount", SqlDbType.Int);
                outparam.Direction = ParameterDirection.Output;
                cmd.Parameters.Add(outparam);
                SqlDataReader rdr = cmd.ExecuteReader();
                while (rdr.Read())
                {
                    Console.WriteLine("{0}\t{1}\t{2}\t", rdr[0].ToString(), rdr[1].ToString(),
                        rdr[9].ToString());
                }
                connection.Close();
                connection.Open();
                cmd.ExecuteNonQuery();
                Console.WriteLine("Numbers of Orders= {0}", outparam.Value);          
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            finally
            {
                connection.Close();
            }
            }
    }
}

役立つ回答をありがとうございます。

于 2012-02-14T17:51:51.200 に答える
0

@ordercount を返すことができるかどうかはわかりません。

カウントをご希望の場合はご注文ください。ストア プロシージャを次のように変更する必要があります。

CREATE PROCEDURE [dbo].[sp_return_orders_by_employeeid_and_show_order_count]
(
@empid int,
@ordercount int=0 output
)
as
select *
from Orders
where orders.EmployeeID=@empid;

-- Modify here
select @ordercount = Count(1)
from Orders
where Orders.EmployeeID=@empid
于 2012-02-14T09:55:07.550 に答える