使用where order_date =
(Select
CASE WHEN (1 + TRUNC (SYSDATE) - TRUNC (SYSDATE, 'IW')) < 5
THEN TRUNC (SYSDATE) + 1
ELSE TRUNC ((SYSDATE + 4), 'IW')
END from dual);
读取.xlsx文件时出现错误,并且流阅读器是ExcelReaderFactory.CreateOpenXmlReader(streamReader)
(SftpFileStream
)。
我收到的错误消息是
Renci.SshNet.Common.SshException:常规故障
我无法遍历第一行代码。
SftpClient.OpenRead(filePath)
但是当我使用using (var reader = ExcelReaderFactory.CreateOpenXmlReader(streamReader))
{
//Get reader as DataSet
var result = reader.AsDataSet(new ExcelDataSetConfiguration()
{
ConfigureDataTable = (tableReader) => new ExcelDataTableConfiguration()
{
UseHeaderRow = true
}
});
.......
}
使用代码时,它就可以正常工作。
堆栈:
System.IO.File.Open
答案 0 :(得分:0)
SftpFileStream.Seek
代码中显然存在一个错误。当用SeekOrigin.End
调用时,它从文件末尾的位置减去offset
,而不是添加它。
如果可以修改SSH.NET代码,请在SftpFileStream.Seek
中更改此语句的两个实例:
newPosn = attributes.Size - offset;
到
newPosn = attributes.Size + offset;
我已经向SSH.NET存储库提交了pull request with this fix。
如果无法更改SSH.NET代码,则必须解决该问题。
将SftpFileStream
的内容复制到临时MemoryStream
并将其与ExcelReaderFactory
一起使用。
using (var memoryStream = new MemoryStream())
{
sftpFileStream.CopyTo(memoryStream);
memoryStream.Position = 0;
using (var reader = ExcelReaderFactory.CreateOpenXmlReader(memoryStream))
{
// ...
}
}
或者,如果您不想浪费内存来保存文件的另一个副本,则可以在Stream
周围实现自己的SftpFileStream
包装器,将SeekOrigin.End
转换为{{1 }}和适当的SeekOrigin.Begin
。
请注意,offset
(ZipArchive
内部使用)将ExcelReaderFactory
与Stream.Seek
一起使用,因为ZIP中央目录位于ZIP文件的末尾。 -XLSX文件基本上是具有特定结构的ZIP文件。