使用SaveFileDialog从Mysql打开Blob文件到PC

时间:2013-12-30 07:01:48

标签: c# mysql

我正在尝试使用此代码使用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以外的其他方法的任何建议吗?

1 个答案:

答案 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);