2017-07-03 45 views
0

我有這個DataSet,它調用我的Stored Procedure並返回一個整數列表。我如何提取我可以存儲在變量中的整數列表,例如它可以是一個大小如List<T>或原始數據類型(如整數的array)的集合。將DataSet的內容提取到對象中

下面是我的代碼:

private DataSet getSubGroupsBelongingToUser() 
     { 
      DataTable variable; 
      DataSet DS; 
      myConnectionString = ConfigurationManager.ConnectionStrings["FSK_ServiceMonitor_Users_Management.Properties.Settings.FSK_ServiceMonitorConnectionString"].ConnectionString; 

      using (mySQLConnection = new SqlConnection(myConnectionString)) 
      { 
       SqlParameter param = new SqlParameter("@UserId", getUserID(cbxSelectUser.Text)); 
       DS = GetData("Test", param); 
       variable = DS.Tables[0]; 

      } 


      return DS; 
     } 

當我將鼠標懸停在DS放大鏡(見圖片): enter image description here

我想檢索和存儲整數該列表中的某個地方。我怎麼能這樣做呢?我在網上遇到的所有示例都使用linq,因爲我從我的存儲過程中獲取需要一個輸入參數的結果,所以這裏不適用。下面是存儲過程的定義如下:

create proc [dbo].[Test] 
@UserId smallint 
as 
begin 
    select DepartmentSubGroupId from DepartmentSubGroupUser 
    where UserId= @UserId 
end 
GO 

所以基本上當你傳遞一個UserId時,你應該得到這些值。我正在使用SQL Server作爲我的DBMS。

+4

如果你只是想要一個'List '那麼爲什麼要使用'DataSet'呢?您可以使用'SqlDataReader'來遍歷結果並將每條記錄添加到列表中。 – David

回答

2

最簡單和最有效的方法是不使用DataSet/DataTable都:如果你堅持DataTable

private List<int> GetSubGroupsBelongingToUser() 
{ 
    List<int> list = new List<int>(); 
    using (var con = new SqlConnection(ConfigurationManager.ConnectionStrings["FSK_ServiceMonitor_Users_Management.Properties.Settings.FSK_ServiceMonitorConnectionString"].ConnectionString)) 
    using (var cmd = new SqlCommand("Test", con)) 
    { 
     cmd.CommandType = CommandType.StoredProcedure; 
     var param = new SqlParameter("@UserId", SqlDbType.Int).Value = int.Parse(cbxSelectUser.Text); 
     cmd.Parameters.Add(param); 
     con.Open(); 
     using (var rd = cmd.ExecuteReader()) 
     { 
      while (rd.Read()) list.Add(rd.GetInt32(0)); 
     } 
    } // no need to close the connection with the using 

    return list; 
} 

,在至少它更conscise:

return DS.Tables[0].AsEnumerable().Select(r => r.Field<int>(0)).ToList(); 
1

正如@大衛指出,最簡單的選擇是使用SqlDataReader並遍歷所有記錄。

但是,如果您的心臟設置爲DataTable s,那麼您需要做的是迭代結果表中的所有行,從列DepartmentSubGroupId中獲取值並將其添加到列表中。你可以做到這一點使用LINQ也是這樣:

return DS.Tables[0].Rows 
    .Cast<DataRow>() // Rows is an ICollection and you need to cast each item 
    .Select(r => (int)r["DepartmentSubGroupId"]) // For each row get the value from column DepartmentSubGroupId 
    .ToList(); 
0

之前我看到@添的解決方案,我已經準備了這個(工作一樣好,因爲大多數的ABO ve解決方案):

 public List<int> getSubGroupsBelongingToUser() 
     { 
      List<int> DepartmentSubGroupIds = new List<int>(); 

      myConnectionString = ConfigurationManager.ConnectionStrings["FSK_ServiceMonitor_Users_Management.Properties.Settings.FSK_ServiceMonitorConnectionString"].ConnectionString; 
      using (mySQLConnection = new SqlConnection(myConnectionString)) 
      { 
       SqlParameter parameter = new SqlParameter("@UserId", getUserID(cbxSelectUser.Text)); 
       mySQLCommand = new SqlCommand("Test", mySQLConnection); 
       mySQLCommand.CommandType = CommandType.StoredProcedure; 
       mySQLCommand.Parameters.Add(parameter); 
       mySQLConnection.ConnectionString = myConnectionString; 
       mySQLConnection.Open(); 

       SqlDataReader sqlDataReader = mySQLCommand.ExecuteReader(); 
       while (sqlDataReader.Read()) 
       { 
        DepartmentSubGroupIds.Add(Convert.ToInt32(sqlDataReader["DepartmentSubGroupId"])); 
       } 
      } 
      return DepartmentSubGroupIds; 
     } 

謝謝大家,非常感謝。