C# MVC中Access查询无结果问题排查求助
排查C# MVC中Access查询无结果的问题
先看你代码里最核心的错误——读取数据的逻辑用错了:你用了while (reader.NextResult()),但这个方法是用来切换到下一个结果集(比如一次执行多个SELECT语句时),而你的查询只有一个结果集,应该用reader.Read()来逐行读取记录。这直接导致你的sheets列表一直是空的,所以视图没有数据。
修正后的核心代码
同时我帮你优化了SQL注入风险和日期格式问题(参数化查询更安全也更可靠):
public ActionResult MissingChecksheets(string startDate, string endDate, string machine) { var sheets = new List<Checksheet>(); // 明确指定需要的列,比*更高效,也避免列顺序变化导致的问题 var query = @"SELECT [Order Item], [PartNum] FROM [TrackingLog] WHERE [TrackingLog].[Workcenter] = ? AND [TrackingLog].[Complete Date] > ? AND [TrackingLog].[Complete Date] < ? AND [TrackingLog].[Order Item] NOT IN (SELECT [OrderNum] FROM [dbo_Checksheet])"; using (var con = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Checksheets.accdb;")) { using (var command = new OleDbCommand(query, con)) { // OleDb参数是按顺序匹配的,注意和查询里的?顺序对应 command.Parameters.AddWithValue("@machine", machine); // 先把字符串日期转成DateTime,避免格式不兼容问题 if (!DateTime.TryParse(startDate, out DateTime startDt) || !DateTime.TryParse(endDate, out DateTime endDt)) { // 处理日期格式错误的情况,比如返回空列表或提示 return PartialView(sheets); } command.Parameters.AddWithValue("@startDate", startDt); command.Parameters.AddWithValue("@endDate", endDt); con.Open(); using (var reader = command.ExecuteReader()) { // 用reader.Read()逐行读取单结果集的记录 while (reader.Read()) { sheets.Add(new Checksheet { OrderNum = reader["Order Item"].ToString(), PartNum = reader["PartNum"].ToString() }); } } } } return PartialView(sheets); }
其他需要排查的细节
- 权限问题:确认你的应用程序池身份对
C:\Checksheets.accdb文件有读写权限,有时候路径正确但权限不足会导致查询无响应或返回空。 - 列名匹配:确保
TrackingLog表里的PartNum列名正确,以及Checksheet类的属性和查询返回的列对应。 - 查询逻辑验证:可以把替换了参数值的SQL放到Access里重新测试,确认确实有符合条件的记录返回。
内容的提问来源于stack exchange,提问作者techindustry
相关产品推荐
相关产品推荐

