Java 如果我';我成批发送多个值?

Java 如果我';我成批发送多个值?,java,sqlite,exception,jdbc,prepared-statement,Java,Sqlite,Exception,Jdbc,Prepared Statement,我已经编写了一个类方法,它将获取“批处理”数据(通过SQL将“值”插入数据库的每一行都来自一个标记为“data_values”的二维数组) 但是,在某些情况下,我的程序将获得冗余数据,即数据库中可能已经存在的数据。由于数据库中有一个主键,如果由于重复条目而无法上载数据,程序将中断 有没有一种方法可以使用try/catch让程序继续上传数据,有效地“跳过”重复的数据?如果是,我如何实施 先谢谢你。如果我能澄清我的问题,请让我知道 我目前的代码如下: public void insertData(A

我已经编写了一个类方法,它将获取“批处理”数据(通过SQL将“值”插入数据库的每一行都来自一个标记为“data_values”的二维数组)

但是,在某些情况下,我的程序将获得冗余数据,即数据库中可能已经存在的数据。由于数据库中有一个主键,如果由于重复条目而无法上载数据,程序将中断

有没有一种方法可以使用try/catch让程序继续上传数据,有效地“跳过”重复的数据?如果是,我如何实施

先谢谢你。如果我能澄清我的问题,请让我知道

我目前的代码如下:

public void insertData(ArrayList<String> data_types, String[][] data_values) {

        try{    
            c.setAutoCommit(false); 
            // creates insert statement
            String insertDataScript = "INSERT INTO "+tableName+" VALUES (";
            for(int q = 0; q < data_types.size()-1; q++) {
                insertDataScript += "?, ";
            }
            insertDataScript += "?)";

            PreparedStatement stmt = c.prepareStatement(insertDataScript);
            for (int i = 0; i < data_values.length; i++) {

                for(int j = 1; j < data_types.size()+1; j++) {

                    if(data_types.get(j-1).toLowerCase().equals("double")) {
                        stmt.setDouble(j, Double.valueOf(data_values[i][j-1]));
                    }
                    else if(data_types.get(j-1).toLowerCase().equals("string")) {
                        stmt.setString(j, data_values[i][j-1]);
                    }
                    else {
                        System.out.println("Error");
                    }
                }
                stmt.addBatch();
            }
            stmt.executeBatch();
            c.commit();
            c.setAutoCommit(true);
            stmt.close();
        } 
        catch ( Exception e ) {
            System.err.println( e.getClass().getName() + ": " + e.getMessage() );
            System.exit(0);
        }
    }
