0 返信 最新の回答 日時: Apr 29, 2013 8:00 PM ユーザー:chaos1234

    ODBC経由でオブジェクトフィールドの参照(SQL)について

    chaos1234

      タイトル

      ODBC経由でオブジェクトフィールドの参照(SQL)について

      フォーラムに投稿

           ODBCを利用して、外部プログラム(C#)からSQLを使用しての参照についての質問です。

            

           環境

            OS:WindowsServer2003

            SV:FileMakerServer10

            CL:FileMakerPro11

            C#:.NET 3.5 

            ODBC:DataDirect SequeLink 5.5

            

           目的

            FileMakerのオブジェクトフィールドに登録したPDFファイルを、外部プログラム(C#)からODBCを使いSQLでファイル取得を行う。

            取得したファイルはいったんローカルに保存し、FTP経由でWebサーバーにファイルアップロードを行う。

           問題

            オブジェクトフィールドにPDFファイルを登録する際、登録方法が2通りあります。

             1.「オブジェクトの挿入」(またはドロップ)で登録する。(FileMaker上で閲覧可能)

             2.「ファイルの挿入」で登録する。(エクスポートしないと閲覧できない)

            上記のうち、SQLで取得した際なのですが、1.の方法で登録したファイルはローカルに一時保存した際、

            PDFとして閲覧できない(バイナリファイルの形式が変わってしまっている)という状態です。

            2.の方法では、すんなり取得し、ローカルに保存すればPDFとして閲覧が出来る状態です。

           質問

            1.の「オブジェクトの挿入」で登録した場合に、元のPDFファイル形式のままバイナリデータを

            取得することは可能でしょうか?

            SQLのSELECTの仕方を工夫しなくてはならないのか?と思っておりますが、多方面へ検索しても

            解決策が見当たりませんでした。

            仕様上、「オブジェクトの挿入」では、SQLで取得できないという結論になれば、現在登録している

            ファイルをすべて「ファイルの挿入」で登録しなおそうと思っております。

            以上、もしわかる方がいらっしゃれば、ご助言お願い致します。

            

           以下サンプルソース(C#)

            

                   public void sample()
                   {
                       String sql = "SELECT PDF_FILE FROM PDF_TABLE WHERE ID = 1";
            
                       OdbcConnection conn = new OdbcConnection("DRIVER=DataDirect 32-BIT SequeLink 5.5; UID=User; PWD=password; HST=localhost; PRT=2399; SDSN=pdf;");
                       conn.Open();
            
                       // ODBCコマンドを生成
                       OdbcCommand command = new OdbcCommand(sql, conn);
                       command.CommandType = CommandType.Text;
            
                       // SQL発行してデータを取得
                       OdbcDataReader reader = command.ExecuteReader();
            
                       if (reader.Read())
                       {
                           Byte[] b = (byte[])reader.GetValue(0);
            
                           if (b.Length > 0)
                           {
                               File.WriteAllBytes(@"D:\temp\temp.pdf", b);
                           }
                       }
                   }