 
                    
                
         
    
    
    
    
    
        
            
                
    
        
        
                
        
        从数据库读2进制数据的快速方法
    
 // Don't buffer response
 // Don't buffer response
 context.Response.Buffer = false;
            context.Response.Buffer = false;

 // Get file name
            // Get file name
 string fileName = VirtualPathUtility.GetFileName(context.Request.Path);
            string fileName = VirtualPathUtility.GetFileName(context.Request.Path);

 // Get image from database
            // Get image from database
 string conString = WebConfigurationManager.ConnectionStrings[connectionStringName].ConnectionString;
            string conString = WebConfigurationManager.ConnectionStrings[connectionStringName].ConnectionString;
 SqlConnection con = new SqlConnection(conString);
            SqlConnection con = new SqlConnection(conString);
 SqlCommand cmd = new SqlCommand("SELECT Image FROM Images WHERE FileName=@FileName", con);
            SqlCommand cmd = new SqlCommand("SELECT Image FROM Images WHERE FileName=@FileName", con);
 cmd.Parameters.AddWithValue("@fileName", fileName);
            cmd.Parameters.AddWithValue("@fileName", fileName);
 using (con)
            using (con)

 
             {
{
 con.Open();
                con.Open();
 SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess);
                SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess);
 if (reader.Read())
                if (reader.Read())

 
                 {
{
 int bufferSize = 8040;
                    int bufferSize = 8040;
 byte[] chunk = new byte[bufferSize];
                    byte[] chunk = new byte[bufferSize];
 long retCount;
                    long retCount;
 long startIndex = 0;
                    long startIndex = 0;
 retCount = reader.GetBytes(0, startIndex, chunk, 0, bufferSize);
                    retCount = reader.GetBytes(0, startIndex, chunk, 0, bufferSize);
 while (retCount == bufferSize)
                    while (retCount == bufferSize)

 
                     {
{
 context.Response.BinaryWrite(chunk);
                        context.Response.BinaryWrite(chunk);

 startIndex += bufferSize;
                        startIndex += bufferSize;
 retCount = reader.GetBytes(0, startIndex, chunk, 0, bufferSize);
                        retCount = reader.GetBytes(0, startIndex, chunk, 0, bufferSize);
 }
                    }
 byte[] actualChunk = new Byte[retCount - 1];
                    byte[] actualChunk = new Byte[retCount - 1];
 Buffer.BlockCopy(chunk, 0, actualChunk, 0, (int)retCount - 1);
                    Buffer.BlockCopy(chunk, 0, actualChunk, 0, (int)retCount - 1);
 context.Response.BinaryWrite(actualChunk);
                    context.Response.BinaryWrite(actualChunk);
 }
                }
 }
            }