如何解决将XLS转换为PDF:在GetBytes期间获取“数据索引必须是字段中的有效索引”异常
我有一个将文件转换为PDF的应用程序。它首先将来自MysqL的Blob保存到临时文件中,然后将其转换为PDF。仅当我尝试转换XLS文件时,我在GetBytes()处收到此“数据索引必须是字段中的有效索引”的异常错误。其他文件类型(BMP,XLSX,DOC,DOCX等)都可以转换。
private WriteBlobToTempFileResult WriteBlobToTempFile(int id,string fileType)
{
Logger.Log(string.Format("Inside WriteBlobToTempFile() id: {0} fileType: {1}",id,fileType));
WriteBlobToTempFileResult res = new WriteBlobToTempFileResult //return object
{
PrimaryKey = id
};
FileStream fs; // Writes the BLOB to a file
BinaryWriter bw; // Streams the BLOB to the FileStream object.
int bufferSize = 100; // Size of the BLOB buffer.
byte[] outbyte = new byte[bufferSize]; // The BLOB byte[] buffer to be filled by GetBytes.
long retval; // The bytes returned from GetBytes.
long startIndex = 0; // The starting position in the BLOB output.
string connectionString = ConfigurationManager.AppSettings["MysqLConnectionString"]; //connection string from app.config
string path = ConfigurationManager.AppSettings["fileDirectory"]; //get directory from App.Config
try
{
MysqLConnection conn = new MysqLConnection(connectionString);
conn.open();
//Determine records to convert,retrieve Primary Key and file type
string sql = "SELECT FILE_DATA from " + TableName + " WHERE PK_TSP_DOCS_ID = @id";
MysqLCommand cmd = new MysqLCommand(sql,conn);
cmd.Parameters.AddWithValue("@id",id);
MysqLDataReader rdr = cmd.ExecuteReader(CommandBehavior.SequentialAccess);
while (rdr.Read())
{
// Create a file to hold the output.
fs = new FileStream(path + @"\" + id + "." + fileType,FileMode.OpenorCreate,FileAccess.Write);
bw = new BinaryWriter(fs);
// Reset the starting byte for the new BLOB.
startIndex = 0;
// Read the bytes into outbyte[] and retain the number of bytes returned.
retval = rdr.GetBytes(rdr.Getordinal("FILE_DATA"),startIndex,outbyte,bufferSize);
// Continue reading and writing while there are bytes beyond the size of the buffer.
while (retval == bufferSize)
{
bw.Write(outbyte);
bw.Flush();
// Reposition the start index to the end of the last buffer and fill the buffer.
startIndex += bufferSize;
// *****IT FAILS AT THE LINE BELOW*****
retval = rdr.GetBytes(rdr.Getordinal("FILE_DATA"),bufferSize);
// *****IT FAILS AT THE LINE ABOVE*****
}
// Write the remaining buffer.
bw.Write(outbyte,(int)retval);
bw.Flush();
// Close the output file.
bw.Close();
fs.Close();
}
// Close the reader and the connection.
rdr.Close();
conn.Close();
res.FullPath = path + @"\" + id + "." + fileType;
}
catch (Exception ex)
{
res.Error = true;
res.ErrorMessage = string.Format("Failed to write temporary file for record id: {0} of file type: {1}",id.ToString(),fileType);
res.InternalErrorMessage = ex.Message; //string.Format("Caught Exception in WriteBlobToTempPDF(). Stack Trace: {0}",ex.StackTrace);
}
return res;
}
解决方法
这是Oracle MySQL连接器/ NET中的错误。您可以在https://mysql-net.github.io/AdoNetResults/#GetBytes_reads_nothing_at_end_of_buffer处看到,MySql.Data
在尝试读取缓冲区末尾的0字节时抛出了IndexOutOfRangeException
,但是其他ADO.NET提供程序却没有。
您应该切换到MySqlConnector(免责声明:我是一名撰稿人),并使用MySqlDataReader.GetStream()
和Stream.CopyTo
方法来简化代码:
MySqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.SequentialAccess);
while (rdr.Read())
{
// Create a file to hold the output.
using (var fs = new FileStream(path + @"\" + id + "." + fileType,FileMode.OpenOrCreate,FileAccess.Write))
{
// Open a Stream from the data reader
using (var stream = rdr.GetStream(rdr.GetOrdinal("FILE_DATA"))
{
// Copy the data
stream.CopyTo(fs);
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。