webentwicklung-frage-antwort-db.com.de

Ersatz für DataTable/DataSet in .NET Core

basierend auf meinen Nachforschungen scheint es, als ob .net Core DataTable/DataSet nicht unterstützt. Ich habe vor kurzem auf .net core umgestellt, um eine neue Anwendung zu entwickeln, habe aber nicht erkannt, dass .net core überhaupt keine Bibliothek für diese Anwendungen hat. Ich habe dt/ds verwendet, um die Daten über gespeicherte Prozeduren abzurufen und eine Auflistung von Klassen zu füllen. Aber jetzt bin ich mit diesem neuen Problem ziemlich verloren, das ich Ersatz für dt/ds finden muss. Um genauer zu sein, habe ich das gemacht: 

Ich habe eine gespeicherte Prozedur, die vier Eingabeparameter übernimmt und eine Tabelle zurückgibt.

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 

und erstellen Sie eine Klasse mit denselben Feldern wie in meiner gespeicherten Prozedur.

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; }
}

und holen Sie Daten und füllen Sie die Sammlung der Klasse

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);
}

Mein schlechtes, ich hätte vor der Initiierung des Projekts mehr recherchieren sollen, aber ich brauche wirklich jedermanns Hilfe, um Ersatz für den obigen Code zu finden. Wäre es möglich, die FromSql-Methode von .net core als Ersatz zu verwenden? Jeder Vorschlag oder Beispielcode wäre dankbar.

Bearbeiten

Laut Peters Artikel wurde ein Weg gefunden, ds/dt in der .net-Kernversion zu implementieren, der jedoch ein Problem mit der Übergabe eines int-Arrays (StudentIds) an meine gespeicherte Prozedur hatte. 

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;
    }
}

Ich denke, das Problem kommt von IEnumerable? Wie kann ich ein int-Array korrekt an eine gespeicherte Prozedur übergeben? 

6
bbusdriver

Ich weiß nicht viel über .Net Core, aber ich denke, Sie können stattdessen IEnumerable<SqlDataRecord> verwenden.

1
Abdullah Dibas

DataTable ist jetzt in .NET Core 2.0 vorhanden. Siehe meine Antwort unter 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;
 }
4
Joe Healy