asp.net - 有没有办法在 c# 中查询流,例如。从流对象中选择 *

标签 asp.net file-upload stream c#-3.0

我的 asp.net (c#) 网站中有一个文件上传控件,用于上传带有要插入数据库的数据的 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 阅读器。
这需要一个文件来查询。

是否可以查询流?我不想保存文件,而是直接阅读而不保存。

最佳答案

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

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

但是,您可以采用另一种方法来读取内容,而不保存它,例如直接从流中自己解析文件。我会推荐它而不是包装器,因为您可以避免文件访问限制问题以及文件访问的开销。

Here's具有多种不同方法的 SO。

关于asp.net - 有没有办法在 c# 中查询流,例如。从流对象中选择 *,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11611876/

相关文章:

ios - 我的 AVPlayer 不应该从最后一点恢复到 LIVE Streaming

c# - 微软 AJAX 更新面板的专业替代品?

c# - 如何使用 Microsoft Graph API 休息调用在 C# 中上传超过 4MB

java - 在一个请求中多次上传到 servlet

asp.net-core - 如何通过 FluentValidation 验证上传的文件

stream - 如何在请求 header 并收到 HTTP 错误 403 时使用 youtube-dl 下载 MPEG Dash(mpd 文件)

c# - 为什么 WebClient.OpenRead 在 Windows Server 2008 R2 上超时

javascript - 回发后保持控制背景颜色

c# - Silverlight GetElementById IE6

java - 与单独的线程读/写操作聊天。写入线程立即关闭