powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / прочитать BLOB
3 сообщений из 3, страница 1 из 1
прочитать BLOB
    #33912867
kadet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не могу прочитать BLOB используя такой код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
		String query="select * from table";
		Statement st =  null ; 
		ResultSet rs =  null ; 
		Connection con= null ;
		 try {
			con=myConnectionToDB.getConnection();
			st=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
			rs = st.executeQuery(query);
			
			rs.first();
			//конструкция new byte[1] - чисто условная. Далее длинна b должна определится
			 byte [] b= new   byte [ 1 ];
			
			BufferedInputStream bis =  new  BufferedInputStream(rs.getBinaryStream( 3 )); 
			 int  byteAvailable = bis.available(); 
			out.println("available:\t" + byteAvailable); 
			//в этом месте выдается: available:	0
			 if  (byteAvailable >  0 ) { 
				b =  new   byte [byteAvailable]; 
				bis.read(b); 
			} 
 
			ImageIcon im =  new  ImageIcon(b);

			JButton btn =  new  JButton(im); 
			JFrame fr =  new  JFrame("im"); 
			fr.setSize( 200 ,  150 ); 
			fr.setLocation( 500 ,  500 ); 
			fr.getContentPane().add(btn); 
			fr.setVisible(true); 
			fr.setDefaultCloseOperation( 3 );
		} catch (Exception e){
			e.printStack();}

аналогичным образом работает фрагмент кода в котором вместо BufferedInputStream используется
Код: plaintext
b = rs.getBytes( 3 );
или даже:
Код: plaintext
1.
2.
3.
4.
 Blob blob=rs.getBlob( 3 ); 
 long l=blob.length(); 
 long start= 1 ;
 b=blob.getBytes( 3 );
во всех случаях длинна байтового массива равна 0 и естественно ничего не отображается.
А вот если в качестве statement используется стандартная форма:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
		String query="select * from table";
		Statement st = null; 
		ResultSet rs = null; 
		Connection con=null;
		try{
			con=myConnectionToDB.getConnection();
			//  !!! простой statement без параметров !!!
			st=con.createStatement();
			rs = st.executeQuery(query);
			
			// rs.first();
						
			byte[] b=new byte[ 1 ];
			while(rs.next()){
			
			// этот b=rs.getBytes( 3 ), равно как и BufferedInputStream работают безукаризненно
			// b = rs.getBytes( 3 );
			BufferedInputStream bis = new BufferedInputStream(rs.getBinaryStream( 3 )); 
			int byteAvailable = bis.available(); 
			out.println("available:\t" + byteAvailable); 
			//в этом месте выдается: available:	 130 
			if (byteAvailable >  0 ) { 
				b = new byte[byteAvailable]; 
				bis.read(b); 
			} 
			}//end while
 
			ImageIcon im = new ImageIcon(b);

			JButton btn = new JButton(im); 
			JFrame fr = new JFrame("im"); 
			fr.setSize( 200 ,  150 ); 
			fr.setLocation( 500 ,  500 ); 
			fr.getContentPane().add(btn); 
			fr.setVisible(true); 
			fr.setDefaultCloseOperation( 3 );
		}catch(Exception e){
			e.printStack();}

то все работает и в окошке видно маленькую иконку
коллеги, помогите плз разобраться где собака зарыта. Мне надо обращаться к resultSet через rs.first() или анологичные методы. для этого надо указать statement чтобы он создавал resultset типа ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY

Использую БД Derby (sun использует ту же дерби под названием javaDB )
спасибо за помощь
...
Рейтинг: 0 / 0
прочитать BLOB
    #33912879
kadet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если кому интересно: derby
...
Рейтинг: 0 / 0
прочитать BLOB
    #33918443
kadet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
отвечаю сам себе. может кто-то тоже наступит на такие же грабли.

если подключаешся к бд как клиент, то объекты типа LOB не передаются в запрсе с курсором типа ResultSet.Type_SENSETIVE. их можно прочитать только стандартным ResultSet методом next(), что к сожалению не очень удобно.
Работая локально (embeded mode) чтение LOB осуществляется без проблем
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / прочитать BLOB
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]