在C#中运行存储过程,传递参数并捕获输出结果

时间:2011-10-13 20:23:51

标签: c# asp.net sql-server-2005 stored-procedures ado.net

这是一个我想要实现的简单任务,但ASP.NET使其变得非常困难,几乎不可能。我跟着这个问题 Running a Stored Procedure in C# Button但发现ExecuteNonQuery不会返回查询的输出。

我尝试了另一种方法,但似乎无法通过这种方式传递参数

SqlConnection myConnection = new SqlConnection(myconnectionString);

SqlCommand myCommand = new SqlCommand();
myCommand.CommandType = CommandType.StoredProcedure;
myCommand.CommandText = "usp_GetCustomer";

myCommand.SelectParameter <-- does not exist

有人可以编写这个简单的代码,我该如何实现呢?基本上我将@username@month(两个字符串)传递给存储过程,它返回一个我想要捕获并分配给标签控件的数字。

谢谢

我的查询输出是这个。它运行一个复杂的查询,创建一个临时表,然后运行

select @@rowcount

我正在捕捉它。

5 个答案:

答案 0 :(得分:3)

  1. 如果您确实需要结果集中的数据,请不要使用SqlCommand.ExecuteNonQuery()

  2. 确保您的程序使用set nocount on

  3. 然后使用SqlCommand.ExecuteScalar()

    return (int)myCommand.ExecuteScalar(); // value of select @@rowcount
    
  4. 编辑:至于您的参数:

    myCommand.Parameters.AddWithValue("@username","jsmith");
    myCommand.Parameters.AddWithValue("@month","January");
    

答案 1 :(得分:1)

我更喜欢使用linq-to-sql来处理存储过程。创建一个linq-to-sql模型,在其中添加要调用的SP。这将使SP作为生成的数据上下文的函数公开,其中参数是普通的C#函数。返回的值将作为C#对象的集合公开。

如果你有多个来自SP的结果,事情变得有点复杂,但仍然很直接。

答案 2 :(得分:1)

使用命令的Parameters集合设置参数,使用ExecuteScalar运行查询并从单行单列结果中获取值。

使用using块确保连接和命令在任何情况下都已关闭并正确处理。请注意,您必须提供与命令对象的连接:

int result;
using (SqlConnection connection = new SqlConnection(myconnectionString)) {
  using (SqlCommand command = new SqlCommand(connection)) {
    command.CommandType = CommandType.StoredProcedure;
    command.CommandText = "usp_GetCustomer";
    command.Parameters.Add("@username", SqlDbType.VarChar).Value = username;
    command.Parameters.Add("@month", SqlDbType.VarChar).Value = month;
    connection.Open();
    result = (int)myCommand.ExecuteScalar();
  }
}

答案 3 :(得分:0)

从SQL Server获取返回值的简单代码

SqlConnection myConnection = new SqlConnection(myconnectionString); 

SqlCommand myCommand = new SqlCommand(); 
myCommand.CommandType = CommandType.StoredProcedure; 
myCommand.CommandText = "usp_GetCustomer";

myCommand.Parameters.Add("@USER_NAME", SqlDbType.VarChar).Value = sUserName;   // user name that you pass to the stored procedure
myCommand.Parameters.Add("@Month", SqlDbType.VarChar).Value = iMonth;    //Month that you pass to the stored procedure

// to get return value from the stored procedure
myCommand.Parameters.Add("@ReturnValue", SqlDbType.Int).Direction = ParameterDirection.ReturnValue;

myConnection .Open();
myCommand.ExecuteScalar();

// Returnvalue from the stored procedure
int iReturnValue = Convert.ToInt32(command.Parameters["@ReturnValue"].Value);

答案 4 :(得分:0)

using(SqlConnection myConnection = new SqlConnection(myconnectionString))
{ 
    SqlCommand myCommand = new SqlCommand(); 
    myCommand.CommandType = CommandType.StoredProcedure; 
    myCommand.CommandText = "usp_GetCustomer";     

    myCommand.Parameters.Add("@USER_NAME", SqlDbType.VarChar).Value = sUserName;    // user name that you pass to stored procedure
    myCommand.Parameters.Add("@Month", SqlDbType.VarChar).Value = iMonth;    // Month that you pass to stored procedure
    // to get return value from stored procedure
    myCommand.Parameters.Add("@ReturnValue", SqlDbType.Int).Direction = ParameterDirection.ReturnValue;     

    myConnection .Open();
    myCommand.ExecuteScalar();     

    // Returnvalue from stored procedure
    return Convert.ToInt32(command.Parameters["@ReturnValue"].Value); 
}