2009-05-14 41 views
14

私はMicrosoft.Jet.OLEDB.4.0とMicrosoft.ACE.OLEDB.12.0を使用して、.csv、.xls、および.xlsxファイルを読み込んでいます。64ビットモードではOleDBはサポートされていませんか?

これらの技術のいずれもネイティブ64ビットモードでサポートされていないことがわかりました。

私は2つの質問があります:

  1. にサポートされている方法は、プログラム的に64ビットモードで.CSV、.XLS、および の.xlsxファイルを読み取る何ですが。私はちょうど これに対する答えを見つけることができません。

  2. 私はすべての3つのファイル 種類を読み込むことができない場合は、64ビット 環境での.csvファイルで を読むための最良の方法は何ですか?

注:

  • 私は(3.5p1)
  • これは、シュリンクラップアプリです.NETを使用しています。再配布は という重要な要素です。

アップデート:私は動作しますが、望ましいことではない32ビットモードで実行するアプリケーションを強制的にCorFlagsを使用することができます

答えて

7

ここでは何をするかについての説明ですabout deprecated MDAC。私は と.XLS .MDB(

これらのジェット新規または変換された アプリケーションは、Microsoft Office 2003およびそれ以前のファイルを使用するつもりジェット を継続して使用することができます...答えは非常に満足ではないかと思います)非プライマリデータ用 ストレージ。ただし、これらの アプリケーションの場合、 Jetから2007 Office システムドライバに移行する必要があります。 2007 Office System Driverをダウンロードすることができます。 は、Office 2003(.mdbおよび.xls)またはOffice 2007(* .accdb、* .xlsm)のいずれかの既存ファイルを 既存のファイルとの間で読み書きすることができます。 、* .xlsx、 * .xlsb)のファイル形式。重要具体的な使用方法については、 の制限については、2007 Office Systemのエンドユーザー ライセンス契約をお読みください。

注:SQL Serverアプリケーションも アクセスの2007 Officeシステム、およびそれ以前の 、SQL Serverの 異種データ接続と 統合サービス機能からファイルをすることができます だけでなく、2007 Office Systemの ドライバを介して。さらに、64ビットSQL サーバーアプリケーションは、32ビットSQL Server 64ビットの WindowsのIntegration Services(SSIS)を使用して、 32ビットJetおよび2007 Office System ファイルにアクセスできます。

+1

2007 Office System Driverのように見えます。しかし、25MBのダウンロードは少し急である。 –

+0

2007年のOffice System Driverは、JETを置き換えるのではなく、実際にx64であることはわかりません。 –

+0

MSSQL x64のリンクサーバーとしてSharePointを追加しようとすると、この制限に遭遇したので、間違いなくx86です。 OPには当てはまりませんでしたが、私はそれを回避するために、Oledbソースにリンクされた別のx86インスタンスをインストールし、それを複数のビューとx86インスタンスにリンクされたx64インスタンスでラップしました。 – Josh

1

実際、私はLinqがこのためのあなたの最善の解決策だと思います。

何か

IEnumerable<MyObj> ObjList = GetObjList(yourCSVFileNAme); 

var qry = from o in ObjList 
      where o.MyField == Something 
      select o; 

とあなたのGetObjList方法

....のように

Public IEnumerable<MyObj> GetObjList(string filename) 
{ 
    // Obvioulsly you would have some actual validation and error handling 
    foreach(string line in File.ReadAllLines(filename)) 
    { 
    string[] fields = line.Split(new char[]{','}); 
    MyObj obj = new MyObj(); 
    obj.Field = fields[0]; 
    obj.AnotherField = int32.Parse(fields[1]); 
    yield return obj; 
    } 
} 
+0

ありがとうTim!私は「自分の」CSV解析ソリューションを使うのを避けることを望んでいました。ロケット科学ではないことは分かっていますが、時には驚くほど微妙です。 –

+2

CSVファイルをパースするのは簡単ではありません(カッコ内のテキスト、ロケールごとの区切り文字...など)がありますが、そこには多くのCSVパーサがあります。 – VVS

4

のようになります主な問題は、Jet DBMSは、呼び出し側のプロセスにロードされる32ビットのライブラリであるということです64ビットモードではアプリケーション内からJetを直接使用することはできません。 Timが述べたように、独自のcsvパーサーを書くこともできますが、これは縮小ラップアプリなので、より幅広いフォーマットを扱うことができます。幸運なことに、32ビットアプリケーションを話すにはいくつかの方法があります。そのため、引き続きJetを使えます。

32ビットモードでのみ動作するようにマークされた小さなexeを書きます。このexeは、読み込むファイルの名前と書き込む一時ファイルの名前のコマンドライン引数をとります。 Jetを使用してcsv/xlsをロードし、配列の配列にデータを格納し、xmlシリアライザを使用してデータを一時ファイルに書き込みます。

