1

問題: jackcess を使用してテーブルにレコードを作成および挿入しています。重複したレコードをテーブルに挿入しようとしていますが、できませんでした。

はいの場合に追加しようとしている重複したエントリがあることをキャプチャして、余分な文字列を PK に連結して一意にする方法はありますか。クエリで操作を取得するときは?

現在、以下のコードを使用して DB に挿入しています。

 private static Database createDatabase(String databaseName) throws IOException {
        return Database.create(new File(databaseName));
    }

    private static TableBuilder createTable(String tableName) {
        return new TableBuilder(tableName);
    }

    public static void addColumn(Database database, TableBuilder tableName, String columnName, Types sqlType) throws SQLException, IOException {
        tableName.addColumn(new ColumnBuilder(columnName).setSQLType(Types.INTEGER).toColumn()).toTable(database);
    }

    public static void startDatabaseProcess() throws IOException, SQLException {
        String databaseName = "C:/Users/Alien/Documents/invited/employeedb.mdb"; // Creating an MS Access database
        Database database = createDatabase(databaseName);

        String tableName = "Employee"; // Creating table
        Table table;
        table = createTable(tableName)
          .addColumn(new ColumnBuilder("Emp_Id").setSQLType(Types.INTEGER).toColumn())
          .addColumn(new ColumnBuilder("Emp_Name").setSQLType(Types.VARCHAR).toColumn())
          .addColumn(new ColumnBuilder("Emp_Employer").setSQLType(Types.VARCHAR).toColumn())
          .toTable(database);

        table.addRow(453456, "ilakkiaselvan","google");//Inserting values into the table
    }
4

1 に答える 1

1

はいの場合、追加しようとしている重複したエントリがあることをキャプチャして、追加の文字列を PK に連結し、一意にする方法はありますか

主キーを使用してテーブルをセットアップした場合、主キーが既に存在する行を追加しようとすると、Jackcess は例外をスローします。例外ハンドラ ( catch) は、主キーを微調整して、挿入が成功するまで試行を続けることができます。

あなたのケースでは、PK を整数として定義しているため、「余分な文字列を PK に連結して一意にする」ことは少し面倒ですが、文字列 PK がある場合、コードは非常に単純です。

import java.io.File;
import com.healthmarketscience.jackcess.*;

public class jackcessTest {

    public static void main(String[] args) {
        String newEmp_Id = "GT001";   // test data
        String newEmp_Name = "Gord";  //

        boolean insertedOK = false;
        int counter = 1;
        String insertEmp_Id = newEmp_Id;
        try {
            Table table = DatabaseBuilder.open(new File("C:\\__tmp\\employeedb.mdb")).getTable("Employee");
            while (!insertedOK) {
                try {
                    table.addRow(insertEmp_Id, newEmp_Name);
                    insertedOK = true;
                    System.out.println(String.format("New record inserted as %s", insertEmp_Id));
                } catch (ConstraintViolationException e) {
                    insertEmp_Id = String.format("%s_copy%s", newEmp_Id, counter++);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

空のテーブルで実行すると、通常どおり行が追加されます。

Emp_Id       Emp_Name
-----------  --------
GT001        Gord    

もう一度実行すると、キーが変更された 2 番目のレコードが追加されます。

Emp_Id       Emp_Name
-----------  --------
GT001        Gord    
GT001_copy1  Gord    

...そしてまた...

Emp_Id       Emp_Name
-----------  --------
GT001        Gord    
GT001_copy1  Gord    
GT001_copy2  Gord    

...等々。

于 2013-11-03T09:39:52.457 に答える