Jackcess addRow() не может вставить значение Java 'long'
Я пытаюсь добавить строку с идентификационным номером 3791318595.
long l = 3791318595L;
myTable.addRow(l,"testing");
однако Джекцесс преобразует его в целое число и сокращает до максимального значения:
2147483647.
Как я могу правильно добавить вышеуказанный номер с Jackcess?
1 ответ
Если поле "Идентификационный номер" в таблице доступа определено как Number (Long Integer)
тогда краткий ответ на ваш вопрос:
Ты не можешь
Long Integer
в Access есть 32-разрядное целое число со знаком, максимальное значение которого (2^31)-1, как вы видели. Это Long Integer
в доступе соответствует int
(не long
) на Яве. Значение, которое вы пытаетесь вставить в поле "Доступ", просто не будет соответствовать "как есть", поэтому Jackcess (или любое другое приложение) не сможет это сделать.
Если все ваши "номера идентификаторов" являются положительными целыми числами, то одним из возможных обходных путей будет использование кода, имитирующего 32-разрядные целые числа без знака, заключая значения между 2 147 483 648 и 4 294 967 296 в их неположительные значения со знаком:
long unsignedAdjustment = 4294967296L; // 2^32
long l = 3791318595L; // our test value
if (l > unsignedAdjustment) {
System.out.println("Error: ID value too large to fit, even if wrapped to non-positive integer.");
}
else {
int signedID = 0;
if (l > 2147483647L) { // (2^31)-1
signedID = (int) (l - unsignedAdjustment);
}
else {
signedID = (int) l;
}
myTable.addRow(signedID, "testing");
}
Это сохранит строку в таблице Access с идентификатором -503 648 701. Конечно...
это будет ваш код для выполнения соответствующего преобразования при извлечении строк, и
этот подход имеет очевидные последствия для поиска и упорядочения по "номеру идентификатора"
... но если "id number" на самом деле является просто уникальным идентификатором строки, то это может быть не слишком большим неудобством.