Во-вторых, вы должны читать поля в том порядке, в каком они возвращаются запросом. Например, если ваш запрос возвращает три столбца, третий из которых— двоичное поле, вы должны вернуть значения первого и второго полей перед тем, как обратиться к двоичным полям в третьем поле. Если вы обратитесь к третьему полю вначале, то уже не получите доступа к первым двум.

Вот как можно переделать предыдущий пример для использования последовательного доступа:

protected void Page_Load(object sender, System.EventArgs e)
{
  string connectionString =
    WebConfigurationManager.ConnectionStrings["Pubs"].ConnectionString;
  SqlConnection con = new SqlConnection(connectionString);
  string SQL = "SELECT logo FROM pub_info WHERE pub_id='1389'";
  SqlCommand cmd = new SqlCommand(SQL, con);
  try
  {
    con.Open();
    SqlDataReader r = cmd.ExecuteReader(CommandBehavior.SequentialAccess);
    if (r.Read())
    {
      int bufferSize = 100; // Size of the buffer.
      byte[] bytes = new byte[bufferSize]; // The buffer of data.
      long bytesRead; // The number of bytes read.
      long readFrom = 0; // The starting index.
      // читать поле по 100 байт за раз.
      do
      {
        bytesRead = r.GetBytes(0, readFrom, bytes, 0, bufferSize);
        Response.BinaryWrite(bytes);
        readFrom += bufferSize;
      } while (bytesRead == bufferSize);

    }
    r.Close();
  }
  finally
  {
    con.Close();
  }
}

Метод GetBytes() возвращает значение, указывающее число полученных данных. Если вам нужно определить общее количество байт в поле, вы просто должны передать нулевую ссылку вместо буфера при вызове метода GetBytes().

Интеграция графических изображений
с другими элементами управления

Метод Response.BinaryWrite() создает некоторую проблему, если вы хотите интегрировать графические данные с другими элементами управления и HTML.

предыдущая    следующая страница    вначало главы    оглавление

472

Hosted by uCoz