2012-10-19 11 views
12

Chcę przywrócić wirtualną tabelę z procedury przechowywanej i chcę go użyć w zestawie danych w C# .net. Moja procedura jest trochę skomplikowana i nie może znaleźć sposobu, aby powrócić do stołu i ustawić go w zbiorzeZapisana procedura wraca do DataSet w C# .Net

Tu jest moja procedura modyfikacji:

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

Witamy StackOverflow: jeśli po przykłady kodu, XML lub danych, ** ** Proszę zaznaczyć te linie w edytorze tekstowym i kliknij przycisk "próbki kodu" ('{}') na pasku narzędzi edytora, aby ładnie sformatować i podświetlić składnię! –

Odpowiedz

42

Spróbuj

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

Jedna rzecz, która dostała mnie podczas próby użycia tej odpowiedzi było to, że musiałem ustawić mój typ polecenia na "CommandType.StoredProcedure". więc wyglądałoby to tak: 'sqlComm.CommandType = CommandType.StoredProcedure'. –

+0

@ Pow-Ian Dzięki za wskazanie, że na – codingbiz

+0

nie ma problemu. Siedziałem i zmagałem się z tym przez około godzinę, zanim go googlełem i znalazłem artykuł [MS, który dał mi brakujący element] (http://support.microsoft.com/kb/310070). Ale to z pewnością dało mi 99,9% drogi. Świetna odpowiedź. –

9

I powinien powiedzieć ci podstawowe kroki i odpoczynek zależy od twojego własnego wysiłku. Musisz wykonać następujące kroki.

  • Utwórz ciąg połączenia.
  • Tworzenie połączenia SQL
  • Tworzenie polecenia SQL
  • Tworzenie danych SQL adapter
  • wypełnić swój zestaw danych.

Nie zapomnij otworzyć i zamknąć połączenia. śledź ten numer link, aby uzyskać więcej informacji.

+0

jako odpowiedzi nie sądzę, że to było bardzo pomocne. O ile nie stwierdzono inaczej, uważam, że ludzie chcą raczej specyfiki niż leków generycznych. –

1

Możesz zadeklarować instancje SqlConnection i SqlCommand na poziomie globalnym, aby można było z nich korzystać przez całą klasę. Ciąg połączenia znajduje się pod numerem Web.Config.

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

Teraz można skorzystać z poniższej metody, aby przekazać wartości procedura przechowywana i uzyskać 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(); 
} 

Poniżej znajduje się przykładowy ciąg połączenia w pliku konfiguracyjnym

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