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