public void insertData(ArrayList数据类型,字符串[][]数据值){
试试{
c、 设置自动提交(错误);
//创建insert语句
String insertDataScript=“插入“+tableName+”值(”;
对于(int q=0;q
我的第一个建议是在将数据插入数据库之前对其进行重复数据消除。(Edit:完全忽略了“已在数据库中”部分,因此这可能不起作用,除非您希望在每次插入之前执行查询。也许您可以使用
insert IGNORE
?)

如果由于无法控制主键或无法忽略插入中的重复项而无法执行此操作,则可以捕获特定的异常类型并继续程序,而不是调用
系统。退出
。为了做到这一点,您可能需要准备更小的语句,并将try/catch放在for循环中的“data\u values”


下面是一篇关于捕获此类异常的帖子:。

我的第一个建议是在将数据插入数据库之前消除重复数据。(Edit:完全忽略了“已在数据库中”部分,因此这可能不起作用,除非您希望在每次插入之前执行查询。也许您可以使用
insert IGNORE
?)

如果由于无法控制主键或无法忽略插入中的重复项而无法执行此操作,则可以捕获特定的异常类型并继续程序,而不是调用
系统。退出
。为了做到这一点,您可能需要准备更小的语句,并将try/catch放在for循环中的“data\u values”

下面是一篇关于捕获此类异常的帖子:。

INSERT或IGNORE 简单地更改(虽然不是真正的异常处理,而是异常绕过)

考虑以下演示(相当于建议的,然后是您当前拥有的):-

  • rowid用于方便,因为它基本上是内置主键

  • 指定列的唯一原因,即
    (rowid,othercolumn,mydatecolumn)
    ,是因为rowid通常是隐藏的。在您的情况下,仅值(不包括前面的列)将期望所有列的值,因此包括定义的主键列

  • 以相反的顺序显示/操作,因为两者可以一起运行

:-

结果:-

INSERT OR IGNORE INTO mytable (rowid,othercolumn,mydatecolumn) -- rowid is a PRIMARY KEY as such
    VALUES
        (10,'x','x'),
        (11,'x','x'),
        (12,'x','x'),
        (13,'x','x'),
        (14,'x','x'),
        (10,'x','x')
> Affected rows: 5
> Time: 0.208s
i、 e.6个中的5个被添加到第6个,一个副本(根据主键)被跳过

INSERT INTO mytable (rowid,othercolumn,mydatecolumn) -- rowid is a PRIMARY KEY as such
    VALUES
        (20,'x','x'),
        (21,'x','x'),
        (22,'x','x'),
        (23,'x','x'),
        (24,'x','x'),
        (20,'x','x')
> UNIQUE constraint failed: mytable.rowid
> Time: 0.006s
i、 e.由于1个重复,因此未插入任何内容

插入或替换(可能有用) 如果希望应用副本中的数据,则可以使用插入或替换,而不是插入或忽略

e、 g.以下内容(在上述内容之后运行,即所有内容都是具有不同数据的重复位):-

然后你会得到:-

INSERT OR REPLACE INTO mytable (rowid,othercolumn,mydatecolumn) -- rowid is a PRIMARY KEY as such
    VALUES
        (10,'xx','x'),
        (11,'x','xx'),
        (12,'aa','x'),
        (13,'x','aa'),
        (14,'x','bb'),
        (10,'cc','x')
> Affected rows: 6
> Time: 0.543s
i、 e.现在所有6个插入都已执行(5行作为第一行更新,最后一行更新两次)。

插入或忽略 简单地更改(虽然不是真正的异常处理,而是异常绕过)

考虑以下演示(相当于建议的,然后是您当前拥有的):-

  • rowid用于方便,因为它基本上是内置主键

  • 指定列的唯一原因,即
    (rowid,othercolumn,mydatecolumn)
    ,是因为rowid通常是隐藏的。在您的情况下,仅值(不包括前面的列)将期望所有列的值,因此包括定义的主键列

  • 以相反的顺序显示/操作,因为两者可以一起运行

:-

结果:-

INSERT OR IGNORE INTO mytable (rowid,othercolumn,mydatecolumn) -- rowid is a PRIMARY KEY as such
    VALUES
        (10,'x','x'),
        (11,'x','x'),
        (12,'x','x'),
        (13,'x','x'),
        (14,'x','x'),
        (10,'x','x')
> Affected rows: 5
> Time: 0.208s
i、 e.6个中的5个被添加到第6个,一个副本(根据主键)被跳过

INSERT INTO mytable (rowid,othercolumn,mydatecolumn) -- rowid is a PRIMARY KEY as such
    VALUES
        (20,'x','x'),
        (21,'x','x'),
        (22,'x','x'),
        (23,'x','x'),
        (24,'x','x'),
        (20,'x','x')
> UNIQUE constraint failed: mytable.rowid
> Time: 0.006s
i、 e.没有人是移民
INSERT OR REPLACE INTO mytable (rowid,othercolumn,mydatecolumn) -- rowid is a PRIMARY KEY as such
    VALUES
        (10,'xx','x'),
        (11,'x','xx'),
        (12,'aa','x'),
        (13,'x','aa'),
        (14,'x','bb'),
        (10,'cc','x')
;
INSERT OR REPLACE INTO mytable (rowid,othercolumn,mydatecolumn) -- rowid is a PRIMARY KEY as such
    VALUES
        (10,'xx','x'),
        (11,'x','xx'),
        (12,'aa','x'),
        (13,'x','aa'),
        (14,'x','bb'),
        (10,'cc','x')
> Affected rows: 6
> Time: 0.543s