1. ホーム
  2. データベース
  3. アクセス

Access データベースで、OleDbException (0x80004005) が発生しました。操作は更新可能なクエリを使用しなければなりません

2022-01-24 20:12:18
説明します。現在の Web リクエストの実行中に、処理されない例外が発生しました。エラーの詳細と、コードのどの部分でエラーが発生しているかについては、スタックトレース情報を確認してください。
例外の詳細です。System.Data.OleDb.OleDbException: 指定されたデータ・テーブルから削除できません。
ソースエラーです。
37行目:comm.CommandText = sqlstr;
38行目 //comm.Prepare();
39行目:cout = comm.ExecuteNonQuery()。
40行目
41行目:conn.Close()。
Source file: d:\SOVO acceptance code_BaseApp_CodeJetAccess.cs Line: 39
[OleDbException(0x80004005)。指定されたデータ・テーブルから削除できません]。
System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult) +267
System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult) +192
System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Object& executeResult) +48
System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior ビヘイビア、String メソッド) +106
System.Data.OleDb.OleDbCommand.ExecuteNonQuery() +108
JetAccess.Execute(OleDbParameter[] parameters, String sqlstr) in d:\SOVO acceptance codeBaseApp_CodeJetAccess.cs:39
NewsData.DeleteNews(Int32 id) in d:\SOVO acceptance codeBaseApp_CodeNewsData.cs:29
_Default.GridView1_RowDeleting(Object sender, GridViewDeleteEventArgs e) in d:\SOVO acceptance codeBaseSystem Filter.aspx.cs:46
System.Web.UI.WebControls.GridView.OnRowDeleting(GridViewDeleteEventArgs e) +133
System.Web.UI.WebControls.GridView.HandleDelete(GridViewRow row, Int32 rowIndex) +604
System.Web.UI.WebControls.GridView.HandleEvent(EventArgs e, Boolean causesValidation, String validationGroup) +1155
System.Web.UI.WebControls.GridView.RaisePostBackEvent(String eventArgument) +199
System.Web.UI.WebControls.GridView.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +7
System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +11
System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +174
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +5102
解決方法は以下の通りです。
データファイル*.mdbを右クリックして「プロパティ」ダイアログボックスを開き、「セキュリティ」タブにIUSR_XXX(XXXはマシン名)、つまりインターネットゲストアカウントを追加し、このアカウントの権限を読み取り可能、書き込み可能に設定する必要があります。(だから、問題を解決するのはとても簡単です、私のお尻 :) )
右クリックのプロパティダイアログで「セキュリティ」タブが見つからない場合は、フォルダオプションのビューから「簡易ファイル共有を使用する(デフォルト)」のチェックボックスを削除する必要があります。
原因
エラーの原因は大きく分けていくつかあります。
このエラーは、プログラムがデータベースの更新やそれに類する操作を行おうとしたときに発生します。この原因は
ADOはいくつかの理由により、データベースに書き込むことができません。
1. 最も一般的な理由は、匿名ユーザーアカウント (IUSR_MACHINE) がデータベースファイルへの書き込み権限を持っていないことです。
これを解決するには、Managerでデータベースファイルのプロパティを調整し、匿名ユーザーに正しいパーミッションを与えるようにします。
ACCESSデータベースを使用する場合、ファイルの書き込みだけでなく、ディレクトリの書き込みにもパーミッションを与えてください。
Jetはそのディレクトリに.ldbファイルを作成する必要があります。
2. 2つ目の理由は、データベースが正しいスキーマで開かれていないことです。以下の方法で開く必要があります。
SQL = "UPDATE Products Set UnitPrice = 2;"。
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Mode = 3 ''3 = adModeReadWrite
Conn.Open "myDSN"
Conn.Execute(SQL)を実行します。
Conn.Close(閉じる
なお、デフォルトのModeは0(adModeUnknown)に設定されており、更新が許可されています。
また、ODBCマネージャでこのDSNの読み取り専用オプションがチェックされている可能性もあります。
4. 2つのテーブルのフィールドを同時に更新している場合、このエラーメッセージも表示されます、解決策は、別々に更新することです。
解決策は、2つのテーブルのフィールドをそれぞれ別々に更新することです。
5.下位バージョン(ACCESS 2.0,ACCESS 7.0など)から上位バージョン(ACCESS 2000)に読み込んだテーブルを使う場合。
下位バージョン(例:ACCESS 2.0,ACCESS 7.0)から上位バージョン(ACCESS 2000)へクエリーを実行する際に発生するエラーです。