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?
Je ne connais pas grand chose à propos de .Net Core, mais je pense que vous pouvez utiliser IEnumerable<SqlDataRecord>
à la place.
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;
}