我在C#MVC上使用以下Access查询来比较两个表并返回属于用户选择的日期范围和机器的记录。查询代码在实际的Access数据库上运行完美,但我想连接字符串和返回结果的代码有问题。我不确定代码有什么问题,如果有人能帮我确定错误,我将不胜感激。谢谢!
C#MVC控制器代码:
public ActionResult MissingChecksheets(string startDate, string endDate, string machine)
{
var query = $@"SELECT * FROM [TrackingLog]
WHERE [TrackingLog].[Workcenter] = '{machine}' AND
[TrackingLog].[Complete Date] > #{startDate}# AND
[TrackingLog].[Complete Date] < #{endDate}# AND
[TrackingLog].[Order Item] NOT IN (SELECT [OrderNum] FROM [dbo_Checksheet])";
var sheets = new List<Checksheet>();
using (var con = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Checksheets.accdb;"))
{
using (var command = new OleDbCommand(query, con))
{
con.Open();
using (var reader = command.ExecuteReader())
{
while (reader.NextResult())
{
sheets.Add(new FabChecksheet
{
OrderNum = reader.GetString(0),
PartNum = reader.GetString(1)
});
}
}
}
}
return PartialView(sheets);
}
答案 0 :(得分:1)
SELECT
语句,而不计算聚合函数内的SELECT
),则用于在结果集之间移动的 OleDbDataReader.NextResult()
方法。由于您的查询具有单个结果集,因此必须使用OleDbDataReader.Read()
在记录之间移动:
using (var con = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Checksheets.accdb;"))
{
using (var command = new OleDbCommand(query, con))
{
con.Open();
using (var reader = command.ExecuteReader())
{
// Only single result set, use 'Read' here
while (reader.Read())
{
sheets.Add(new FabChecksheet
{
OrderNum = reader.GetString(0),
PartNum = reader.GetString(1)
});
}
}
}
}
请注意,如果使用NextResult()
,数据阅读器将移至下一个包含空数据的结果集。
相关问题:
Difference between SqlDataReader.Read and SqlDataReader.NextResult