私はCSV/XLSファイルを変換/ロードする必要があるときに、私は次の操作を行います:

object[][] ConvertFile(string csvOrXlsFile) 
{ 
    var output = System.IO.Path.GetTempFileName(); 
    try 
    { 
     var startinfo = new System.Diagnostics.ProcessStartInfo("convert.exe", 
      string.Format("\"{0}\" \"{1}\"", csvOrXlsFile, output)); 

     System.Diagnostics.Process proc = new System.Diagnostics.Process(); 
     proc.StartInfo = startinfo; 

     proc.Start(); 
     proc.WaitForExit(); 

     var serializer = new System.Xml.Serialization.XmlSerializer(typeof(object[][])); 
     using (var reader = System.IO.File.OpenText(output)) 
      return (object[][])serializer.Deserialize(reader); 
    } 
    finally 
    { 
     if (System.IO.File.Exists(output)) 
      System.IO.File.Delete(output); 
    } 
} 
+1

私はこのオプションが好きです。できるだけきれいなものを保ちます。フラットファイルを内部データオブジェクトに変換するためにx64を実行する必要があることはめったにありません。ただし、内部データオブジェクトにデータを格納した後は、x64を活用したいと考えています。 – Nate

4

あなたは、フラットファイルの解析のためのFileHelpersライブラリを試みることができます。驚くほどうまく動作します。

+0

ありがとうございましたChristopher ...私はFileHelpersを検討しましたが、LGPLはまだ商用コードベースに私が教えてくれる限り望ましくありません。 –

+0

Excelファイルを処理するFileHelpersのソースコードによれば、AdoDB 32bitアプリに制限されています。追加情報については、ExtractDataTable関数を参照してください。 –

+0

@AlexanderNソースコードは表示されませんが、Excelファイルを読み込むために64ビットアプリケーションを試してみましたが、完全に動作します。 Adoを使用している私自身の古いコードで同じ問題が例外をスローします。 – Samuel

3

は、.csv/.xls/.xlsxブック(およびmore)を読み書きでき、64ビット.NET 2.0以降をサポートします。 SpreadsheetGearは、シュリンクラップアプリケーションでロイヤリティフリーで配布することができます。

アプリケーションがWinFormsであるかASP.NETであるかは指定されていませんが、SpreadsheetGearはいずれかで動作します。ライブASP.NET(C#& VB)のサンプルhere、WinFormsサンプルhereについて学び、無料トライアルhereをダウンロードしてみてください。

免責事項:私は、各ドライバの32ビットおよび64ビットのバージョンがありますスプレッドシートギア社

+0

面白いジョーと聞こえます。ありがとう! –

2

これは、この問題が発生している可能性があります(自分自身については、私も同じ問題があり、解決策を覚えていません.-)) これはあまり知られていませんが、数時間のストレスがありますので、他人を助けてくれるかもしれません...これが繰り返される(見つからなかった)か廃止された(残念ながら最新で偉大なものはない)人は残念です。

Jet 4.0を使用してx64ベースのサーバー上のMS Excelドキュメント(またはその他のデータファイル)にアクセスしようとすると、この組み合わせがサポートされていないことがわかります。

唯一の解決策は、IISがWindows 64上で32ビットアプリケーションを実行し、サポートされているdbプロバイダーをインストールできるようにすることです。

ブリッジとして機能するODBC用の64ビットOLEDBプロバイダ(MSDASQL)をインストールする必要があります。 "ODBC用のMicrosoft OLE DBプロバイダ(MSDASQL)は、構築されたアプリケーションを許可するテクノロジですODBCドライバを使用してデータソースにアクセスするためのOLEDBとADO(内部でOLEDBを使用する)上のMSDASQLは、データベースの代わりにODBCに接続するOLEDBプロバイダです。最初のWindowsリリースでは、64ビット版のテクノロジが含まれています。ここ ダウンロード:http://www.microsoft.com/downloads/details.aspx?FamilyID=000364db-5e8b-44a8-b9be-ca44d18b059b&displaylang=en

このすべてが正常に動作しますが、私は私の頭を悩ま(と強調)していた二つのものに出くわした: 1)あなたはIIS Webサービス拡張に32ビットASP.Netを許可する必要があります - 「」「http://www.textcontrol.com/blog/permalink/2006082101」「」を参照して、32ビットアプリケーションとIIS Webサービス拡張機能の両方を有効にする方法を確認してください。 2)IIS x64上でレジストリキーを使用している場合は、新しいノードがレジストリに追加されます - Wow6432Node - x64で使用された関連するキーを移動/コピーする必要があります。 つまり、HCLM \ Software \ CustomKeyにデータキーが格納されていたため、32ビットが有効になっても使用できなくなりました。私たちはWow6432Nodeのもとで鍵を作り直しました。

関連する問題