Основываясь на моих исследованиях, похоже, что .net-ядро не поддерживает DataTable/DataSet. Недавно я перешел на ядро .net для разработки нового приложения, но не смог распознать, что ядро .net не имеет библиотеки для тех, кто в первую очередь. Я использовал dt/ds для извлечения данных через хранимую процедуру и заполнения набора классов. Но теперь я совершенно потерял эту новую проблему, и мне нужно найти замену для dt/ds. Чтобы быть более конкретным, я использовал это:Замена для DataTable/DataSet в .NET Core
У меня есть хранимая процедура, которая принимает четыре входных параметра и возвращает таблицу.
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
и создать класс с теми же полями, что и в моей хранимой процедуре.
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; }
}
и выборки данных и заполнить коллекцию класса
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);
}
Мое плохое, я исследовал больше, прежде чем я начал проект, но мне действительно потребуется помощь, чтобы найти замену кода выше. Можно ли использовать метод FromSql ядра .net в качестве замены? Любые предложения или примеры кода будут оценены.
Редактировать
Согласно статье Питера, нашел способ реализации DS/DT в .net версии ядра, но с немного проблемой пропусканием целочисленного массива (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 –
У меня также есть эта проблема, за исключением того, что моя хранимая процедура возвращает несколько таблиц. Поэтому в моем коде я просто назначаю результат набору данных и получаю доступ к каждой таблице. Черт, Microsoft снова заставляет нас использовать полусухие продукты. –