4

asp.net(c#)Webサイトにファイルアップロードコントロールがあります。これは、データベースに挿入するデータを含むcsvファイルをアップロードするために使用されます。問題は、アップロードされたファイルの実際のパスを取得できなかったことです。

それはいつも私に与えました:C:\inetput\projectfolder\csvname.csv それが似ているべきだった場所:C:\Documents and settings\Pcname\Desktop\csvname.csv

しかし、ファイルアップロードのさまざまな投稿を経て、最初にファイルをサーバーに保存する必要があることがわかりました。

を使用してFileupload1.Saveas(savepath);

これは、以前に指定した場所にファイルを保存するために必須ですが、実際には必要ありません。(ファイルを再度削除するオーバーヘッドが増加するため)。

次に、私が行うことは次のとおりです。

bool result = true;
strm = FileUpload1.PostedFile.InputStream;

reader2 = new System.IO.StreamReader(strm);

// **** new ****

FileInfo fileinfo = new FileInfo(FileUpload1.PostedFile.FileName);


string savePath = "c:\\"; // example "c:\\temp\\uploads\\"; could be any path

string fileName = fileinfo.Name;
string strFilePath = savePath.ToString();


savePath += fileName;

FileUpload1.SaveAs(savePath);

string strSql = "SELECT * FROM [" + fileinfo.Name + "]";

string strCSVConnString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + strFilePath + ";" + "Extended Properties='text;HDR=NO;'";

// load the data from CSV to DataTable 

OleDbDataAdapter oleda = new OleDbDataAdapter(strSql, strCSVConnString);

DataTable dtbCSV = new DataTable();

oleda.Fill(dtbCSV);

if (dtbCSV.Columns.Count != 2)
{
    result = false;
}

ファイル内の列数をカウントしたいので、oledbリーダーを使用しています。クエリするファイルが必要です。

ストリームをクエリすることは可能ですか?ファイルを保存したくありません。代わりに、保存せずにファイルを読み取ります。

4

1 に答える 1

1

残念ながら、ストリームに対して OLEDB を使用することはできません。

OLEDB の使用が必須の状況ではIDisposable、ストリームから一時ファイルを提供し、削除を管理するラッパーを作成することができました。

ただし、ストリームから直接ファイルを解析するなど、コンテンツを保存せずにコンテンツを読み取る別の方法を使用することもできます。ファイル アクセス制限の問題やファイル アクセスのオーバーヘッドを回避できるため、ラッパーの代わりにこれをお勧めします。

これは、いくつかの異なるアプローチを持つ SO です。

于 2012-07-23T11:58:24.287 に答える