2014-01-14 46 views
-2

我使用的是Java的MySQL连接和我有结果提取一个问题:铸造mysql.Array为String []

这是一个必须执行的查询和准备好的声明:

String statement1 = " select sentence from sentences ; "; 
PreparedStatement preparedstatement = conn.prepareStatement(statement1); 
ResultSet res = preparedstatement.executeQuery(); 

现在,我试图让一个数组的结果,所以我用:

Array temp = res.getArray("sentence"); //(1) 
String[] temp2 = (String[])temp.getArray();  //(2) 

(1)返回一个包含一个定位,这是一个逻辑指向服务器上的SQL ARRAY一个mysql.array,和(2)应该d o一个温度类型转换并返回一个String [],但是我得到这个错误

java.sql.SQLFeatureNotSupportedException 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526) 
    at java.lang.Class.newInstance(Class.java:374) 
    at com.mysql.jdbc.SQLError.notImplemented(SQLError.java:1342) 
    at com.mysql.jdbc.ResultSetImpl.getArray(ResultSetImpl.java:1226) 
    at com.mysql.jdbc.ResultSetImpl.getArray(ResultSetImpl.java:1243) 
    at wikiparse.Wikiparse3.running(Wikiparse3.java:62) // this where I wrote (1) in my java file 
    at wikiparse.ActivateWikiparse3.main(ActivateWikiparse3.java:27) 

任何想法?

+0

我认为在执行'preparedstatement.executeQuery()'后,数据已经在你身边,而不是在服务器端。 – Rugal

+0

什么是表'句子'声明? –

+0

您的代码片段不完整,但假设您在此调用之前调用'res.next()',因为Javadoc指出,您的JDBC驱动程序不支持该操作。 –

回答

2

你应该重复througth的ResultSet

List<String> temp = new ArrayList<String>(); 
String statement1 = " select sentence from sentences "; 
PreparedStatement preparedstatement = conn.prepareStatement(statement1); 
try 
{ 
    ResultSet res = preparedstatement.executeQuery(); 

    while (res.next()) 
    { 
     temp.add(res.getString("sentence")); 
    } 
} 
finally{ 
    preparedstatement.close(); 
} 
String[] temp2 = temp.toArray(new String[0]); 
+0

'ArrayList'不实现或扩展'Array'。你编译了你的代码吗? – ADS

+0

你说得对。我要纠正它! –

+0

这实际上没有意义。 –

2

MySQL没有数组类型,所以这种方法没有实现。

http://forums.mysql.com/read.php?39,160525,160573

+0

这是来自教程:http://docs.oracle.com/javase/tutorial/jdbc/basics/array.html – kolonel

+1

@kolonel是的,和*第一句*说:“注意:MySQL和Java DB目前不支持ARRAY SQL数据类型“......更不用说了,因为你的表定义中不可能有这样的数据类型。 –

+0

@BrianRoach但它说这'在以下语句中,ResultSet方法getArray返回存储在当前行的ZIPS列中的值作为java.sql.Array对象z: Array z = rs.getArray(“ZIPS “); 变量z包含一个定位器,它是服务器上SQL ARRAY的逻辑指针;它不包含ARRAY本身的元素。作为一个逻辑指针,z可以用来操作服务器上的数组。# – kolonel

0

another tutorial这表明如何从ResultSet检索数据。

你的情况,这将是

List<String> result = new LinkedList<>(); 
while (while (rs.next()) { 
    result.add(rs.getString(1)); 
} 
0

基础上广泛征求意见,你似乎有一个数据库是如何工作的,以及如果在MySQL支持它的阵列式甚至会意味着一个根本性的误解(这它不是)。

我想遍历ResultSet对象中的值,我可以使用getString()方法做到这一点,但我试图看看是否有直接的方法来做到这一点。

当您查询数据库时,它将返回表中与查询匹配的一组行。 JDBC将其表示为ResultSet。要获得所有给定列的结果,是的,你必须通过ResultSet迭代:

List<String> myList = new ArrayList<String>(); 
while (res.next()) { 
    myList.add(res.getString("sentence")); 
} 

有没有快捷的方法有ResultSet为你做这一点,并返回一个List

编辑add: PostgreSQL中的ARRAY类型(可能还有其他)是一个完全不同的野兽。它允许您将单个数据的数组存储在一行中并以此方式进行检索。这就是getArray()和相关Array类的用途。

+0

广泛的评论是因为我想了解一些东西,我试图看看是否能以某种方式完成某件事情。你答案中的代码就是我已经有的。 – kolonel

+0

ESP是在弗里茨。那小小的信息会大大改善你的问题;我们至少会立即明白你的困惑。清楚的是,您将数据库中的数据类型(以及访问它的方法/类)混淆在数据库中,该数据库不是具有Java中的数据结构(ResultSet)的MySQL。 –

+0

你需要在代码中添加一个throws子句,因为除非你这样做,否则不会工作。看来你对ResultSet类的工作原理有一个基本的误解。 – kolonel