存储过程返回到 C# .Net 中的 DataSet

Posted

技术标签:

【中文标题】存储过程返回到 C# .Net 中的 DataSet【英文标题】:Stored procedure return into DataSet in C# .Net 【发布时间】:2012-10-10 00:57:30 【问题描述】:

我想从存储过程中返回虚拟表,我想在 c# .net 的数据集中使用它。我的程序有点复杂,找不到如何返回表并将其设置在数据集中

这是我的修改程序:

ALTER PROCEDURE [dbo].[Procedure1] 

    @Start datetime, 
    @Finish datetime,
    @TimeRange time
AS
BEGIN

    SET NOCOUNT ON;

    declare @TimeRanges as TABLE (SessionStart datetime, SessionEnd datetime);

     with TimeRanges as (
  select @Start as StartTime, @Start + @TimeRange as EndTime
  union all
  select StartTime + @TimeRange, EndTime + @TimeRange
    from TimeRanges
    where StartTime < @Finish )
  select StartTime, EndTime, Count( Test.ScenarioID ) as TotalPeaks
    from TimeRanges as TR left outer join
      dbo.Test as Test on TR.StartTime <= Test.SessionStartTime and Test.SessionCloseTime < TR.EndTime
    group by TR.StartTime, TR.EndTime   
END

【问题讨论】:

欢迎使用 ***:如果您发布代码、XML 或数据示例,在文本编辑器中突出显示这些行并单击“代码示例”按钮 ( ) 在编辑器工具栏上以很好地格式化和语法突出显示它! 【参考方案1】:

您可以在全局级别声明 SqlConnectionSqlCommand 实例,以便您可以在整个课程中使用它。连接字符串在Web.Config

SqlConnection sqlConn = new SqlConnection(WebConfigurationManager.ConnectionStrings["SqlConnector"].ConnectionString);
SqlCommand sqlcomm = new SqlCommand();

现在您可以使用以下方法将值传递给存储过程并获取DataSet

public DataSet GetDataSet(string paramValue)

    sqlcomm.Connection = sqlConn;
    using (sqlConn)
    
        try
        
            using (SqlDataAdapter da = new SqlDataAdapter())
              
                // This will be your input parameter and its value
                sqlcomm.Parameters.AddWithValue("@ParameterName", paramValue);

                // You can retrieve values of `output` variables
                var returnParam = new SqlParameter
                
                    ParameterName = "@Error",
                    Direction = ParameterDirection.Output,
                    Size = 1000
                ;
                sqlcomm.Parameters.Add(returnParam);
                // Name of stored procedure
                sqlcomm.CommandText = "StoredProcedureName";
                da.SelectCommand = sqlcomm;
                da.SelectCommand.CommandType = CommandType.StoredProcedure;

                DataSet ds = new DataSet();
                da.Fill(ds);                            
            
        
        catch (SQLException ex)
        
            Console.WriteLine("SQL Error: " + ex.Message);
        
        catch (Exception e)
        
            Console.WriteLine("Error: " + e.Message);
        
    
    return new DataSet();

以下是配置文件中的连接字符串示例

<connectionStrings>
    <add name="SqlConnector"
         connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;Initial Catalog=YourDatabaseName;User id=YourUserName;Password=YourPassword"
         providerName="System.Data.SqlClient" />
</connectionStrings>

【讨论】:

不,您应该始终像使用它们一样在 using 语句中创建 SqlCommand 和 SqlConnection 对象,以便之后处理它们并确保它们不被多个线程使用。 由于 SqlCommand 和 SqlConnection 也用于多个方法的全局级别(出于重用目的),我既没有使用 using 也没有使用任何命令来处理。理想情况下,我曾经在必要/应用程序结束的地方处理它。另外,请注意,我没有提到程序中的完整代码,因为我的目的是回答 OP 的要求。这就是你没有看到任何处理代码的原因@Rory 我的意思是最好不要按照你的建议去做。你的例子不应该被效仿。当您直接使用 SqlCommand 或 SqlConnection 对象时,没有充分的理由保留它,并且有很多缺点(例如,由多个线程使用,没有正确处理,妨碍有效的连接池,保持比需要更多的连接打开)。 另外,GetDataSet() 中似乎有一些错误,例如它总是返回一个新的空DataSet 对象,它在第一次执行后处理sqlconn 变量。这是一个从 proc ***.com/a/12974098/8479 填充 DataSet 的好例子【参考方案2】:

试试这个

    DataSet ds = new DataSet("TimeRanges");
    using(SqlConnection conn = new SqlConnection("ConnectionString"))
                   
            SqlCommand sqlComm = new SqlCommand("Procedure1", conn);               
            sqlComm.Parameters.AddWithValue("@Start", StartTime);
            sqlComm.Parameters.AddWithValue("@Finish", FinishTime);
            sqlComm.Parameters.AddWithValue("@TimeRange", TimeRange);

            sqlComm.CommandType = CommandType.StoredProcedure;

            SqlDataAdapter da = new SqlDataAdapter();
            da.SelectCommand = sqlComm;

            da.Fill(ds);
     

【讨论】:

在尝试使用此答案时让我感到惊讶的是,我必须将命令类型设置为 CommandType.StoredProcedure。所以它看起来像这样sqlComm.CommandType = CommandType.StoredProcedure 没问题。在我用谷歌搜索它并找到MS article that gave me the missing piece之前,我坐在那里挣扎了一个小时左右。但这无疑让我达到了 99.9% 的目标。很好的答案。 @codingbiz 如果 t sql 也返回数据表旁边的输出参数呢?是否也有可能获得?如何?样品? ds.Tables[0].Rows[0][0] 获取第一行的第一列,因为您只有一行一列 插入时使用输出参数...这是一种选择查询方式【参考方案3】:

我应该告诉你基本的步骤,休息取决于你自己的努力。您需要执行以下步骤。

创建一个连接字符串。 创建 SQL 连接 创建 SQL 命令 创建 SQL 数据适配器 填写您的数据集。

不要忘记打开和关闭连接。关注此link 了解更多信息。

【讨论】:

作为答案,我认为这不是很有帮助。除非另有说明,否则我觉得人们想要的是细节而不是泛型。

以上是关于存储过程返回到 C# .Net 中的 DataSet的主要内容,如果未能解决你的问题,请参考以下文章

从 C# .NET 中的 DataTable 到 JSON

ADO.Net(C#)中怎么执行Oracle的存储过程

C# & ASP.NET MVC 5 - 从按钮单击执行存储过程,没有返回值

VB.NET是如何使用ADO让存储过程返回数据表中的值呢?求解!

从 C# 中的存储过程返回多个记录集

从 C# 中的存储过程中获取返回值