我正在尝试使用此代码使用SaveFileDialog从MySql打开Blob(winword文档):
myConn.Open();
MySqlDataReader myReader;
myReader = view.ExecuteReader();
long CurrentIndex = 0;
long BytesReturned;
while (myReader.Read())
{
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
string strFilename = saveFileDialog1.FileName;
FileStream fs = new FileStream(strFilename, FileMode.CreateNew, FileAccess.Write);
BinaryWriter bw = new BinaryWriter(fs);
CurrentIndex = 0;
long len = myReader.GetBytes(1, 0, null, 0, 0);
byte[] blob = new byte[len];
BytesReturned = myReader.GetBytes(1, CurrentIndex, blob, 0, (int)len);
while (BytesReturned == (int)len)
{
bw.Write(blob);
bw.Flush();
CurrentIndex += (int)len;
BytesReturned = myReader.GetBytes(1, CurrentIndex, blob, 0, (int)len);
}
bw.Write(blob,0 , (int)len - 1);
bw.Flush();
bw.Close();
}
myReader.Close();
}
我得到的例外是:
索引数组的边界。
有关FileStream以外的其他方法的任何建议吗?
答案 0 :(得分:0)
没有。实际上它应该只读1列。一排。
根据您的评论,我认为问题是您尝试获取此行中的第二列(作为第一个参数);
long len = myReader.GetBytes(1, 0, null, 0, 0);
因为来自SqlDataReader.GetBytes
method
public override long GetBytes(
int i,
...
)
参数i类型:System.Int32 从零开始列序号。
当您在GetBytes
方法中将1作为第一个参数时,实际上是在尝试获取DataReader
的第二列。
将1
更改为0
可以解决您的问题。等;
long len = myReader.GetBytes(0, 0, null, 0, 0);