Я вызываю хранимую процедуру с 2 параметрами (вход и выход) из C #, но значение выходного параметра не показывает - PullRequest
1 голос
/ 14 февраля 2012

Я написал простую программу, которая вызывает хранимую процедуру с 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" не показывает!Спасибо за полезные ответы.

Ответы [ 6 ]

3 голосов
/ 14 февраля 2012

Я думаю, что вы используете SQL Server (просматривая свой код C #), поэтому вам не нужно возвращать значение, вам просто нужно установить выходную переменную в значение, которое вы хотите вернуть, например:

SET @ordercount = 10;

Попробуйте изменить сохраненный процесс следующим образом:

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
2 голосов
/ 14 февраля 2012

Согласно ответу Себастьяна, перед возвратом присвойте @ordercount.

В качестве альтернативы, поскольку вы также RETURN @ordercount из своего SPROC, вы также можете использовать ParameterDirection.ReturnValue

См. здесь

1 голос
/ 14 февраля 2012

RETURN не устанавливает @ordercount (он устанавливает специальный параметр)

Вам нужно что-то подобное, чтобы вернуть оба набор результатов и количество записей

...
as
select *
from Orders
where orders.EmployeeID=@empid;
SET @ordercount = @@ROWCOUNT;
GO
1 голос
/ 14 февраля 2012

Ваша хранимая процедура фактически не присваивает значение этому выходному параметру. Вам нужно изменить свой сохраненный процесс и сделать что-то вроде select @ordercount = count (*)

Надеюсь, это поможет.

0 голосов
/ 14 февраля 2012

Я решаю свою проблему. Я изменяю хранимую процедуру следующим образом:

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();
            }
            }
    }
}

Большое спасибо за ваши полезные ответы.

0 голосов
/ 14 февраля 2012

Я не уверен, что вы можете сделать return @ ordercount.

Если вы хотите получить счет, если заказ.Вам следует изменить процедуру хранения следующим образом: follwinf

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...