数据库为Oracle8.05,因此不好用Oracle类库,在此使用OLEDB类。
我看到MSDN上的一篇文章
http://support.microsoft.com/default.aspx?scid=kb;EN-US;309158
我这样导出照片也是可以的,但是就是有的照片会残缺不全,用Acdsee打开的时候,下面显示"源数据流被破坏",请教这是什么问题呢?
//函数ExportPhotos:导出照片文件
private void ExportPhotos()
{
string TempSQLStr = "SELECT * FROM PHOTO WHERE PHOTO IS NOT NULL"; //全部导出
 
if(OpearteAppConfig.ReadSetting("ExportType") != "All")     //增量导出

TempSQLStr = TempSQLStr + " AND SCBZ = '0'"; 
}

//OleDbDataAdapter
OleDbDataAdapter TempOleDbDataAdapter = new OleDbDataAdapter();
TempOleDbDataAdapter.TableMappings.Clear();
TempOleDbDataAdapter.TableMappings.Add("Table","PHOTO");         //OleDbCommand
OleDbCommand TempCommand = new OleDbCommand(TempSQLStr,ConnOracle);
TempCommand.CommandType = CommandType.Text;
TempOleDbDataAdapter.SelectCommand = TempCommand; //DataSet
DataSet TempDataSet = new DataSet();
TempDataSet.Clear(); 
TempOleDbDataAdapter.Fill(TempDataSet);
    
//progressBar_Unit
int TotalCount = TempDataSet.Tables["PHOTO"].Rows.Count; //照片纪录数  
progressBar_Unit.Value = 0;
progressBar_Unit.Minimum = 0;
progressBar_Unit.Maximum = TotalCount;  for(int i=0;i<TotalCount;i++) 

Application.DoEvents(); 
object PhotoType;     //照片类型
object PhotoScbz;     //上传标志位
string PhotoFileName; //照片文件名 PhotoType = TempDataSet.Tables["PHOTO"].Rows[i]["TYPE"].ToString(); 
PhotoScbz = TempDataSet.Tables["PHOTO"].Rows[i]["SCBZ"].ToString(); if(PhotoType.ToString() == "" | PhotoType is DBNull)
{
PhotoType = "1";
} if(PhotoScbz.ToString() == "" | PhotoScbz is DBNull)
{
PhotoScbz = "1";
} //创建照片的文件名称
PhotoFileName = Directory.GetCurrentDirectory() +"\\SEND\\";
PhotoFileName = PhotoFileName + TempDataSet.Tables["PHOTO"].Rows[i]["LFFH"].ToString(); 
PhotoFileName = PhotoFileName + "_" + PhotoType + PhotoScbz + ".jpg";   //PhotoData
byte[] PhotoData= new byte[0];
 
DataRow TempDataRow = TempDataSet.Tables["PHOTO"].Rows[i];
   
PhotoData = (byte[])TempDataRow["PHOTO"];
int ArraySize = new int();
ArraySize = PhotoData.GetUpperBound(0);  FileStream fs = new FileStream(@PhotoFileName,FileMode.OpenOrCreate, FileAccess.Write);
fs.Write(PhotoData, 0,ArraySize);
fs.Close();  
        
statusBarPanel2.Text = "已导出照片 " + (i+1) + " 张";  
progressBar_Unit.Value++;  
}
}

解决方案 »

  1.   

    同样这个数据库下面用VB.NET写的就可以导出正确的图片!Dim fs1 As FileStream = New FileStream(filename, FileMode.CreateNew)
    Dim w As BinaryWriter = New BinaryWriter(fs1)
    w.Write(OleDbDataReader("photo"))
    w.Close()
    fs1.Close()
    OleDbDataReader.Close()但是那种方法使用OleDbDataReader写的,我觉得效率不高。
      

  2.   

    这个OLEDB是ms的吧,应该用oracle提供的
      

  3.   

    Oracle提供的至少要Oracle8i以上的才支持,数据库是老的系统的,所以才不得不用Oledb