Lotus и Firebird (jdbc)

  • Автор темы DNT
  • Дата начала
D

DNT

Уважаемые господа подскажите, кто сталкивался, как мне подключиться к Firebird-овской БД и использовать табличные данные как справочник.
Необходимо в документе, в поле со списком запихнуть данные таким образом.
Есть ли у вас подобные задачи/решения? Не будет ли тормозов при открытии?
Как оптимальнее решить такую задачу?

Хочется примерчик, потому как :lol:
 
D

DNT

спасибо, вникаю

а нету маааленького примерчика подключения?
 
D

DNT

vincent_vega спасибо, с подключением разобрался.
Java:
import lotus.domino.*;
import java.sql.*;
 
public class JavaAgent extends AgentBase {
   public void NotesMain() {
	  try {
		 Session session = getSession();
		 AgentContext agentContext = session.getAgentContext();
		 
		 // (Your code goes here)
		 DriverManager.registerDriver(new org.firebirdsql.jdbc.FBDriver());
		 //Connection conn =DriverManager.getConnection ("jdbc:firebirdsql:192.168.0.1:dbname.gdb","user", "passw");
		 Connection conn = DriverManager.getConnection("jdbc:firebirdsql:192.168.0.1:\\data\\Db\\dbname.gdb", "sysdba", "masterkey");
		 
		 Statement stmt = conn.createStatement();
		 ResultSet rset = stmt.executeQuery("select * from SPR_TOV");
		 while (rset.next())
			System.out.println(rset.getString(2));
	  } catch (Exception e) {
		 e.printStackTrace();
	  }
   }
}
Компилятор вначале ругаться изволил на несоответствие версии JDK - подложил ему версию - схавал.

Полученные данные мне теперь нужно каким-то образом использовать как справочник при заполнении полей на формах.
Думаю надо создавать и синхронизировать "локальный" справочник (серверным агентом) и потом лукапить уже по нему.
Потому как в Java я ноль полный, а времени на разбирательство особо никто и не дает - вопрос: как бы мне "уйти" от явы на лотусскрипт и обрабатывать как мне нужно полученный ResultSet?
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
470
при "уходе" будет потрачено ещё больше времени на грабли от ИБМ и иже с ними :)
берите любой пример сканирования рекордов и получайте через LS2J строки
либо получите все рекорды в массив строк и забирайте их в LS2J
как пример:
Java:
import java.util.*;
 
public class SortList {
   private ArrayList arrList = new ArrayList();
   public void add(String s) {
	  arrList.add(s);
   }
   public String[] sort() {
	  Collections.sort(arrList);
	  String[] sorted = new String[arrList.size()];
	  arrList.toArray(sorted);
	  return sorted;
   }
}
Код:
Option Public
Option Declare
Use "ErrorHandling"
Uselsx "*lsxlc"
Use "SortList"
Const ERRBASE_SORT=1130
Private Const ERRLS2JINIT=ERRBASE_SORT+1, CS_ERRLS2JINIT={ошибка инициализации класса Java}
 
Class SortObj As ErrorHandlerWJ
   Private SortListObj As JavaObject
   Private SortListClass As JavaClass
   Private fCount As Integer
   
   Sub New()
	  On Error Goto errorhandler
	  Set SortListClass = jSession.GetClass("SortList")
	  Set SortListObj = SortListClass.CreateObject
   ExitFunction:
	  Exit Sub
   errorhandler:
	  Call Me.RaiseError()
	  Error ERRLS2JINIT, CS_ERRLS2JINIT
   End Sub
   
   Sub Delete()
	  If Not SortListObj Is Nothing Then
		 Delete SortListObj
	  End If
   End Sub
   
   Sub Add(s As String)
	  SortListObj.add(s)
   End Sub
   
   Function Sort() As Variant
	  On Error Goto errorhandler
	  Sort=SortListObj.sort()
   ExitFunction:
	  Exit Function
   errorhandler:
	  Call Me.RaiseError()
	  Resume ExitFunction
   End Function
End Class
Код:
Option Public
Option Declare
%INCLUDE "lserr.lss"
'Uselsx "*lsxlc"
Uselsx "*javacon"
%INCLUDE "lsconst.lss"
 
