我有以下查询,我在Access数据库上执行。该查询在Access中运行时会返回准确的结果。但是,当从代码运行时,我会返回数据库中的所有项目,即使那些超出我所搜索日期范围的项目也是如此。MS Access,命名参数和列名称
如果问题是因为参数名称是一样的,在表中的列名,所以我改变了参数名称@StartDate
和@EndDate
是@FromDate
和@ToDate
这解决了问题,我想知道,如果参数名称是不同的我得到正确的结果集。这关系到我,因为我在这个模式上工作的项目遍布各处。不过,我使用名为@Id
的参数来更新Id
(db表中的列名)的记录,并且工作正常。这是一个奇怪的边缘情况吗?任何人都可以阐明这种行为。
大量代码示例的道歉,但在这种情况下,我认为整个方法是必要的。
public override AcademicCycleTransportCollection FetchForDateRange(DateTime startDate, DateTime endDate) {
const String query =
"PARAMETERS \n" +
" @StartDate DATE, \n" +
" @EndDate DATE \n" +
" ; \n" +
"SELECT \n" +
" [AcademicCycle].[Id] AS [Id], \n " +
" [AcademicCycle].[Name] AS [Name], \n " +
" [AcademicCycle].[AcademicCycleCategoryId] AS [AcademicCycleCategoryId], \n " +
" [AcademicCycle].[ParentAcademicCycleId] AS [ParentAcademicCycleId], \n " +
" [AcademicCycle].[StartDate] AS [StartDate], \n " +
" [AcademicCycle].[EndDate] AS [EndDate], \n " +
" [AcademicCycle].[IsPerpetual] AS [IsPerpetual], \n " +
" [AcademicCycle].[IsLocked] AS [IsLocked] \n " +
"FROM \n" +
" AcademicCycle \n" +
"WHERE \n" +
" (StartDate <= @EndDate AND EndDate >= @StartDate) OR \n" +
" IsPerpetual <> 0";
AcademicCycleTransportCollection transportCollection = new AcademicCycleTransportCollection();
OleDbCommand _fetchForDateRangeCommand = null;
if (_fetchForDateRangeCommand == null) {
OleDbConnection connection = _parentDataConnection.Connection;
_fetchForDateRangeCommand = new OleDbCommand(query, connection);
_fetchForDateRangeCommand.Parameters.Add("@StartDate", OleDbType.Date);
_fetchForDateRangeCommand.Parameters.Add("@EndDate", OleDbType.Date);
}
_fetchForDateRangeCommand.Transaction = _parentDataConnection.Transaction;
_fetchForDateRangeCommand.Parameters["@StartDate"].Value = startDate;
_fetchForDateRangeCommand.Parameters["@EndDate"].Value = endDate;
using (OleDbDataReader dbReader = _fetchForDateRangeCommand.ExecuteReader()) {
NullableDataReader reader = new NullableDataReader(dbReader);
while (reader.Read()) {
AcademicCycleTransport transport = FillTransport(reader);
transportCollection.Add(transport);
}
if (!reader.IsClosed) {
reader.Close();
}
}
return transportCollection;
}
这不会是一个可以接受的解决方案,我们希望使用命名参数进行一般的易用性。至于linq ...有没有linq访问?我认为有一个第三方的解决方案,如何做更新和插入到您的数据库,你可以通过LINQ做到这一点... – 2011-02-02 10:41:42