将 SQL 查询结果转换为字符串数组

Posted

技术标签:

【中文标题】将 SQL 查询结果转换为字符串数组【英文标题】:Convert SQL Query result into array of strings 【发布时间】:2011-02-15 23:56:15 【问题描述】:

我正在使用 SQLiteJDBC(SQLite 的 Java JDBC 驱动程序)对 Java 中的 SQLite3 数据库进行查询。

如果我进行 SQL 查询 SELECT name, pass FROM loginTable WHERE name='%s'; 是否有函数返回或转换名称并传递从查询返回的字符串放入 String 数组或 ArrayList?

以下代码尝试将查询返回到一个数组列表中,但它失败了,我知道 SQL 数据库很好并且我所做的查询是因为当我在命令行中执行此操作时它可以工作。

ArrayList <String> result = new ArrayList<String>();
ResultSet rs = stat.executeQuery( "SELECT ..." );

for (int i=0; rs.next(); i++)

   result.add( rs.getString(i) );

失败是因为表 loginTable 有以下列:索引、名称、通过。所以看上面,当 i=0,& 我去 rs.getString(0) 时,它试图在 Index 列中获取字符串。

错误输出是

java.sql.SQLException:第 0 列超出范围 [1,1]

有谁知道如何将 SQL 查询(ResultSet 对象)的所有结果放入 ArrayList 或数组中?

【问题讨论】:

【参考方案1】:

在 JDBC 中,列的索引从 1 开始,而不是 0。

【讨论】:

+1 来自.net DataReader,不知道 JDBC 从 1 开始 @Scrum Meister 同样适用于 praparedStatement,你从不设置参数 o。【参考方案2】:

要仅存储第一行的列,请尝试

int columnCount = rs.getMetaData().getColumnCount();
rs.next();
for (int i = 0; i <columnCount ; i++)

   result.add( rs.getString(i + 1) );

如果你想存储一个包含所有行和所有列的ArrayList&lt;String[]&gt;

ArrayList <String[]> result = new ArrayList<String[]>();
ResultSet rs = stat.executeQuery( "SELECT ..." );
int columnCount = rs.getMetaData().getColumnCount();
while(rs.next())

    String[] row = new String[columnCount];
    for (int i=0; i <columnCount ; i++)
    
       row[i] = rs.getString(i + 1);
    
    result.add(row);

根据肖恩的回答更新

【讨论】:

【参考方案3】:

这对我有用:

public static String[] getRooms() throws SQLException, JSONException, ClassNotFoundException
    ArrayList<String> a = new ArrayList<String>();

    Class.forName(sqlDriver);
    Connection con = DriverManager.getConnection(dtbSet, dtbUsername, dtbPassword);
    PreparedStatement ps = con.prepareStatement("SELECT room_name FROM "+ dtbTbl2);
    ResultSet rs = ps.executeQuery();

    while(rs.next())
    
        a.add(rs.getString(1));
    

    return (String[]) a.toArray(new String[a.size()]);

【讨论】:

【参考方案4】:

首先,不要使用for loop,因为您只会从每一行获得一个不同的列...每次点击rs.next(),它会在您完成所有列值之前转到下一行从一排。相反,使用while (rs.next()) 检查行是否存在。

其次,正如@shaun 提到的,JDBC 列以 1 开头,而不是零。

第三,要将数据放入列表中,您需要一个 POJO 或一个 bean 来保存每一行的所有信息。

所以,最后,代码变成了这样:-

Connection con = ...; 
PreparedStatement ps = con.prepareStatement("SELECT name, pass FROM loginTable WHERE name = ?");
ps.setString(1, "mike");

ResultSet rs = ps.executeQuery();

List<User> users = new ArrayList<User>();

while(rs.next()) 
    String name = rs.getString(1);
    String pass = rs.getString(2);
    users.add(new User(name, pass));


...

【讨论】:

【参考方案5】:

您可能想看看这个框架。 http://commons.apache.org/dbutils/

具体来说,您可以查询数据库并返回查询的数组列表。下面是一个伪代码示例:

ResultSetHandler h = new ArrayListHandler();
QueryRunner qr = new QueryRunner();

List<Object[]> results = (List<Object[]>)qr.query(sql, h);

还有一个使用这个的网站: http://www.stupidjavatricks.com/?p=45

【讨论】:

以上是关于将 SQL 查询结果转换为字符串数组的主要内容,如果未能解决你的问题,请参考以下文章

将 Java 结果集转换为字符串数组

将 wpdb sql 数组转换为 php 数组

如何使用 php 数组将 sql 查询结果转换为数据透视表?

将制表符分隔的文本转换为数组[重复]

PHP如何将SQL查询结果转为多维数组,并按查询行输出

将 SQL 查询转换为 Mongo 聚合