如何在AnyLogic中切换数据库工作表?代码无法用字符串作表名
在AnyLogic中循环遍历数据库工作表的解决方案
问题分析
你直接用字符串作为selectFrom()方法的参数是行不通的——AnyLogic的JPA风格查询(selectFrom这类方法)是绑定到实体类的,不支持直接传入字符串表名来动态切换数据表。
解决方案
以下是两种可行的实现方式:
方法1:使用AnyLogic Database对象执行动态SQL
利用AnyLogic自带的Database类构造动态SQL,直接查询不同工作表:
// 假设你已在AnyLogic中配置好数据库连接,对象名为database String[] sheetNames = {"sheet1", "sheet2", "sheet3", "sheet4", "sheet5", "sheet6", "sheet7", "sheet8", "sheet9", "sheet10", "sheet11", "sheet12", "sheet13", "sheet14", "sheet15", "sheet16", "sheet17", "sheet18", "sheet19", "sheet20"}; double Takte = 0.0; int index = 0; // 需提前定义你代码中用到的offset索引 for(String sheetName : sheetNames) { // 构造动态SQL查询语句,若表名含特殊字符,需用反引号(MySQL)或方括号(SQL Server)包裹 String sql = String.format("SELECT takte FROM %s LIMIT 1 OFFSET %d", sheetName, index); // 执行查询并获取结果 ResultSet rs = database.executeQuery(sql); if(rs.next()) { Takte = rs.getDouble("takte"); // 可根据需求添加结果处理逻辑,比如将每个表的结果存入集合 } rs.close(); // 务必关闭结果集,避免资源泄漏 }
方法2:通过JDBC连接执行动态SQL
如果需要更底层的控制,可直接使用JDBC连接操作:
String[] sheetNames = {"sheet1", "sheet2", "sheet3", "sheet4", "sheet5", "sheet6", "sheet7", "sheet8", "sheet9", "sheet10", "sheet11", "sheet12", "sheet13", "sheet14", "sheet15", "sheet16", "sheet17", "sheet18", "sheet19", "sheet20"}; double Takte = 0.0; int index = 0; Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try { // 获取AnyLogic数据库的JDBC连接 conn = database.getConnection(); for(String sheetName : sheetNames) { String sql = String.format("SELECT takte FROM %s LIMIT 1 OFFSET ?", sheetName); pstmt = conn.prepareStatement(sql); pstmt.setInt(1, index); rs = pstmt.executeQuery(); if(rs.next()) { Takte = rs.getDouble("takte"); // 结果处理逻辑 } } } catch(SQLException e) { e.printStackTrace(); } finally { // 依次关闭数据库资源 try { if(rs != null) rs.close(); } catch(Exception e) {} try { if(pstmt != null) pstmt.close(); } catch(Exception e) {} try { if(conn != null) conn.close(); } catch(Exception e) {} }
注意事项
- 确认工作表名和字段名(
takte)在数据库中真实存在,避免拼写错误 - 若工作表名包含空格或特殊字符,需用对应数据库的语法包裹表名(如MySQL用
表名,SQL Server用[表名]) - 必须及时关闭数据库资源(结果集、语句、连接),防止连接泄漏
内容的提问来源于stack exchange,提问作者Ehsan Ul Haque
相关产品推荐
相关产品推荐

