私は、データセット、アダプター、データテーブルなどを操作するのは初めてです。したがって、これは初心者の質問と見なされると思います。
Visual Studioでビジュアルデザイナー(.xsd拡張子の付いたファイル)を使用してデータセットを作成します。そこで、「Courses」という名前のDataTableを定義しました。SQLサーバークエリを使用してデザイナを介してこのテーブルにデータを入力したので、データ接続が正しいことがわかります。
私のコードでは、そのDataTableをインスタンス化して、その中の列を、Course.csと呼ばれるローカルクラスにマップする方法をテストしています。方法は次のとおりです。
MyContext ctx = new MyContext();
SqlConnection conn =
new SqlConnection("Data Source=****;Initial Catalog=****;User ID=****;Password=****");
SqlCommand command = new SqlCommand(@"select * from stuff", conn);
SqlDataAdapter da = new SqlDataAdapter();
MyDataSet ds = new MyDataSet();
ds.Locale = CultureInfo.InvariantCulture;
da.Fill(ds);
DataTable courses = ds.Courses;
IEnumerable<DataRow> query =
from course in courses.AsEnumerable()
select course;
foreach (var course in query)
{
Course localCourse = new Course();
localCourse.CourseCode = course.Field<string>("CourseCode");
ctx.Courses.Add(localCourse);
}
ctx.SaveChanges();
エラーは発生していません。コードは正常に実行されますが、「query」変数には何も含まれていないため、必要な新しいオブジェクトを作成して値をマッピングしていません。
ここで何が欠けていますか?
編集
迅速な対応ありがとうございます!コード行を追加すると、次のようになります。
da.Fill(ds);
それは私にこの例外を与えます:
{"The SelectCommand property has not been initialized before calling 'Fill'."}
選択コマンドを作成したくないので、これは私を混乱させますが、それはすでに私のデータテーブルにありましたか?
2つ編集
私は提案されたことを実行しました、そして私がする必要があることは理にかなっています、しかし私はまだ結果を得ていません(しかしもうエラーはありません..)。同じ接続文字列で同じクエリを実行すると、結果を得ることができます。アイデアはありますか?
3つ編集してください!
これは、データテーブルにデータを入力するために使用している生の醜いクエリです。私が言ったように、SSMSでそれを行うと結果はうまくいきます。
select
s.AdClassSchedId,
rtrim(s.code) +
CASE WHEN (isnull(s.section,'') <> '')
THEN '-S' + s.section
ELSE '' END as CourseCode,
s.descrip +
CASE WHEN (isnull(s.section,'') <> '')
THEN ' - Section ' + s.section
ELSE '' END as CourseName,
s.AdTeacherId,
s.StartDate,
s.EndDate,
s.DateLstMod as ClassSchedLastModified,
t.AdTermId
from adclasssched s
inner join adclassschedterm t on s.adclassschedid = t.adclassschedid
where s.active = 1