Он выдает ошибку:
You cannot use a
text pointer for a table with option 'text in row' set to ON.
Дело в том, что в режиме «данные в строке» указатель
становить неверным сразу же по окончании транзакции. Так как SQL Server по
умолчанию находится в режиме автоматического подтверждения транзакции (auto
commit), указатель перестает быть действительным сразу после выполнения
запроса. Чтобы наш пример заработал, необходимо включить обе операции
(получение указателя и его использование) в одну транзакцию. Кроме этого, SQL
Server автоматически устанавливает коллективную блокировку в момент получения
указателя для данных в строке, так что не нужно прибегать к каким-либо хинтам.
Эта блокировка снимется после того, как указатель станет недействительным. Как
я сказал, это происходит в конце транзакции или при использовании следующих
команд:
create clustered
index
drop clustered
index
alter table
drop table
truncate table
sp_tableoption(‘text
in row’)
sp_indexoption
Можно и вручную сделать указатель недействительным с
помощью вызова функции sp_invalidate_textptr.
Если транзакция выполняется на уровне изоляции READ
UNCOMMITTED, полученный указатель можно использовать только в операциях чтения.
Операция обновления закончится ошибкой 7106: You cannot update a blob with a read-only text
pointer.
Работа с ADO
В этом разделе я приведу примеры работы с большими
объектами, используя ADO.NET и ADO. Начнем с простого.
Чтение изображения и вывод на экран с помощью VB6
Хотя VB6 уже не так популярен, как несколько лет
назад, на нем все же очень удобно писать определенного вида программы. Я иногда
просто удивляюсь, как много VS.NET переняла из среды VB6, вплоть до иконок.
Программируя на C#, вы по прежнему в меню Project можете найти пункт
References, а в списке событий формы – события OnLoad. Очень удобная технологий
DataBinding, которую я и буду использовать в примерах, также благополучно
перекочевала в дотнет. На самом деле, очень много знаний из «прежней жизни» вы
можете использовать в новой среде. Вот только я не понимаю, почему
совместимости в ADO.NET уделено меньше всего внимания. Например, тот же самый
DataBinding не работает со старым ADO. Вместо этого нужно «заливать» ADO-шный
Recordset в DataSet, и использовать уже его. Ну, хватит лирики, давайте
перейдем к предмету разговора.
Алгоритм вывода изображения на экран из БД может быть
таким:
Подготовка соединения;
Открытие соединения;
Выборка данных в Recordset;
Связывание изображения с помощью встроенной технологии
DataBinding.
Вот фрагменты кода из демонстрационного приложения, реализующие этот алгоритм.