• 締切済み

「AccessViolationException」と出てしまい、困っています

VisualBasic2005でプログラミングしているのですが、 フォームからAccessのレポートを開こうとしたら、 「System.AccessViolationException」というメッセージが出てしまい、 レポートが表示されません。 Dim app As New Access.Application app = New Access.ApplicationClass() app.OpenAccessProject(Accessファイルのパス) app.DoCmd.OpenReport("レポート", Access.AcView.acViewPreview, , "[番号]='" & txt_No.Text & "'") どこか記述がおかしい所があるのでしょうか。ご教授よろしくお願いします。

みんなの回答

  • AlexSuns
  • ベストアンサー率67% (78/115)
回答No.1

興味がわいたのでちょっとサンプル作成... 「じゃんぬねっと」さんのページを拝見しながら、書いたので参照リリース漏れは無いはず.... COM オブジェクトの参照カウントを解放する http://jeanne.wankuma.com/tips/programing/releasecom.html このサンプルはレポートを表示してから、10秒でアクセスごと終了します そこらへんは工夫が必要ですw 普通にクリスタルレポートを使用したほうが、もうちょっとスマートにいけそうですね あと、気になったのは >app.OpenAccessProject(Accessファイルのパス) と記述していますが、「Accessファイルのパス」の拡張子は"adp"ですか? たぶん、「Accessファイルのパス」と記述しているので app.OpenCurrentDatabase(Accessファイルのパス) と記述しなければならないのでは? 開発環境:WindowsXP+VB2005+Access2003 ※ちなみにWindowsVista+VB2005+Access2007でやったら、セキュリティがうんたらかんたら('A`)マンドクセ Imports Microsoft.Office.Interop Imports System.Runtime.InteropServices Imports System.IO Public Class Form1   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click     Dim acApp As Access.Application = Nothing     Try       acApp = New Access.Application       Dim filePath As String = Path.Combine( _         Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), _         "db1.mdb")       If (File.Exists(filePath)) Then         acApp.OpenCurrentDatabase(filePath)         acApp.Visible = True         Dim doCmd As Access.DoCmd = acApp.DoCmd         Try           Dim reportName As String = "testReport"           doCmd.OpenReport(reportName, Access.AcView.acViewPreview)           System.Threading.Thread.Sleep(10 * 1000)         Finally           Marshal.ReleaseComObject(doCmd)         End Try         acApp.CloseCurrentDatabase()       Else         Dim message As String = String.Format("指定されたファイルは存在しません「{0}」", filePath)         MessageBox.Show(Me, message, "IO Error", MessageBoxButtons.OK, MessageBoxIcon.Warning)       End If     Finally       If Not acApp Is Nothing Then         Try           acApp.Quit()         Finally           Marshal.ReleaseComObject(acApp)         End Try       End If     End Try   End Sub End Class

mnk
質問者

お礼

AlexSunsさん、回答ありがとうございます。 >>app.OpenAccessProject(Accessファイルのパス) >と記述していますが、「Accessファイルのパス」の拡張子は"adp"ですか? >たぶん、「Accessファイルのパス」と記述しているので >app.OpenCurrentDatabase(Accessファイルのパス) >と記述しなければならないのでは? Accessファイルと書いてしまいましたが、プロジェクト(adp)でした。申し訳ありません。 クリスタルレポートも考えたのですが、現在私が持っているのがVisualStudio Standardで、 クリスタルレポートがついていないので、やむを得ずAccessのレポートを使おうと思ったのです。 それで、早速試してみたところ、Access2003が入っているパソコンだとレポートを見ることができました。 ところが、Access2000のパソコンだとやはり「AccessViolationException」と出てしまいます。 Accessのバージョンの違いによるものなのでしょうか。

mnk
質問者

補足

自己解決しました。 「じゃんぬねっと」さんのページが参考になりました。 レポートを開く前に、Accessへ接続していたことが原因だったようです。切断したらAccess2000でも表示されました。 ただ、なぜAccess2003なら大丈夫で、Access2000のときは駄目だったのかはわかりませんが。 AlexSunsさん、ありがとうございました。

関連するQ&A