1

私は、データセット、アダプター、データテーブルなどを操作するのは初めてです。したがって、これは初心者の質問と見なされると思います。

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
4

2 に答える 2

4

アダプターのfillをどこにも呼んでいないのですか?

どこかに次のようなコード行があるはずです...

SqlDataAdapter da = new SqlDataAdapter("select * from courses", mySqlConnection);

da.Fill(ds);

さらに、データアダプタのselectコマンドを、データベースから実行する予定のsqlステートメントに設定する必要があります。

于 2013-03-26T13:44:03.397 に答える
2

Way1

sqlcommandを使用してデータセットオブジェクトを入力する場合は、このように接続を開いたり閉じたりする必要があります

SqlConnection nwindConn = new SqlConnection("Data Source=localhost;Integrated Security=SSPI;Initial Catalog=northwind");

SqlCommand selectCMD = new SqlCommand("SELECT CustomerID, CompanyName FROM Customers", nwindConn);
selectCMD.CommandTimeout = 30;

SqlDataAdapter custDA = new SqlDataAdapter();
custDA.SelectCommand = selectCMD;

nwindConn.Open();

DataSet custDS = new DataSet();
custDA.Fill(custDS, "Customers");

nwindConn.Close();

DataAdapterからのDataSetの入力


Way2

あなたのために更新

// Assumes that connection is a valid SqlConnection object.
string queryString = 
  "SELECT CustomerID, CompanyName FROM dbo.Customers";
SqlDataAdapter adapter = new SqlDataAdapter(queryString, connection);

DataSet customers = new DataSet();
adapter.Fill(customers, "Customers");

DataAdapterからのDataSetの入力


更新前

ここにコードされていないデータセットオブジェクトを入力します

MyDataSet ds = new MyDataSet();
ds.Locale = CultureInfo.InvariantCulture;
//fill datase object ds
//DataAdapter.Fill(ds)
DataTable courses = ds.Courses;

このエラーの場合

{"The SelectCommand property has not been initialized before calling 'Fill'."}

エラーが設定選択コマンドを言ったように、以下のようにしてください

SqlDataAdapter adapter = new SqlDataAdapter();
SqlCommand command = new SqlCommand("SELECT * FROM table", connection);
adapter.SelectCommand = command;

完全なソース:SqlDataAdapter.SelectCommandプロパティ

于 2013-03-26T13:45:21.867 に答える