2012-10-19 16 views
12

我想從存儲過程返回虛擬表,我想在c#.net的數據集中使用它。我的過程是一個有點複雜,無法找到如何返回一個表,並設置它在數據集中存儲過程返回到DataSet中的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 
+2

歡迎StackOverflow的樣本:如果您發佈的代碼,XML或數據樣本,** **請在高亮文本編輯器中的那些行並點擊編輯器工具欄上的「代碼示例」按鈕(「{}」),以精確地格式化和語法突出顯示它! –

回答

42

試試這個

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); 
    } 
+1

試圖使用這個答案時,有一件事讓我想到了,我必須將我的命令類型設置爲'CommandType.StoredProcedure'。所以它看起來像這樣'sqlComm.CommandType = CommandType.StoredProcedure'。 –

+0

@ Pow-Ian謝謝指出, – codingbiz

+0

沒問題。我坐了一會兒,並努力了一個小時左右,然後我搜索了它,發現[MS文章給了我缺少的一段](http://support.microsoft.com/kb/310070)。但這肯定讓我有99.9%的出路。很好的答案。 –

9

我應告訴你基本的步驟和休息取決於你自己的努力。您需要執行以下步驟。

  • 創建連接字符串。
  • 創建一個SQL連接
  • 創建SQL命令
  • 創建SQL數據適配器
  • 填寫您的數據集。

不要忘記打開和關閉連接。更多信息請參見link

+0

作爲答案去我不認爲這是非常有用的。除非另有說明,否則我覺得人們想要的是具體細節而不是泛型。 –

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>