2

我在 WinXP(版本:Excel 97-2000)中为一个非常简单的 Excel 电子表格设置了一个用户 DSN ODBC 数据源:

A_NUMBER  A_DATE      A_STRING
1001      10/1/2012   Red
1002      10/2/2012   Green
1003      10/3/2012   Blue

当我运行以下 groovy 脚本(Groovy 版本:1.7.8 JVM:1.6.0_10)来读取数据时

import groovy.sql.Sql

def static main(def args) {
    def dbParameters = [url: 'jdbc:odbc:mySpreadSheet', user:'', password:'', driver: 'sun.jdbc.odbc.JdbcOdbcDriver']          
    def sql = Sql.newInstance(dbParameters)

    sql.eachRow('select * from [Sheet1$]') { row ->
        println "${row.A_NUMBER} ${row.A_DATE} ${row.A_STRING}"         
    }

    sql.close()

    println "done???"
}

它产生以下输出:

1001.0 2012-10-01 00:00:00.0 Red
1002.0 2012-10-02 00:00:00.0 Green
1003.0 2012-10-03 00:00:00.0 Blue
done???

但它永远不会退出!

我尝试从 Windows 命令提示符和 cygwin bash shell 运行它,在这两种情况下它都会挂起,直到我用 ctrl-c 杀死

我可以通过添加强制脚本退出

throw new RuntimeException("force exit")

在 println 之后,但这似乎非常极端。

知道为什么脚本挂起吗?

4

2 回答 2

2

从来没有真正找到答案,但最好的建议来自 Ralf,它是添加该行

System.exit(0)

在 main 方法的末尾。

于 2014-05-13T19:09:04.733 回答
1

我使用您的代码自己设置了此测试,完全一样,并且在完成后退出脚本没有任何问题。我认为这与您的 Cygwin shell 有关。如果您在常规 DOS shell 中运行它,您可能会发现它正确退出。

import groovy.sql.Sql
def static main(def args) {
    def dbParameters = [url: 'jdbc:odbc:RefList10000', user:'', password:'', driver: 'sun.jdbc.odbc.JdbcOdbcDriver']          
    def sql = Sql.newInstance(dbParameters)
    sql.eachRow('select * from [referenceList10000$]') { row ->
        println "${row.RefListName} ${row.Value}"         
    }
    sql.close()
    println "done"
}

发起人:

@echo off
:: Microsoft Windows [Version 6.1.7601]
SET JAVA_HOME=C:\Java\jdk1.6.0_33_x32
SET PATH=%JAVA_HOME%\bin;%PATH%
groovy SQL.gv
pause
于 2012-11-15T17:29:19.833 回答