我对使用数据集,适配器,数据表等方面有点新意见......所以我相信这可以作为一个菜鸟问题。
我使用可视化设计器(具有.xsd扩展名的文件)在visual studio中创建数据集。我在那里定义了一个名为“课程”的DataTable。我通过设计器使用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();
我没有收到任何错误,它会运行良好的代码,但由于'query'变量中没有任何内容,因此它不会生成我想要的新对象并映射值。
我在这里缺少什么?
修改
感谢您的快速回复!当我添加代码行时:
da.Fill(ds);
它给了我这个例外:
{"The SelectCommand property has not been initialized before calling 'Fill'."}
这让我感到困惑,因为我不想创建一个select命令,虽然那已经在我的数据表中了?
编辑两个
我已经完成了所建议的内容,而且我需要做的事情是有道理的,但我仍然没有得到任何结果(虽然没有错误......)。如果我在相同的连接字符串上运行相同的查询,我可以获得结果,任何想法?
编辑三个!
这是我用来填充数据表的原始和丑陋的查询。就像我说的那样,如果我在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
答案 0 :(得分:4)
我没有看到你在适配器的任何地方呼叫填充?
在那里应该有一行代码看起来像......
SqlDataAdapter da = new SqlDataAdapter("select * from courses", mySqlConnection);
da.Fill(ds);
此外,您需要将数据适配器的select命令设置为您要从数据库运行的sql语句。
答案 1 :(得分: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();
Populating a DataSet from a DataAdapter
<强> 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");
Populating a DataSet from a DataAdapter
更新前
填写代码中没有的数据集对象
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;