1

我对使用数据集、适配器、数据表等有点陌生......所以我相信这将成为一个菜鸟问题。

我使用视觉设计器(扩展名为 .xsd 的文件)在视觉工作室中创建数据集。我在那里定义了一个名为“课程”的数据表。我通过设计器使用 sql server 查询填充了这个表,所以我知道我的数据连接正确。

在我的代码中,我正在测试如何使该 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();

我没有收到任何错误,它可以正常运行代码,但是由于“查询”变量中没有任何内容,因此它不会生成我想要的新对象并映射值。

我在这里想念什么?

编辑

感谢您的快速回复!当我添加代码行时:

da.Fill(ds);

它给了我这个例外:

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

这让我感到困惑,因为我不想创建一个选择命令,虽然我已经在我的数据表中了?

编辑二

我已经完成了建议的操作,我需要做的事情是有道理的,但我仍然没有得到任何结果(虽然没有错误了..)。如果我在相同的连接字符串上运行相同的查询,我可以获得结果,有什么想法吗?

编辑三!

这是我用来填充数据表的原始且丑陋的查询。就像我说的,如果我在 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

我没有看到您在任何地方调用适配器上的填充?

那里应该有一行代码看起来像......

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

da.Fill(ds);

此外,您需要将数据适配器的 select 命令设置为您打算从数据库运行的 sql 语句。

于 2013-03-26T13:44:03.397 回答
2

方式1

如果您使用 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


方式2

为你更新

// 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 回答