根據我的研究,似乎.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數組存儲過程?
它會在未來versio,看到https://github.com/dotnet/corefx/pull/12426 –
此外,看一看https://social.technet.microsoft.com/wiki /contents/articles/35974.exploring-net-core-net-core-1-0-connecting-sql-server-database.aspx#ExecuteReader –
我也有這個問題,除了我的存儲過程返回一些表。所以在我的代碼中,我只是將結果分配給數據集並從那裏訪問每個表。該死的微軟再次強迫我們使用半焙烤產品。 –