- 締切済み
「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 & "'") どこか記述がおかしい所があるのでしょうか。ご教授よろしくお願いします。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- AlexSuns
- ベストアンサー率67% (78/115)
興味がわいたのでちょっとサンプル作成... 「じゃんぬねっと」さんのページを拝見しながら、書いたので参照リリース漏れは無いはず.... 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
お礼
AlexSunsさん、回答ありがとうございます。 >>app.OpenAccessProject(Accessファイルのパス) >と記述していますが、「Accessファイルのパス」の拡張子は"adp"ですか? >たぶん、「Accessファイルのパス」と記述しているので >app.OpenCurrentDatabase(Accessファイルのパス) >と記述しなければならないのでは? Accessファイルと書いてしまいましたが、プロジェクト(adp)でした。申し訳ありません。 クリスタルレポートも考えたのですが、現在私が持っているのがVisualStudio Standardで、 クリスタルレポートがついていないので、やむを得ずAccessのレポートを使おうと思ったのです。 それで、早速試してみたところ、Access2003が入っているパソコンだとレポートを見ることができました。 ところが、Access2000のパソコンだとやはり「AccessViolationException」と出てしまいます。 Accessのバージョンの違いによるものなのでしょうか。
補足
自己解決しました。 「じゃんぬねっと」さんのページが参考になりました。 レポートを開く前に、Accessへ接続していたことが原因だったようです。切断したらAccess2000でも表示されました。 ただ、なぜAccess2003なら大丈夫で、Access2000のときは駄目だったのかはわかりませんが。 AlexSunsさん、ありがとうございました。