0

asp.netのExcelファイルからデータを読み取ろうとしています。webConfigファイルに接続文字列を追加しました。

<add name="xls" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=HPM_DB.xls;Extended Properties=Excel 8.0"/>

しかし、このクエリを実行すると、エラーメッセージが表示されます。

string query = "Select * from [IO_Definition $]";

IO_Definitionは、Excelファイル内のスプレッドシートの名前です。また、ExcelファイルをWebサイトのApp_Dataフォルダーに追加しました。

エラーは次のとおりです。

MicrosoftJetデータベースエンジンはオブジェクト'IO_Definition$'を見つけることができませんでした。オブジェクトが存在し、その名前とパス名のスペルが正しいことを確認してください。

問題は、connectionStringにExcelファイルの絶対パスを書き込むと機能するということです。とにかく絶対パスを書かなくても動作させることができますか?

ありがとう、

グレッグ

4

1 に答える 1

3

ここでの問題は、この種の「ファイル」接続の場合、OleDbプロバイダーは、すでに見つけたように、ファイルへの絶対パスを必要とすることです。歴史的に、私たちはこれをで行ってきました。Server.MapPathその場合、次のようなことをします。

<connectionstrings>
    <add name="xls" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 8.0;"/>
</connectionstrings>

String connString;
OleDbConnection conn;

connString = Web.Configuration.WebConfigurationManager.ConnectionStrings["xls"].ConnectionString;
connString = connString + Server.MapPath("~/App_Data/HPM_DB.xls");

conn = new OleDbConnection(connString);

conn.Open();
...

これは機能しますが、接続を開いてデータをクエリするたびにすべてを実行するか、接続ファクトリクラスに分割する必要があります。

それを行うためのより良い方法はこれです:

<connectionstrings>
    <add name="xls" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 8.0;
    Data Source=|DataDirectory|\HPM_DB.xls;"/>
</connectionstrings>

OleDbConnection conn;

conn = new OleDbConnection(Web.Configuration.WebConfigurationManager.ConnectionStrings["xls"].ConnectionString);
conn.Open();
...

実行時|DataDirectory|に、接続文字列内のトークンは、すべてのことをサイレントに実行するマクロとして機能しServer.MapPathます。

于 2010-05-18T13:55:51.540 に答える