Class ErrorHandler
   Sub ClrError()
	  '
   End Sub
   
   Sub New()
	  Call Me.ClrError()
   End Sub
   
   Function GetModuleInfo() As String
	  Dim thisType As String, modInfo As String
	  thisType = Typename(Me)
	  'Not a class, use the calling module instead
	  If (thisType = "") Then thisType = Getthreadinfo(11)
	  modInfo = thisType & "::" & Getthreadinfo(10) & ": "
	  GetModuleInfo = modInfo
   End Function
   
   Function RaiseError() As String
	  Dim es As String
	  es = GetModuleInfo()
	  If (Err = 0) Then
		 es = es + "Manually raised an error"
	  Else
		 es = es + "Run time error: (" + Trim(Str(Err)) + ") " + Error$ + " at line: "+ Trim(Str(Erl))
	  End If
	  Print es
	  Me.RaiseError = es
	  Call Me.ClrError()
   End Function
End Class
 
Class ErrorHandlerWJ As ErrorHandler
   Private jSession As JavaSession
   Private jError As JavaError
   
   Sub New()
	  On Error Goto errorhandler
	  Set jSession = New JAVASESSION
   ExitFunction:
	  Exit Sub
   errorhandler:
	  Call ErrorHandler..RaiseError()
	  Resume ExitFunction
   End Sub
   
   Function RaiseError() As String
	  Set jError = jSession.getLastJavaError()
	  Dim es As String
	  If (jError.errorMsg = "") Then
		 es = ErrorHandler..RaiseError()
	  Else
		 es = GetModuleInfo() + "Error at line " & Erl & ": " & jError.errorMsg
		 Print es
		 jSession.ClearJavaError
	  End If
	  RaiseError = es
   End Function
End Class
 
V

vital

Пост выше в кодебейз не плохо бы.. Эх, где морфеус..
 

vincent_vega

Green Team
02.04.2005
169
1
BIT
0
Полученные данные мне теперь нужно каким-то образом использовать как справочник при заполнении полей на формах.
Думаю надо создавать и синхронизировать "локальный" справочник (серверным агентом) и потом лукапить уже по нему.
Потому как в Java я ноль полный, а времени на разбирательство особо никто и не дает - вопрос: как бы мне "уйти" от явы на лотусскрипт и обрабатывать как мне нужно полученный ResultSet?

Если данных для справочника не много, то я бы действительно остановился на серверном агенте, который бы синхронизировал лотус базу с реляционной. Если же реляционная база очень большая, то можно и на лету выбирать нужные данные. Уходить от джавы не советую лучше с ней подружится пока агенты разрабатывать будете:) Она вам пригодится не только в лотусе.
 
D

DNT

Прошу помощи в следующем:

почему не работает такой код:
Java:
Statement stmt = conn.createStatement ();
ResultSet rset = stmt.executeQuery ("select * from SPR_TYPES_IN_OUT");
Document doc = agentContext.getDocumentContext();
String s = "";
Vector stringMultiple = new Vector();
while (rset.next ())
{
s = rset.getString (2);
stringMultiple.addElement(s);
}
doc.replaceItemValue("data", stringMultiple);
doc.save();
но работает такой:
Java:
Statement stmt = conn.createStatement ();
ResultSet rset = stmt.executeQuery ("select * from SPR_TYPES_IN_OUT");
Document doc = agentContext.getDocumentContext();
String s = "";
Vector stringMultiple = new Vector();
while (rset.next ())
{
s = rset.getString (2);
stringMultiple.addElement(s);
doc.replaceItemValue("data", stringMultiple);
}
doc.save();
Отличие: doc.replaceItemValue("data", stringMultiple); - в первом случае вне цикла, во втором в цикле.
Мне как-то первый вариант больше нравится, или я чегото непойму логики?
Подскажите как правильно написать...
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
470
первый вариант правильный и в хэлпе он похожий - смотрите на ошибки в java консоле
и ещё - не указано, что "не работает"
 
D

DNT

Не работает так: поле data в документе остается пустым, в java консоле нет ошибок.
Есть предположение что слишком много строк я пытаюсь запихнуть в Vector... Есть какието ограничения? В хелпе не нашел.
Если запустить тот-же код (первый) на другой ResultSet всего в ~50 записей - все отрабатывает как надо.
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
470
ограничение есть на память jvm (устанавливается в notes.ini) и на значение, кот. записываем в поле (32К с флагом саммари)
Syntax: JavaMaxHeapSize=number of bytes
Description: Specifies the maximum--not initial--size the Java heap can reach. The Java Virtual Machine (JVM) starts out at 16MB of heap space and most of it is uncommitted. If the JVM needs more heap than it currently has, it will expand the heap in increments but will not exceed the maximum. Exceptions such as "java.lang.OutOfMemoryError" indicate that a heap has reached its maximum size. You can specify the number of bytes directly or use the suffix "MB" to indicate megabytes, for example, specifying "64MB" is the same as specifying "67108864."
Applies to: Servers
Default: 64MB

