Впервые столкнулся с этим. Update BLOB поля.

stm5999302

Надо обновить BLOB поле в интербейзе, а я с ним не в хороших отношениях. Кто-нибудь помогите, пожалуйста

gopnik1994

ты хоть скажи в чем проблема

9173306234

должно быть что-то типа UPDATETEXT

stm5999302

Суть в том что мне надо, грубо говоря, update table_ set field_=x where.., field_ - BLOB поле, и таким простым sql update просто так не сделаешь. С интербейзом я вообще не дружу, поэтому хочу узнать у знающих людей, как обновлять BLOB поле?

uncle17

таким простым sql update просто так не сделаешь
может, я чего-то не понимаю, но в чем проблема? Почему не сделаешь-то?

stm5999302

Короче, пишу update table_ set field_=x where ... x - строковая (чел создавший базу зачем-то сделал поле field_ в виде BLOB, а не строковую так вот проблема в том, что просто так присвоить не получается, надо строковую в BLOB перевести. Кто-нибудь знает функции встроенные в интербейз (должны быть которые строковые в BLOB переводят?

uncle17

чорт... лучше не буду ничего советовать, ибо сам с интербейзом никак. Нашел вот, как с ними через РНР работать...

Поля BLOB
В PHP имеются следующие функции для работы с полями BLOB БД InterBase (документация для них пока отсутствует):
ibase_blob_create — создает поле BLOB, которое затем может быть сохранено запросом (возвращенный дескриптор передастся как параметр запроса);
ibase_blob_open -- открывает возвращенное запросом поле BLOB для операции;
ibase_blob_close — закрывает поле BLOB;
ibase_blob_add — добавляет в конец поля BLOB данные;
ibase_blob_import — записывает содержимое открытого файла в поле BLOB;
ibase_blob_get — читает содержимое поля BLOB;
ibase_blob_echo — выводит содержимое поля BLOB;
ibase_blob_info;
ibase_blob_cancel.
Поскольку единственной информацией об этих функциях является j пример из исходных текстов, он приводится далее.
$cnn=ibase_connect("localhost.F:
\interbase\data\aaa\iq.gdb".
"sysdba'V'masterkey") or die
("Can't connect"): ibase_query
("create table tbl
(v_integer integer. v_blob blob)"):
ibase_cominit:
Sname =
"F:\\php_src\\ext\\interbase\\blob.tmp";
$f = fopen($name."r");
$bl_s - ibase_blob_import($f);
ibase_query("ir,sert into tbl
(v_integer. v_blob) values (1. ?)", $bl_s):
$bl_h = ibase_blob_create
Sfp = fopen($name."r"): while
($piece = fread($fp. 1024
{
ibase_blob_add($bl_h. $piece):
} fclosedftmp);
ibase_blobadd
($bl_h.
"+-- -----.....----------------------
+\n"):
$bl_s = ibase_blob_close
($bl_h).
ibase_query("insert into tbl
(v_integer. v_blob) values
(2. ?)", $bl_s);
$q = ibase_query
("select v_blob from tbl where
vjnteger = 2"):
$row = ibase_fetch_object
($q.lBASE_TEXT):
echo $row->V_BLOB:
bi$q = ibase_query
("select v_blob from tbl
where v_integer = 2"):
$row = ibase_fetch_object($q):
i base_blob_echo
($ row->V_BLOB):
$q = ibase_query
("select v_blob from tbl where
v_integer = 2").
$row = ibase_fetch_object($q);
$bl_h = ibase_blob_open
($row->V_BLOB);
while($piece = ibase_blob_get
($bl_h. 1024
$blob = $piece. ibase_blob_close
($bl_h):
ibase_free_result($q): ibase_close
?>

psm-home

Какая версия IB? Если древняя, то лучше смигрировать на Firebird 1.5 (самый свежий). Там то, что тебе надо работает (только БД создавай с dialect 3 ). Если мигрировать на FB не хочешь/не можешь, то тебе помогут только UDF. Посмотри, например здесь, может быть FreeUDFLib умеет то, что нужно.

stm5999302

Черт, в этом примере импортируют из файла, мне что-то не улыбается записывать строку в файл, а потом его импортировать. Разве нет каких-то функций, которые строку в BLOB. Должны быть. Кто-нибудь помогите, пожалуйста.

stm5999302

Спасибо, сейчас полазию

anton7805

юзай оболочки над базами, типа ADO или JDBC, там все стандартизированно для большинства баз

anton7805

String bufstr = "'" + host + "','" + fragment + "'," + frame_id + ",'0'";
String querystr = "INSERT INTO videoframes(host, fragment, frame_id, frame ) VALUES(" + bufstr + ")";
stm.executeUpdate(querystr);
stm.close;
stm = cnt.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
ResultSet r = stm.executeQuery //todo здесь запрашиваются лишние поля
("SELECT id,host,fragment,frame_id,frame FROM videoframes WHERE (id=(SELECT MAX(id) FROM videoframes");
if ( r.next ) {
Blob blb = r.getBlob("frame");
long l = fillBlob(blb, is);
id = r.getInt("id");
r.close;
pstm = cnt.prepareStatement("UPDATE videoframes SET frame=? where (id=?)");
pstm.setBlob(1, blb);
pstm.setInt (2, id);

int fillBlob(Blob blob, InputStream bis) throws Exception {
byte blob_buf[] = new byte[SNDREC_BUFFER_SIZE];
OutputStream os = blob.setBinaryStream(1L);
int c = 0, length = 0;
//byte[] chunk = new byte[blob.getChunkSize];
while ( ( c = bis.read(blob_buf) ) != -1) {
os.write(blob_buf,0,c);
length += c;
}
os.close;
return length;
}

вот как это на jdbc делается . Кто не понял , frame - это поле типа blob

stm5999302

Всем спасибо. Разобрался =)
Оставить комментарий
Имя или ник:
Комментарий: