2 返信 最新の回答 日時: Dec 31, 2013 5:32 AM ユーザー:ranja

    FileMaker ODBC Client Driver 64bit版の不具合

    ranja

      概要

      FileMaker ODBC Client Driver 64bit版の不具合

      製品

      FileMaker Server

      バージョン

      Advanced 12

      オペレーティングシステムのバージョン

      Windows 2008R2

      問題の内容

      WindowsのC# (.NET Framework 4.0/4.5)からFileMaker ODBC Client Driverを使用してFileMaker Server Advancedのデータベースにアクセスした場合、SQLの実行結果の列情報を取得しようとすると、クライアントが64ビット環境の場合だけエラーが発生します。

      問題の再現方法

      具体的には、ASP.NETのWebFormのハンドラで次のようなコードを書いたとします。ここでTestODBCはファイルおよびテーブルの名前、MyServerはFileMaker Serverをホストしているマシン名です。Field1のフィールドタイプは数値です。


           protected void Page_Load(object sender, EventArgs e)
           {
                using (var conn = new System.Data.Odbc.OdbcConnection("DRIVER={FileMaker ODBC};Database=TestODBC;Server=MyServer;uid=admin;pwd="))
                {
                     conn.Open();
                     using (var cmd = conn.CreateCommand())
                     {
                          cmd.CommandText = "SELECT Field1 FROM TestODBC";
                          using (var reader = cmd.ExecuteReader())
                          {
                               while (reader.Read())
                               {
                                    var v = reader.GetDouble(0);//OK
                                    var n = reader.GetName(0);//64bit環境だとエラー
                                    System.Diagnostics.Debug.WriteLine(string.Format("{0}: {1}", n, v));
                               }
                          }
                     }
                }
           }

      reader.GetDouble(0)で、値を取得するところは問題ないのですが、列名を取得するreader.GetName(0)を呼び出したところで次のようなOdbcExceptionが発生します。エラーの具体的な内容を示す説明文はありません。
      [OdbcException (0x80131937)]
         System.Data.Odbc.OdbcConnection.HandleError(OdbcHandle hrHandle, RetCode retcode) +40
         System.Data.Odbc.OdbcDataReader.GetColAttributeStr(Int32 i, SQL_DESC v3FieldId, SQL_COLUMN v2FieldId, HANDLER handler) +543
         System.Data.Odbc.OdbcDataReader.GetName(Int32 i) +183
         WebApplication2.WebForm1.Page_Load(Object sender, EventArgs e) in c:\Users\Mitto\Documents\Visual Studio 2012\Projects\WebApplication2\WebApplication2\WebForm1.aspx.cs:25
         System.Web.UI.Control.LoadRecursive() +71
         System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3178

      コードを直接書くのではなく、フォーム上にSqlDataSourceコントロールを配置した場合も、上と同様にSystem.Data.Odbc.OdbcDataReader.GetColAttributeStr のところでエラーが発生するために、たとえばGridView等にデータベースのデータを一覧表示することができません。

      これは64ビット環境で実行したときのみ発生します。64ビットのPC上でもVisual Studioの開発サーバーを使用したり、IIS Expressを使用した場合は32ビット環境で実行されるらしく、エラーは発生しません。(Visual Studioは32ビットで動いているため。)IIS上に仮想ディレクトリを作成して実行した場合のみエラーになります。
      DataDirect 32-BIT SequeLink 5.5を使用していたときも問題はありませんでした。もっともこのときは32ビット版しかありませんでしたが。

      絶対にドライバの問題だという確実な証拠があるわけではありませが、今のところ一番疑わしいのはODBCドライバだと思います。
      よろしくお願いします。

      環境
      FileMaker ODBC: 12.03.103.00
      OS: Windows 2008R2 64bit
      FileMaker Server Advanced: 12.0.4.405
      .Net Framework: 4.0 or 4.5
      Visual Studio : 2012 or 2010 どちらでも同じ