2009-04-14 9 views
1

Excelのスプレッドシートでビジネスロジックにアクセスしようとすると、C#(Visual Studio 2008)を使用しています。別のC#プロジェクトでExcelリソースにアクセスする

私は以下のクラスを持っている...(私はこの間違ったをやっている場合は批判して自由に感じる - 私は、通常のJava開発者です - 。これが私の最初のC#アプリケーションである)

public class SpreadSheetClass 
{ 
    // apologies for any typo's code written in place, not copied from an IDE... 
    // 
    public DataTable DoIt() 
    { 
     DataTable result; 
     String sConnection = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=MySpreadsheet.xls;Extended Properties=Excel 8.0;"; 

     OleDbConnection connection = new OleDbConnection(sConnection); 
     try 
     { 
      connection.Open(); 
      OleDbCommand oleDbcCommand = new OleDbCommand("SELECT * FROM SELECTION", connection); 
      OleDbDataAdapter dataAdapter = new OleDbDataAdapter(); 
      dataAdapter.SelectCommand = oleDbcCommand;  
      result = new DataTable(); 
      dataAdapter.Fill(result); 
     } 
     finally 
     { 
      connection.Close(); 
     } 
     return result; 
    } 
} 

私はにスプレッドシートを追加Add - > Existing Item - > .xlsファイルを選択してプロジェクトを作成します。次に、ファイルのプロパティを編集して埋め込みリソースであり、出力ディレクトリに常にコピーするようにしました。

プロジェクト内からスプレッドシートを正常にアクセスできます。

「試験方法TestProject1.UnitTest1.TestMethod1が例外を投げた:

はしかし、私は、私は次の例外を取得し、テストプロジェクトから、たとえばプロジェクトの外部からドイト方法を、実行したいSystem.Dataを。 OleDb.OleDbException:Microsoft Jetデータベースエンジンが 'SELECTION'オブジェクトを見つけられませんでした。オブジェクトが存在し、名前とパス名のスペルが正しいことを確認してください.. "

私の問題は別のプロジェクトのリソースにアクセスするクラスを呼び出す

ヘルプ! .NETで

答えて

1

(特にC#の場合)、それはIDisposableusing内の文を実装するクラス「ラップ」すると良いでしょう:あなたは基本的に何をすべきか

using(OleDbConnection connection = new OleDbConnection(sConnection)) 
{ 
    // ... 
} 

をアセンブリからリソースを抽出することである(Assembly.GetManifestResourceStream()を参照してください)、それをディスクに保存してから、接続文字列を適切に変更します。

0

追加 - >既存のアイテム - >スプレッドシートをプロジェクトに追加してから.xlsファイルを選択しました。次に、ファイルのプロパティを編集して埋め込みリソースであり、出力ディレクトリに常にコピーするようにしました。

プロジェクト内からスプレッドシートを正常にアクセスできます。

他のプログラムをアセンブリとして開き、そこからリソースを読み込みます。

のような何か:

Assembly other = Assembly.Load(name); 
Stream xlsData = other.GetManifestResourceStream(resourceName); 
関連する問題