У меня есть следующий запрос, который я выполняю в базе данных 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 ... –