Delphi 2005 で、いくつかの場所でTADOQuery
コンポーネントを使用するプログラムがありCalQuery
ます。接続 はCalCon
、Access *.mdb ファイル (Access 2003 で作成) に接続します。
今日まで正常に動作していましたが、突然動作しなくなりました。本体が で何かをしようとすると、アクセス違反が発生しCalQuery
ます。コードの例を以下に示しますが、これは同じフォーム全体で発生します。CalQuery
他のユニットの同じデータベースに接続するandのコピーでは発生していないようですCalCon
(このユニットと他のユニットの間で私が行ったことの違いはわかりません)。
if (PatientGrid.RowCount = 2) and (PatientGrid.ColCount = 1) then
begin
if DayGrid.Cells[7, DayGrid.Row] = 'New' then
begin
if DayGrid.Cells[5, DayGrid.Row] = '' then
begin
CalCon.Open();
CalQuery.SQL.Clear;
CalQuery.SQL.Text := 'SELECT ClinicID FROM Clinic WHERE RoomNo = '+DayGrid.Cells[0, DayGrid.Row]+' '+
'AND [Date] = '+OldDateForSQL(DayViewDP.Date);
CalQuery.Open;
CalQuery.First;
ClinicID := CalQuery.FieldByName('ClinicID').Value;
CalQuery.Close;
CalQuery.SQL.Clear;
CalQuery.SQL.Text := 'SELECT SlotID FROM Slot WHERE ClinicID = '+IntToStr(ClinicID)+' '+
'AND AppTime = CStr('+QuotedStr(DayGrid.Cells[8, DayGrid.Row])+')';
CalQuery.Open;
CalQuery.First;
SlotID := CalQuery.FieldByName('SlotID').Value;
CalQuery.Close;
CalQuery.SQL.Clear;
CalQuery.SQL.Text := 'INSERT INTO Appointment (SlotID, ClinID, HospNo, Name) '+
'VALUES ('+IntToStr(SlotID)+', '+IntToStr(ClinicID)+', '+QuotedStr('XXXXXX')+
', '+QuotedStr(PatientGrid.Cells[0,1])+')';
CalQuery.ExecSQL;
CalCon.Close;
RefreshDayGrid(Sender);
end else ShowMessage('A patient is already booked into that slot.');
end else ShowMessage('You can only book new slots manually. Please book follow-ups from PiMS.');
end;
(すべてのグリッドは DBGrid ではなく StringGrid です。)
でアクセス違反が発生しましたCalQuery.SQL.Clear;
。この行をコメントアウトすると、次でクラッシュします。私が言ったように、コードは今まで機能しており、すべてが適切に宣言されているようです. 正確なエラーは次のとおりです。
モジュール 'PainCal.exe' のアドレス 004A91D4 でアクセス違反が発生しました。アドレス 00000260 の読み取り。
私は接続先のデータベースで作業していましたCalCon
が、テーブルのみでした (すべてのデータを消去する必要があり、autonum フィールドをリセットする必要があったため、いくつかのテーブルを削除して再作成しました)。接続文字列を再構築しようとしましCalCon
たが、それは役に立ちませんでした。データベースファイルは問題ないようです。
これは私が以前に遭遇したものではなく、他の場所でも同様の質問が見られないため、次に何を確認すればよいかわかりません.