2012-07-23 74 views
4

我在我的asp.net(c#)网站上有一个文件上传控件,用于上传带有要插入数据库的数据的csv文件,我的问题是,我无法获得上传文件有没有办法在c#中查询流,例如。 select * from一个流对象

的实际路径它总是给我: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读者。 需要查询文件。

是否可以查询流?我不想保存文件,而只是读取它而不保存。

+1

你不能查询Streamreader的数据..你必须先保存文件... – 2012-07-23 12:05:33

回答

1

不幸的是,你不能对流使用OLEDB。

在强制使用OLEDB的情况下,我设法编写了一个IDisposable包装器,它可以提供流中的临时文件并管理删除操作。

然而,您可以选择另一种方式来读取内容,而不保存它,例如直接从流中解析文件。由于避免了文件访问限制问题以及文件访问开销,因此我会推荐使用这种方法代替包装。

Here's是一种具有几种不同方法的SO。

相关问题