потому - вероятно ваш случай второй
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
470
а причем здесь локально - если есть ограничение по размеру данных в поле и на документ, очивидно - они и срабатывают
 
D

DNT

Наверно ламерский вопрос, но не сочтите за труд:

почему компилятор ругаица на строку: doc.recycle();

JavaAgent.java:51:cannot resolve symbol
symbol: variable doc
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
470
значит:
- у doc нет такого метода
- не определён doc
- в слове есть русские буквы :rolleyes:

причиной м.б. не импортированные библиотеки
import lotus.domino.*;
у Document из этих библ есть recycle();
 
H

hosm

В КБ лотус могут писать ВСЕ. Есть правила постинга в КБ. Выбираем раздел и описываем туда готовые решения. Только раздел премодерируемый, и темы всем сразу не видно, модеры должны ее одобрить и открыть для всех. А сообщения к открытым темам видно сразу.
Кое-кто даже додумывается туда вопросы писать, и не единожды.(
Морфеюс работает, я тоже. Пока нет возможности уделять достаточно внимания пополнению КБ, уж простите(
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
470
а то часто про сортировку велики изобретают на LS и подключением COM :rolleyes:
я вона, выше, в ходе кодирования, делал сортировку
 
D

DNT

Хелп ми плиз: после отладки созданного агента на локальной машинке была предпринята попытка запустить его на сервере по расписанию.
Начались траблы :KillMe: :

20.04.2010 09:38:57 Agent Manager: Agent error: java.lang.ExceptionInInitializerError
20.04.2010 09:38:57 Agent Manager: Agent error: at JavaAgent.NotesMain(JavaAgent.java:13)
20.04.2010 09:38:57 Agent Manager: Agent error: at lotus.domino.AgentBase.runNotes(Unknown Source)
20.04.2010 09:38:57 Agent Manager: Agent error: at lotus.domino.NotesThread.run(Unknown Source)
20.04.2010 09:38:57 Agent Manager: Agent error: Caused by: java.util.MissingResourceException: Can't find resource for bundle java.util.PropertyResourceBundle, key access_property_not_allowed
20.04.2010 09:38:57 Agent Manager: Agent error: at java.util.ResourceBundle.getObject(ResourceBundle.java:329)
20.04.2010 09:38:57 Agent Manager: Agent error: at java.util.ResourceBundle.getString(ResourceBundle.java:289)
20.04.2010 09:38:57 Agent Manager: Agent error: at lotus.notes.JavaString.getFormattedString(JavaString.java:114)
20.04.2010 09:38:57 Agent Manager: Agent error: at lotus.notes.AgentSecurityManager.checkPropertyAccess(AgentSecurityManager.java:6
92)
20.04.2010 09:38:57 Agent Manager: Agent error: at java.lang.System.getProperty(System.java:645)
20.04.2010 09:38:57 Agent Manager: Agent error: at org.firebirdsql.logging.LoggerFactory.getLogger(LoggerFactory.java:36)
20.04.2010 09:38:57 Agent Manager: Agent error: at org.firebirdsql.logging.LoggerFactory.getLogger(LoggerFactory.java:72)
20.04.2010 09:38:57 Agent Manager: Agent error: at org.firebirdsql.jdbc.FBDriver.<clinit>(FBDriver.java:63)
20.04.2010 09:38:57 Agent Manager: Agent error: ... 3 more

Подложил jar файл на сервер в каталог ...\jvm\lib\ext\, сервер передернули, теперь ругается иначе:

20.04.2010 10:16:47 Agent Manager: Agent error: java.sql.SQLException: No suitable driver
20.04.2010 10:16:47 Agent Manager: Agent error: at java.sql.DriverManager.getConnection(DriverManager.java:579)
20.04.2010 10:16:47 Agent Manager: Agent error: at java.sql.DriverManager.getConnection(DriverManager.java:189)
20.04.2010 10:16:47 Agent Manager: Agent error: at JavaAgent.NotesMain(JavaAgent.java:14)
20.04.2010 10:16:47 Agent Manager: Agent error: at lotus.domino.AgentBase.runNotes(Unknown Source)
20.04.2010 10:16:47 Agent Manager: Agent error: at lotus.domino.NotesThread.run(Unknown Source)

На локалке работает, на сервере нет.
java version "1.4.2" и на сервере и на клиенте.

Помогите пож, а то совсем не знаю куда копать...
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
470
какой оракл и какой драйвер брали?
но более склоняюсь к мысли - не находит драйвер, при инициализации класса jdbc
поди пытались из БД юзать, а потом без исправления агента перенсли jar ?
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!