私の研究に基づいて、.netコアはDataTable/DataSetをサポートしていないようです。私は最近、新しいアプリケーションを開発するために.netコアに移行しましたが、.netコアにはそもそもそれらのライブラリがないことを認識できませんでした。私は以前、ストアドプロシージャを介してデータをフェッチし、クラスのコレクションを埋めるためにdt/dsを使用していました。しかし、今、私はdt/dsの代替品を見つけなければならないというこの新しい問題でかなり迷っています。具体的には、以前は次のようにしました。
4つの入力パラメーターを受け取り、テーブルを返すストアドプロシージャがあります。
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);
}
私の悪い点は、プロジェクトを開始する前にもっと調査する必要があったことですが、上記のコードの代わりを見つけるために誰かの助けが本当に必要です。 .netコアのFromSqlメソッドを代わりに使用することは可能ですか?任意の提案やサンプルコードをいただければ幸いです。
編集
Peterの記事によると、.netコアバージョンでds/dtを実装する方法を見つけましたが、int配列(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配列をストアドプロシージャに正しく渡すことができますか?
.Net Coreについてはあまり知りませんが、IEnumerable<SqlDataRecord>
代わりに。
DataTableが.NET Core 2.0に追加されました。 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;
}