2012-03-06 81 views
0

我无法在我的Java程序中检索"db2 list db directory"命令的输出。基本上,我试图做到这一点: -如何从Java程序中检索db2命令输出

  1. 组合框在本地系统
  2. 用户填入DB2实例选择从组合框
  3. 一个新的进程运行的特定实例列出数据库中该实例
  4. 显示数据库中以另一个组合框

这是我做了一段代码: -

// dbinstances is a Combo box (Eclipse SWT widget) 

this.dbInstances.addSelectionListener(new SelectionListener() { 

    @Override 
    public void widgetSelected(SelectionEvent arg0) { 

     // get selected instance name 
     String instance = dbInstances.getText(); 

     // command invokes db2 command window, sets current instance and issues list db command 
     String command = "db2cmd /c \"set DB2INSTANCE="+instance+" & db2 list db directory\""; 

     // execute command and read output 
     try{ 
      Process p = Runtime.getRuntime().exec(command); 
      BufferedReader br= new BufferedReader(new InputStreamReader(p.getInputStream())); 
      String op = null; 
      while((op=br.readLine())!=null){ 
       System.out.println(op); 
      } 
     } 
     catch(IOException ioe){ 
      ioe.printStackTrace(); 
     } 
    } 

     public void widgetDefaultSelected(SelectionEvent arg0) {} 
}); 

问题是该命令执行,我无法检索输出。窗户刚刚打开和关闭。

我试过的一个解决方案是将输出重定向到一个临时文件并读取它。它可以工作,但是效率很低,因为每次用户选择一个实例时都会运行这段代码。

我在Windows XP SP3计算机上运行DB2 9.7企业版。

有关如何检索Java程序中的输出的任何想法?

非常感谢。

+0

好了,想通了这一个了。所需的解决方案是将/ w和/ i开关添加到命令中: - 'String command =“db2cmd/c/w/i \”set DB2INSTANCE =“+ instance +”&db2 list db directory \“”;' 更多信息在这里:http://www.ibm.com/developerworks/data/library/techarticle/0307fierros/0307fierros.html#cw – vaisakh 2012-03-06 09:47:34

回答

1

好的,算出这一个。所需的解决方案是添加/ w和/我切换到命令: -

// command invokes db2 command window, sets current instance and issues list db command 
String command = "db2cmd /c /w /i \"set DB2INSTANCE="+instance+" & db2 list db directory\""; 

根据IBM developerWorks

// Additional information about db2cmd Options 
-c Execute the DB2 command window and terminate. 
-w Wait until the DB2 command window terminates. 
-i Inherit the environment from the invoking shell. 
-t Inherit the title from the invoking shell 
+0

它只适用于Windows。 – AngocA 2014-04-30 10:27:28

1

您还可以通过JNI,以便检索数据库列表使用DB2 API目录。您必须开始扫描,获取条目,然后关闭扫描。通过这样做,您可以更好地控制数据库列表,解析可能由多种原因(HADR,身份验证机制,本地或远程,带或不带别名,IP地址或服务器名称,服务名称或端口号,在Linux(主目录)或Windows(驱动器号)中,以及其他内容) DB2 API在所有平台中都是相同的,所以它几乎是平台独立的,您只需知道哪个库负载(.so或.dll),但其余部分是相同的。

欲了解更多信息,看一看: db2DbDirOpenScan http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.apdv.api.doc/doc/r0001509.html db2DbDirGetNextEntry http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.apdv.api.doc/doc/r0001492.html db2DbDirCloseScan http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.apdv.api.doc/doc/r0001437.html

+1

更好的是,尝试直接在Java中使用JNA,一个JNI包装器。 – AngocA 2012-03-07 14:26:01

+0

谢谢,这对我来说是新的.. :)然而,我认为,对于这个微不足道的目的,JNI可能是一个矫枉过正的问题。 – vaisakh 2012-03-08 08:34:51