JRruby,Sybase JDBC和DBI - 使用AS子句问题获取列名

时间:2009-10-07 08:44:41

标签: jdbc sybase jruby dbi

我有一个ruby脚本,我使用JRuby Interpreter运行。 该脚本使用DBI和Sybase JDBC(jTDS3.jar和jconn3.jar)连接到Sybase数据库

我的问题是我有一个选择查询来改变表的列名。 例如:

SELECT
t.TRANSACTION as 'business_transaction',
t.TRADE_CURRENCY as 'currency',
t.CURRENCY as 'settlement_currency'
...etc...

FROM 
TRADE t
...etc...

我的问题是直接使用documentation

中的示例
sth = dbh.execute(stmt)

printf "Number of rows: %d\n", rows.size
printf "Number of columns: %d\n", sth.column_names.size
sth.column_info.each_with_index do |info, i|
   printf "--- Column %d (%s) ---\n", i, info["name"]
end

或只是

sth = dbh.execute(stmt)

rows = sth.fetch_all
col_names = sth.column_names
sth.finish
DBI::Utils::TableFormatter.ascii(col_names, rows)

不是 ALL 这些名称在我使用查询中的“as”子句设置时出现。有些是原始字段名称,有些是我指定的名称。

例如,他们将列出如下:

--- Column 0 (TRANSACTION) ---
--- Column 1 (TRADE_CURRENCY) ---
--- Column 2 (settlement_currency) ---

TRANSACTION
TRADE_CURRENCY
settlement_currency

在Squirrel SQL Client中测试时,列的名称是正确的,这是DBI或Sybase JDBC驱动程序中的错误吗?或者我做错了什么?

非常感谢任何帮助

3 个答案:

答案 0 :(得分:0)

我猜这是DBI中的一个错误,因为JDBC驱动程序可能已经通过了工厂多年。您可能想联系DBI人员,看看他们是否有建议。

答案 1 :(得分:0)

我可以确认它是Sybase驱动程序。使用jTDS(v1.2.5) http://jtds.sourceforge.net/我可以在查询中正确定义所有列名,并确认原始问题不是DBI

如果有人关注这个想知道我是如何让jtd在jRuby下使用DBI的,那么请看一下我之前的questions - 它确实需要一些时间 - 而DBI在指定URL时有点好笑使用

dbi:Jdbc:jtds:sybase://<host>:<port>/<db>

请注意Jdbc的大写字母J

我希望这能节省很多时间;-)

答案 2 :(得分:0)

Sybase 6.0 JDBC驱动程序有一些处理别名的“有趣”行为。如果定义了别名,则resultSet.findColumn方法将在表列名称查找时失败。

您可以在连接上设置一些属性来更改其中一些行为或仅使用JTDS驱动程序。

http://manuals.sybase.com/onlinebooks/group-jc/jcg0600e/prjdbc/@Generic__BookTextView/1072;pt=1072;uf=0