2012-02-14 1 views
1

Я написал простую программу, которая вызывает хранимую процедуру с двумя параметрами (вход/выход), код, выполняемый с нет ошибки, но значение выходного параметра не отображается в окне вывода! Моя хранимая процедура:Я вызываю хранимую процедуру с 2 параметрами (ввод и вывод) из C#, но значение выходного параметра не отображается

CREATE PROCEDURE [dbo].[sp_return_orders_by_employeeid_and_show_order_count] 
(
@empid int, 
@ordercount int=0 output 
) 
as 
select * 
from Orders 
where [email protected]; 
select * 
from Orders 
where [email protected] 
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" не показывает! Спасибо за полезные ответы.

+0

Ваша хранимая процедура фактически не присваивает значение @ordercount –

ответ

3

Я думаю, что вы используете 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 
+0

. В этом случае вы теперь не возвращаете набор записей для datareader ... – gbn

+0

** Танк вы ** ваш ответ очень полезен. –

1

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

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

2

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

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

См here

0

Я не уверен, что вы можете сделать обратный @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 [email protected]; 

-- Modify here 
select @ordercount = Count(1) 
from Orders 
where [email protected] 
1

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

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

... 
as 
select * 
from Orders 
where [email protected]; 
SET @ordercount = @@ROWCOUNT; 
GO 
0

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

CREATE PROCEDURE sp_return_orders_by_employeeid_and_show_order_count 
(
    @empid int, 
    @ordercount int=0 output 
) 
as 
select * 
from Orders 
where [email protected]; 
select @ordercount=COUNT(*) 
from Orders 
where [email protected] 

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

благодарит за ответы.