2017-02-18 80 views
2

根據我的研究,似乎.net核心不支持DataTable/DataSet。我最近轉向.NET核心開發一個新的應用程序,但沒有認識到.net核心並沒有爲那些首先使用的庫。我曾經使用dt/ds通過存儲過程獲取數據並填充類的集合。但是現在,我對這個新問題感到迷茫,我不得不尋找替代dt/ds的方法。更具體地說,我曾經這樣做:在.NET Core中替換DataTable/DataSet

我有一個存儲過程,它需要四個輸入參數並返回一個表。

ALTER PROCEDURE stp_Student 

@Name nvarchar(450), 
@StudentIds tvp_ArrayInt READONLY, 
@StartDate date, 
@EndDate date, 

AS 

blah blah 

//returns student summary 
SELECT stu.StudentId, 
     stu.StudentName, 
     CASE WHEN (COUNT(DISTINCT course.Id) IS NOT NULL) THEN COUNT(DISTINCT course.Id) ELSE 0 END AS CourseCount, 
     CASE WHEN (SUM(course.TotalCourses) IS NOT NULL) THEN SUM(course.TotalCourses) ELSE 0 END AS TotalCourses, 
     CASE WHEN (SUM(course.Hours) IS NOT NULL) THEN SUM(course.Hours) ELSE 0 END AS Hours 
FROM #TempStudent AS #Temp 

並創建一個與我在存儲過程中具有相同字段的類。類

using (SqlConnection conn = new SqlConnection(connectionString)) 
{ 
    SqlCommand cmd = new SqlCommand("sp_Student", conn); 
    cmd.CommandType = CommandType.StoredProcedure; 
    cmd.Parameters.AddWithValue("@Name", name); 
    cmd.Parameters.AddWithValue("@StudentIds", studentIds); 
    cmd.Parameters.AddWithValue("@StartDate", startDate); 
    cmd.Parameters.AddWithValue("@EndDate", endDate); 
    conn.Open(); 

    SqlDataAdapter da = new SqlDataAdapter(); 
    da.SelectCommand = cmd; 
    da.Fill(ds); 
    conn.Close(); 
} 

foreach (Datarow row in ds.Tables[0].Rows) 
{ 
    var model = new StudentModel(); 
    model.StudentId = Convert.ToString(row["StudentId"]); 
    //etc.. 
    studentList.Add(model); 
} 

我的壞的

public class StudentModel 
{ 
    public string StudentId { get; set; } 
    public string StudentName { get; set; } 
    public int CourseCount { get; set; } 
    [Column(TypeName = "Money")] 
    public decimal TotalCourses { get; set; } 
    public double Hours { get; set; } 
} 

,並獲取數據,並填寫採集,我應該已經研究多前我發起這個項目,但我真的需要任何人的幫助,找到替代上面的代碼。是否有可能使用.net core的FromSql方法作爲替代品?任何建議或示例代碼將不勝感激。

編輯

根據彼得的文章,找到了一種方法來實現在.NET核心版本的DS/dt的,但其傳遞的int數組(StudentIds)到我的存儲過程有點問題。

public List<StudentModel> GetStudents(string name, IEnumerable<int> studentIds, DateTime startDate, DateTime endDate) 
    { 
     List<StudentModel> students = new List<StudentModel>(); 
     StudentModel = null; 

     List<DbParameter> parameterList = new List<DbParameter>(); 

     parameterList.Add(base.GetParameter("Name", name)); 
     parameterList.Add(base.GetParameter("StudentIds", studentIds));   
     parameterList.Add(base.GetParameter("StartDate", startDate)); 
     parameterList.Add(base.GetParameter("EndDate", endDate));  

     using (DbDataReader dataReader = base.ExecuteReader("stp_Student", parameterList, CommandType.StoredProcedure)) 
     { 
      if (dataReader != null) 
      { 
       while (dataReader.Read()) 
       { 
        model = new StudentModel(); 
        model.StudentId= (int)dataReader["StudentId"]; 
        .... 

        students .Add(model); 
       } 
      } 
     } 
     return students; 
    } 
} 

我想問題來自傳遞IEnumerable?我怎樣才能正確地傳遞一個int數組存儲過程?

+2

它會在未來versio,看到https://github.com/dotnet/corefx/pull/12426 –

+1

此外,看一看https://social.technet.microsoft.com/wiki /contents/articles/35974.exploring-net-core-net-core-1-0-connecting-sql-server-database.aspx#ExecuteReader –

+0

我也有這個問題,除了我的存儲過程返回一些表。所以在我的代碼中,我只是將結果分配給數據集並從那裏訪問每個表。該死的微軟再次強迫我們使用半焙烤產品。 –

回答

1

我不太瞭解.Net Core,但我認爲你可以使用IEnumerable<SqlDataRecord>來代替。

2

DataTable現在存在於.NET Core 2.0中。請在https://blogs.msdn.microsoft.com/devfish/2017/05/15/exploring-datatable-and-sqldbadapter-in-asp-net-core-2-0/處查看我的回答。

public static DataTable ExecuteDataTableSqlDA(SqlConnection conn, CommandType cmdType, string cmdText, SqlParameter[] cmdParms) 
{ 
System.Data.DataTable dt = new DataTable(); 
System.Data.SqlClient.SqlDataAdapter da = new SqlDataAdapter(cmdText, conn); 
da.Fill(dt); 
return dt; 
} 
+0

和淨標準1.5的兼容性?沒有DataSet可用。現在,2.0正在預覽中,而不是生產準備就緒。 – soydachi

相關問題