web-dev-qa-db-fra.com

Remplacement de DataTable/DataSet dans .NET Core

sur la base de mes recherches, il semble que le noyau .net ne supporte pas DataTable/DataSet. Je me suis récemment tourné vers le noyau .net pour développer une nouvelle application, mais je n'ai pas réussi à reconnaître que le noyau .net n'avait pas de bibliothèque pour ceux à la base. J'avais l'habitude d'utiliser dt/ds pour récupérer les données via une procédure stockée et remplir une collection de classes. Mais maintenant, je suis tout à fait perdu avec ce nouveau problème que je dois remplacer pour dt/ds. Pour être plus précis, je faisais ceci: 

J'ai une procédure stockée qui prend quatre paramètres d'entrée et retourne une table.

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 

et créez une classe avec les mêmes champs que dans ma procédure stockée.

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

et récupérer des données et remplir la collection de la classe

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

Mon mal, j'aurais dû faire plus de recherches avant d'initier le projet, mais j'ai vraiment besoin de l'aide de quelqu'un pour trouver un remplaçant pour le code ci-dessus. Serait-il possible d'utiliser la méthode FromSql de .net core en remplacement? Toute suggestion ou exemple de code serait apprécié.

Modifier

Selon l'article de Peter, nous avons trouvé un moyen d'implémenter ds/dt dans la version .net core, mais je rencontrais un problème pour transmettre un tableau int (StudentIds) à ma procédure stockée. 

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

Je pense que le problème vient de passer IEnumerable? Comment puis-je passer un tableau int à la procédure stockée correctement? 

6
bbusdriver

Je ne connais pas grand chose à propos de .Net Core, mais je pense que vous pouvez utiliser IEnumerable<SqlDataRecord> à la place.

1
Abdullah Dibas

DataTable existe maintenant dans .NET Core 2.0. Voir ma réponse à l'adresse 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