UCanAccess 数据异常:数值超出范围

Posted

技术标签:

【中文标题】UCanAccess 数据异常:数值超出范围【英文标题】:UCanAccess data exception: numeric value out of range 【发布时间】:2015-10-04 15:07:03 【问题描述】:

我有一个名为 [Elenco_Az​​iende] 的表,我从中提取结果集中的所有记录。 [Elenco_Az​​iende] 通过一个名为 [Partita_IVA_Azienda] 的字段与另外两个名为 [Elenco_Autisti] 和 [Elenco_Veicoli] 的表存在一对多关系,该字段也是 [Elenco_Az​​iende] 表中的主键。

从 [Elenco_Az​​iende] 中提取所有记录后,我为 [Partita_IVA_Azienda] 的每个值执行一个循环,然后打开一个新结果集以尝试读取 [Elenco_Autisti] 和 [Elenco_Veicoli] 表的相关字段中的值并为每个表执行其中一些操作。

奇怪的事情来了:只要 [Partita_IVA_Azienda](在 Access DB 中定义为 Text 字段)值都是相同的长度,当我尝试读取 [Elenco_Autisti] 和 [ Elenco_Veicoli] 表,但如果某些 [Partita_IVA_Azienda] 的长度不同,则出现错误:

net.ucanaccess.jdbc.UcanaccessSQLException: UCAExc:::3.0.1 数据异常:数值超出范围

更准确地说是嵌套循环场景:

    Connection con = DriverManager.getConnection("jdbc:ucanaccess://"
        + filepath);



String qry = "SELECT * FROM Elenco_Aziende";

ResultSet rs = stmt.executeQuery(qry);
String cognometest = "";
String nometest ="";

while (rs.next()) 




    String partitaiva = "Partita IVA: "
            + rs.getString("Partita_IVA_Azienda") + "\n\r";


    String partitaivazienda = rs.getString("Partita_IVA_Azienda");

    Statement stmtautisti = con.createStatement();


    System.out.println("Sto per eseguire la query per partita iva azienda = " + partitaivazienda + "\n\r");


    String qryautisti = "SELECT * FROM Elenco_Autisti WHERE Partita_IVA_Azienda="
            + partitaivazienda; /*!!!!! AND HERE WHEN I EXECUTE NEXT QUERY IS WHERE I GET THE EXCEPTION net.ucanaccess.jdbc.UcanaccessSQLException: UCAExc:::3.0.1 data exception: numeric value out of range more!!!!!*/
    ResultSet rsautisti = stmtautisti.executeQuery(qryautisti);



    while (rsautisti.next()) 

    do something here

    


    Statement stmtveicoli = con.createStatement();
    String qryveicoli = "SELECT * FROM Elenco_Veicoli WHERE Partita_IVA_Azienda="
            + rs.getString("Partita_IVA_Azienda");
    ResultSet rsveicoli = stmtveicoli.executeQuery(qryveicoli);



    while (rsveicoli.next()) 

    do something else here

    

只要我执行查询就可以了

String qryautisti = "SELECT * FROM Elenco_Autisti WHERE Partita_IVA_Azienda="+ partitaivazienda; 

对于 [Partita_IVA_Azienda] 的不同长度值,我得到了问题。

我什至尝试以逗号分隔值导出数据库,然后以全新的值重新导入它,但没有帮助。此外,问题似乎只发生在表 [Elenco_Autisti](138 条记录)和 [Elenco_Veicoli](287 条记录)中的大量记录上,而少量记录似乎不会发生。 [Elenco_Az​​iende] 很小(不超过 10 条记录)。

【问题讨论】:

是否可以显示partitaivazienda 的所有值?我想你在这里可能是一个非常大的数字。 对于 文本字段 是否真的会出现“数值超出范围”这样的消息?您不必在 SELECT 语句中为字符串使用引号吗? 如果你只使用准备好的语句...... 【参考方案1】:

根据我对 SQL 的了解,一个带有文本字段的 WHERE 应该用撇号中的值编写:

String qryautisti = "SELECT * FROM Elenco_Autisti WHERE Partita_IVA_Azienda='"
                    + partitaivazienda + "'";

【讨论】:

@Alf 最好还是使用PreparedStatement参数化查询

以上是关于UCanAccess 数据异常:数值超出范围的主要内容,如果未能解决你的问题,请参考以下文章

数值超出范围减去 jOOQ 中的日期

我想异常处理“列表索引超出范围”。

数据库异常——超出列范围

从 Netezza 数据库创建 SAS 数据集时,SAS“CLI 游标扩展提取错误:数值超出范围”

获取“索引超出数组范围”异常

PDO PHP - PDOException - 数值超出范围:1264 第 1 行的列“customer_id”的值超出范围