none
[System.Data.OleDb.OleDbException: 不明]の件 RRS feed

  • 質問

  • お疲れ様です。David Lauです。

    いま、Windows Formsアプリの開発はしています。今日はお客様からのフィードバックですが、アプリがエラーは発生してしまいました。テスト環境でアプリがうまく動きましたが、お客様のPCは何でエラーが発生しますか?いろいろ調査しましたが、まだ原因はわからないです。
    皆さんは、誰か教えてくださいませんか?

    ■環境:
    ・Win2000 SP4
    ・.net framework 1.1
    ・DBはMicrosoft Access 2000
    ・VB.NET 2003

    ■エラー情報:
    2007-04-13 16:45:02,476 System.Data.OleDb.OleDbException: 不明
    at System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(Int32 hr)
    at System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult)
    at System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult)
    at System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Object& executeResult)
    at System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method)
    at System.Data.OleDb.OleDbCommand.ExecuteReader(CommandBehavior behavior)
    at System.Data.OleDb.OleDbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior)
    at System.Data.Common.DbDataAdapter.FillFromCommand(Object data, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
    at System.Data.Common.DbDataAdapter.Fill(DataTable dataTable, IDbCommand command, CommandBehavior behavior)
    at System.Data.Common.DbDataAdapter.Fill(DataTable dataTable)
    at MIGRATE.ADP.RunSqlFillDataTbl(String strSql, DataTable& dtTbl)
    --- 内部例外スタック トレースの終わり ---
    at MIGRATE.ADP.RunSqlFillDataTbl(String strSql, DataTable& dtTbl)
    at MIGRATE.frmMigrate.sbInitComboBox()
    at MIGRATE.frmMigrate.frmMigrate_Load(Object sender, EventArgs e)

    ■補足説明:
    (1)ログを見て、MDBファイルとの接続が成功にできましたが、その後のSelect SQLを実行するとき、上記のエラーは発生します。また、そのエラーが再現できます。
    (2)お客様のPCには、Microsoft Accessがインストールしていない。
    (3)お客様のPCには、MDAC 2.8 SP1をインストールしました。

    以上、よろしくお願いいたします。

    2007年4月13日 9:06

すべての返信

  • David Lauです。

    上記の件ですが、今も調査中ですから、まだ解決されていないです。

    今日は、SQLとエラーコードなどの情報をが取得したので、下記になりします。

    2007-04-18 10:41:58,283 [ERROR]OleDbExceptionからのエラー情報:
    [Error Code = -2147217900]
    [Index = 0][Message = 不明][Native Error = -524553244][Source = Microsoft JET Database Engine][SQL State = 3075]

    2007-04-18 10:41:58,654 [ERROR][UnknownException]System.Data.OleDb.OleDbException: 不明
       at System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(Int32 hr)
       at System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult)
       at System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult)
       at System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Object& executeResult)
       at System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method)
       at System.Data.OleDb.OleDbCommand.ExecuteReader(CommandBehavior behavior)
       at System.Data.OleDb.OleDbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior)
       at System.Data.Common.DbDataAdapter.FillFromCommand(Object data, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
       at System.Data.Common.DbDataAdapter.Fill(DataTable dataTable, IDbCommand command, CommandBehavior behavior)
       at System.Data.Common.DbDataAdapter.Fill(DataTable dataTable)
       at MIGRATE.ADP.RunSqlFillDataTbl(String strSql, DataTable& dtTbl)
       --- 内部例外スタック トレースの終わり ---
       at MIGRATE.ADP.RunSqlFillDataTbl(String strSql, DataTable& dtTbl)
       at MIGRATE.frmMigrate.sbInitComboBox()
       at MIGRATE.frmMigrate.frmTmigrate_Load(Object sender, EventArgs e)

    SQLは、下記になります:
    2007-04-18 10:41:57,652 SELECT MID(CHUKAKU_CITY_CD,1,2) AS CODE,
           MID(CHUKAKU_CITY_CD,1,2) & '.' & CHUKAKU_CITY_NAME AS NAME
      FROM GK_CHUKAKU_CITY
     WHERE START_DT < FORMAT(DATE(),'YYYYMMDD')
       AND END_DT > FORMAT(DATE(),'YYYYMMDD')
       AND DEL_FLG = '0'
       AND MID(CHUKAKU_CITY_CD,3) = '0000'
     ORDER BY CHUKAKU_CITY_CD

    以上、よろしくお願いいたします。
    2007年4月18日 7:36
  •  David Lau さんからの引用
    2007-04-18 10:41:58,283 [ERROR]OleDbExceptionからのエラー情報:
    [Error Code = -2147217900]
    [Index = 0][Message = 不明][Native Error = -524553244][Source = Microsoft JET Database Engine][SQL State = 3075]

    3075 というと、Jetエンジンが SQL構文エラーを報告するときのエラーコードですね。
    Message が不明なのでエラーの理由はわかりませんが、たとえば『演算子がありません』エラーとか『日付の構文エラーです』エラーとか『カンマがありません』エラーなどです。

     

    過去の経験から言うと……SQL 中に全角空白が混入していたりとか。
    「"」や「'」や「|」などの特殊文字の処理に問題があったりとか。
    数値型と文字列型を比較しようとして失敗していたりとか。
    日付型リテラルの書式(#mm/dd/yyyy#)を間違えていた場合とか。


     David Lau さんからの引用
    SQLは、下記になります:
    2007-04-18 10:41:57,652 SELECT MID(CHUKAKU_CITY_CD,1,2) AS CODE,
           MID(CHUKAKU_CITY_CD,1,2) & '.' & CHUKAKU_CITY_NAME AS NAME
      FROM GK_CHUKAKU_CITY
     WHERE START_DT < FORMAT(DATE(),'YYYYMMDD')
       AND END_DT > FORMAT(DATE(),'YYYYMMDD')
       AND DEL_FLG = '0'
       AND MID(CHUKAKU_CITY_CD,3) = '0000'
     ORDER BY CHUKAKU_CITY_CD

    START_DT  や END_DT の型がわからないので確かなことは言えませんが、ざっと見た限りでは、私には SQL の構文異常は見つけられませんでした。

    考えられるとすれば、比較条件の左右で型が異なっている場合とか、Jet の SandBox モードが有効になっている場合でしょうか。

    http://support.microsoft.com/kb/239482/ja


    まずは、問題を切り分けるために、

    1. SELECT 句の中身を「*」だけにする。
    2. WHERE 句を除去する。

    などの単純化した SQL を試してみて、SELECT 句と WHERE 句のいずれに(あるいは両方に)問題があるのかを調査してみては如何でしょう。

    2007年4月18日 8:42
  • 魔界の仮面弁士

    ご回答、どうもありがとうございます。

    下記は、補足です。

    >考えられるとすれば、比較条件の左右で型が異なっている場合とか、Jet の SandBox モードが有効になっている場合でしょうか。
    >
    >http://support.microsoft.com/kb/239482/ja
    【回答】
    比較条件の左で型が「テキスト」ですから、比較条件の左右で型が同じだと思っております。
    Jet の SandBox モードについては、今分かっていないので、調査します。

    >まずは、問題を切り分けるために、
    >
    >   1. SELECT 句の中身を「*」だけにする。
    >   2. WHERE 句を除去する。
    >
    >などの単純化した SQL を試してみて、SELECT 句と WHERE 句のいずれに(あるいは
    >両方に)問題があるのかを調査してみては如何でしょう。
    【回答】
    はい。お客様と調整の上で、本件を調査して、結果を報告します。

    ご指導、どうもありがとうございます。

    2007年5月8日 1:19
  • 魔界の仮面弁士

    (1)SandBoxModeについて
    \\HKEY_LOCAL_MACHINE\Software\Microsoft\Jet\4.0\engines\SandboxMode = 2


    「2」とは、「 Sandbox モードは Access 以外のアプリケーションに対して使用されますが、Access アプリケーションに対しては使用されません。これがデフォルトの値です。」です。
    これは問題ないと思っております。

    (2)SQLテスト結果
    A:SELECT * FROM GK_CHUKAKU_CITY
    ⇒実行結果:OK

    B:SELECT * FROM GK_CHUKAKU_CITY ORDER BY CHUKAKU_CITY_CD
    実行結果:NG。 エラーは下記になります:
    System.Data.OleDb.OleDbException: 不明
    at System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(Int32 hr)
    at System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult)
    at System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult)
    at System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Object& executeResult)
    at System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method)
    at System.Data.OleDb.OleDbCommand.ExecuteReader(CommandBehavior behavior)
    at System.Data.OleDb.OleDbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior)
    at System.Data.Common.DbDataAdapter.FillFromCommand(Object data, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
    at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
    at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet)

    C: SELECT *
        FROM GK_CHUKAKU_CITY
    WHERE START_DT < FORMAT(DATE(),'YYYYMMDD')
    AND END_DT > FORMAT(DATE(),'YYYYMMDD')
    AND DEL_FLG = '0'
    AND MID(CHUKAKU_CITY_CD,3) = '0000'
    ⇒実行結果:NG。エラーは上記と同じ。

    D: SELECT MID(CHUKAKU_CITY_CD,1,2) AS CODE,
    MID(CHUKAKU_CITY_CD,1,2) & '.' & CHUKAKU_CITY_NAME AS NAME
    FROM GK_CHUKAKU_CITY
    ⇒実行結果:NG。エラーは上記と同じ。

    以上の結果がおかしいですが、原因はわからないです。
    誰か教えて頂けませんか?

    以上。
    2007年5月9日 5:19
  • なぜか MSDN フォーラムを無視して @IT 会議室の方にマルチポストされているようなので、
    情報共有のためにリンクしておきます。

    http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=38286&forum=7

    いくつか気になった部分がありますので、少し書いておきます。

    1. > System.Data.OleDb.OleDbException: 不明

      この「不明」の部分を省略しないで正しくコピーしてください。ここが一番重要なヒントになっているはずなので。

    2. SandBox モードが怪しいと思います。

      「2」とは、「 Sandbox モードは Access 以外のアプリケーションに対して使用されますが、Access アプリケーションに対しては使用されません。これがデフォルトの値です。」です。
      これは問題ないと思っております。

      今回のシステムは「 Access 以外のアプリケーション」なのですから、SandBox モードが有効になっているのではないでしょうか。

    2007年5月9日 8:47
  • 今更感が漂いますが、ふと思いついたので投稿。

     

     David Lau さんからの引用

    A:SELECT * FROM GK_CHUKAKU_CITY
    ⇒実行結果:OK

    B:SELECT * FROM GK_CHUKAKU_CITY ORDER BY CHUKAKU_CITY_CD
    実行結果:NG。 エラーは下記になります:

     

    ORDER BY や WHERE が原因で失敗するという事は、もしかしたら

    mdb のロケール/照合順序に問題があったのかも知れません。


     

    照合順序が異なっていると、ORDER BY や WHERE の結果が変化したり、

    OS環境との組み合わせ次第では、照合順序絡みのエラーになることがあるようなので。
    http://hpcgi1.nifty.com/MADIA/VBBBS2/wwwlng.cgi?print+200710/07100057.txt
    http://support.microsoft.com/kb/184988/en-us
    http://support.microsoft.com/kb/404931/ja

    2008年1月17日 14:28