集算器支持包括数据库在内的多种异构数据源。这里,我们通过例子来看一下集算器访问数据库的方法。

集算器可以连接数据库的jdbc驱动,也可以通过jdbc-odbc桥连接数据库。由于版权的原因,使用集算器的程序员需要自行准备数据库的jdbc或者odbc驱动。Jdbc驱动jar包准备好之后,需要放入集算器IDE安装目录的/common/jdbc中,例如:C:\Program Files (x86)\MicroInsight\common\jdbc目录中。

集算器集成开发环境的ODBC配置界面如下:

wKioL1Qfs6_SOsIXAADYfYMMxRI420.jpg

集算器的集成开发环境提供了多种数据库的jdbc配置提示,包括:SQLserverOracleDB2SybaseAccessmysqlhsqlteradatapostgres等。如果需要连接的数据库不在这个范围内,可以使用other类型来添加。配置界面如下:

wKioL1Qfs9TSQ1NRAAGe7bBefdU634.jpg

驱动jar包放好,配置完成之后,在IDE中就可以很方便的连接数据库,取出表中的数据:

wKioL1QftADQBQKNAAGqPvpTOr8022.jpg

上图中A1单元格连接上了一个名为demohsql数据库,A2单元使用sql语句查询了employee表,作为集算器的序表存入了A2单元格这个变量中,arg1是外部传入的参数。A3单元格关闭了数据库连接,A4单元格对外返回查询结果。集算器的集成开发环境右下角红框中可以显示demo数据库的表名、字段名,可以方便程序员书写sql语句。

和集算器提供的其他函数一样,query函数包含选项和参数。如果写成query@1(“select * from employee”)@1是表示使用了1选项,查看函数说明可知,是仅仅返回sql语句取出的第一条记录。而括号中是参数,上图的括号中是一条sql语句的字符串,没有其他参数,也就是说其他所有的参数都使用了默认值。

上图中的集算器网格程序可以集成到Java应用中,作为集算器jdbc驱动被Java程序调用,具体方法是:

    1、  准备dfx文件。

将集算器程序保存成test.dfx

    2、  部署集算器jar包。

将调用集算器程序所必须的jar包放入Java应用的classpath中。如果是web应用,可以放在WEB-INF/lib目录下。这些jar包都位于集算器IDE的安装目录\esProc\lib下,包括:

    dm.jar                          集算器计算引擎及JDBC驱动包

    poi-3.7-20101029.jar            处理对Excel文件的读写

    log4j_128.jar             处理日志

    icu4j_3_4_5.jar        处理国际化

    dom4j-1.6.1.jar        解析配置文件

    3、  部署数据库驱动jar包。

将集算器连接数据库所需要的数据库jdbc驱动包也放入Java应用的classpath中。例如:demo数据库的hsql.jar

    4、  配置dfxConfig.xmlconfig.xml文件。

config.xml文件中包含了集算器的基本配置信息,如注册码、寻址路径、主目录、数据源配置等,可以在集算器安装目录的esProc\config路径下找到,其中存储的信息与集算器的选项页面中设定相同。dfxConfig.xml可以在安装目录esProc\classes中找到。这里介绍集算器连接数据库的部分配置,其他配置参见集算器教程。

1)配置数据源的方式之一:直接配置数据库数据源连接参数。

config.xml文件:

           <DBList>

                    <!-- 数据源名称,必须与dfx文件中的数据源名称一致 -->

                    <DBname="demo">

                             <propertyname="url" value="jdbc:hsqldb:hsql://127.0.0.1/demo"/>

                             <propertyname="driver" value="org.hsqldb.jdbcDriver"/>

                             <propertyname="type" value="HSQL"/>

                             <propertyname="user" value="sa"/>

                             <propertyname="password" value=""/>

                             <propertyname="batchSize" value="1000"/>

                              <!--

                             是否自动连接。如果设定为true,则可以直接使用db.query()函数来访问数据库;如果为false,则不会自动连接,使用前必须用connect(db)语句连接。

                             -->

                             <propertyname="autoConnect" value="true"/>

                             <property name="useSchema"value="false"/>

                             <propertyname="addTilde" value="false"/>

                    </DB>

           </DBList>

2)配置数据源的方式之二:在Java应用中配置连接池和jndi,在dfxConfig.xml文件中指定jndi名称。

dfxConfig.xml文件:

<jndi-ds-configs>

                    <!-- jndi前缀 -->

                    <jndi-prefix>java:comp/env</jndi-prefix>

                    <!-- 数据源名称,必须与dfx文件中的数据源名称一致 -->

                   <jndi-ds-config>

                              <name>demo</name>

                            <dbType>HSQL</dbType>

                            <dbCharset>ISO-8859-1</dbCharset>

                            <clientCharset>ISO-8859-1</clientCharset>

                              <needTranContent>false</needTranContent>

                              <needTranSentence>false</needTranSentence>

                              <!--

                             是否自动连接。如果设定为true,则可以直接使用db.query()函数来访问数据库;如果为false,则不会自动连接,使用前必须用connect(db)语句连接。

                             -->

                             <autoConnect>true</autoConnect>

                    </jndi-ds-config>

           </jndi-ds-configs>

需要说明的是:

配置文件的名称必须为config.xmldfxConfig.xml,不能改变。

在配置数据库连接信息时,要注意不能循环调用,不能将集算器JDBC本身作为数据源在配置中使用。

如果两种方式都配置了同名的数据源,就以config.xml中的为准。

    5、  部署dfxConfig.xmlconfig.xmltest.dfx文件。

dfxConfig.xmlconfig.xml放入Java应用的类路径下(classpath),也可以直接打包到dm.jar中。

test.dfx文件放到Java应用的类路径下,也可以放到dfxConfig.xml文件的<paths/>节点指定的绝对路径中。

    6、  java程序中调用test.dfx

如果集算器 JDBC的连接串中使用了...?config=...;即用该.xml文件中的配置,忽略config.xml中的定义;连接串中无config参数时则用默认配置。

例如:con=DriverManager.getConnection("jdbc:esproc:local://?config=myconfig.xml");则使用myconfig.xml中的定义。

样例代码如下:

public voidtestDataServer(){

           Connection con = null;

           com.esproc.jdbc.InternalCStatementst;

           com.esproc.jdbc.InternalCStatement st2;

           try{

                    //建立连接

                    Class.forName("com.esproc.jdbc.InternalDriver");

                   con=DriverManager.getConnection("jdbc:esproc:local://");

                    //调用存储过程,其中testdfx的文件名

                    st =(com.esproc.jdbc.InternalCStatement)con.prepareCall("calltest(?)");

                    //设置参数

                    st.setObject(1,"3");

                    //下面的语句和上面的调用方法效果相同

                    st =(com.esproc.jdbc.InternalCStatement)con.prepareCall("calltest(3)");

                    //执行存储过程

                    st.execute();

                    //获取结果集

                    ResultSet set =st.getResultSet();

           }

           catch(Exception e){

                  System.out.println(e);

         }

         finally{

                    //关闭连接

                   if(con!=null) {

                             try {

                                       con.close();

                             }

                             catch(Exception e){

                                       System.out.println(e);

                             }

                    }

           }

}