Remplacement pour DataTable/DataSet .NET de Base
basé sur mes recherches, il semble que .net de base ne prend pas en charge DataTable/DataSet. J'ai récemment changé d' .net de base pour le développement d'une nouvelle application, mais il a omis de reconnaître que .net de base ne possède pas de bibliothèque pour les personnes en premier lieu. J'ai utilisé dt/ds pour récupérer les données via une procédure stockée et remplir collection de classes. Mais maintenant, je suis assez perdu avec ce nouveau problème que j'ai trouver de remplacement pour dt/ds. Pour être plus précis, j'ai utilisé pour ce faire:
J'ai une procédure stockée qui prend quatre paramètres d'entrée et retourne un tableau.
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 de créer une classe avec les mêmes champs que j'ai 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 extraire les données et le remplissage de 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, je devrais avoir étudié plus avant, j'ai lancé le projet, mais j'ai vraiment besoin de l'aide de quiconque pour trouver de remplacement pour le code ci-dessus. Serait-il possible de l'utiliser .net core FromSql méthode de remplacement? Toute suggestion ou des exemples de codes serait appréciée.
Modifier
Selon Pierre de l'article, trouvé un moyen de mettre en œuvre des ds/dt dans .net version de base, mais d'avoir un peu de problème en passant 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 de procédure stockée correctement?
- Il va venir dans les prochaines versio, voir github.com/dotnet/corefx/pull/12426
- Aussi, jetez un oeil à social.technet.microsoft.com/wiki/contents/articles/...
- J'ai aussi ce problème, sauf que ma procédure stockée renvoie un nombre de tables. Donc, dans mon code je viens d'affecter le résultat d'un ensemble de données et l'accès de chaque tableau, à partir de là. Putain de Microsoft est de nouveau en nous forçant à utiliser des demi-produits de boulangerie.
Vous devez vous connecter pour publier un commentaire.
Je ne connais pas trop .Net de Base, mais je pense que vous pouvez utiliser
IEnumerable<SqlDataRecord>
à la place.DataTable existe maintenant dans .NET Core 2.0. Voir ma réponse à https://blogs.msdn.microsoft.com/devfish/2017/05/15/exploring-datatable-and-sqldbadapter-in-asp-net-core-2-0/ .