私はAccessデータベースで次のクエリを実行しています。 Accessで実行されたクエリは、正確な結果を返します。しかし、コードから実行すると、データベース内のすべての項目が返されます。たとえ日付範囲外の項目であっても、検索しています。MSアクセス、名前付きパラメータと列名
パラメータ名場合は、パラメータ名は、テーブルの列名と同じであるので、私は@FromDate
と@ToDate
するパラメータ名@StartDate
と@EndDate
を変更して、この問題を修正するので、問題だった場合、私は思っていました私は正しい結果を得ることができます。これは、私がこのパターンに取り組んでいるプロジェクトでは、全面的に複製されているからです。しかし、Id
(dbテーブルの列名)でレコードを更新するのに@Id
という名前のパラメータを使用していますが、これは問題なく動作しています。これは奇妙なエッジケースですか?誰もこの振る舞いについてどんな光を放つことができますか?
大量のコードサンプルの場合は申し訳ありませんが、この場合は全体の方法が必要だと思います。
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経由でそれらを行うことができます... –