В коде может быть несколько проблем.
Во-первых, вы используете LocalDateTime.now().toString()
как часть имени файла CSV, в котором будет сохранена информация. Это даст вам что-то вроде:
2021-05-02T23:42:03.282
В некоторых операционных системах — вы упомянули MacOS, но она должна позволить вам создать файл с таким именем — это имя может быть возможной причиной проблем; рассмотрите возможность использования чего-то менее подверженного ошибкам, например System.currentTimeMillis
:
String filename = "table_name" + System.currentTimeMillis() + ".csv";
ExportUtil.exportFile(db, "table_name", new File(filename));
Сказав это, пожалуйста, имейте в виду, что в функции AWS Lambda вам, вероятно, потребуется хранить свои результаты во внешнем хранилище, обычно S3: у вас есть возможность записи в файловую систему, но обычно это имеет значение при работе с временными файлами, не с постоянным хранилищем. Пожалуйста, рассмотрите, например, следующий фрагмент кода.
// Here you can have a problem as well when trying to access the filesystem
// to read the Access file, but the API does not give you another option
// Probably deploying (https://docs.aws.amazon.com/lambda/latest/dg/lambda-java.html)
// your lambda function as a container (https://docs.aws.amazon.com/lambda/latest/dg/java-image.html)
// and include your database file
Database db = DatabaseBuilder.open(new File("java-runtime/src/access_db_file.accdb"));
System.out.println(db.getTableNames());
String filename = "table_name" + System.currentTimeMillis() + ".csv";
// Instead of writing to a file, write to a byte array through a writer
try (ByteArrayOutputStream output = new ByteArrayOutputStream();
BufferedWriter writer = new BufferedWriter(
new OutputStreamWriter(output));
) {
// Dump data
ExportUtil.exportWriter(db, "table_name", writer);
// Just in case
writer.flush();
// Get actual information
byte[] data = output.toByteArray();
// Save data to S3: please, consider refactor and organize the code
S3Client s3 = ...; // Initialize as appropriate
String bucketName = "your-bucket";
String objectKey = filename; // object key, same as filename, for example
// Perform actual S3 request
PutObjectResponse response = s3.putObject(
PutObjectRequest.builder()
.bucket(bucketName)
.key(objectKey)
.build(),
RequestBody.fromBytes(data)
);
} catch (IOException e) {
e.printStackTrace();
}
С совершенно другой точки зрения проблема может быть вызвана тем, что table_name
является связанная таблица. Когда вы создаете связанную таблицу, вам необходимо указать путь к связанной информации: в вашем случае, вероятно, эта информация хранится в C:\Users\john.doe.ctr\Desktop\Work\table_name
на исходном компьютере вашего клиента.
Если у вас есть программа MS Access, вы можете проверить, действительно ли это проблема, с помощью Диспетчер связанных таблиц.
Если у вас нет программы MS Access, вы можете также используйте класс Database
. Пожалуйста, рассмотрите следующий пример:
Database db = DatabaseBuilder.open(new File("java-runtime/src/access_db_file.accdb"));
Table table = db.getTable("table_name");
boolean isLinkedTable = db.isLinkedTable(table);
Если таблица связана, вам нужны две вещи: с одной стороны, сама связанная информация, а с другой, вам нужно обеспечить удобную реализацию LinkResolver
, вероятно, путем расширения CustomLinkResolver
. Этот интерфейс в основном предоставляет вам возможность сопоставить расположение связанной таблицы с другим путем. Пожалуйста, обратите внимание на обзор этот тест для удобного примера такой реализации.
Например, подумайте примерно так:
public class RemapLinkResolver implements LinkResolver {
// Maintain a correspondence between the original linked db file
// and the same db in your new filesystem
private Map<String, String> dbLinkeeFileRemap = new HashMap<>();
public void remap(String originalLinkeeFileName, String newLinkeeFileName) {
this.dbLinkeeFileRemap.put(originalLinkeeFileName, newLinkeeFileName);
}
@Override
public Database resolveLinkedDatabase(Database linkerDb,
String linkeeFileName)
throws IOException {
// if linker is read-only, open linkee read-only
boolean readOnly = ((linkerDb instanceof DatabaseImpl) ?
((DatabaseImpl)linkerDb).isReadOnly() : false);
String newLinkeeFileName = this. dbLinkeeFileRemap.get(linkeeFileName);
if (newLinkeeFileName != null) {
return new DatabaseBuilder(new File(newLinkeeFileName))
.setReadOnly(readOnly).open();
}
// Fallback to default
return LinkResolver.DEFAULT.resolveLinkedDatabase(linkerDb, linkeeFileName);
}
}
Затем используйте его в своем коде:
Database db = DatabaseBuilder.open(new File("java-runtime/src/access_db_file.accdb"));
RemapLinkResolver linkResolver = new RemapLinkResolver();
linkResolver.remap(
"C:\Users\john.doe.ctr\Desktop\Work\table_name",
"java-runtime/src/table_name.accdb"
);
db.setLinkResolver(linkResolver);
// Continue as usual
Надеюсь, вы поняли идею, пожалуйста, адаптируйте пути и, в целом, код соответствующим образом.
person
jccampanero
schedule
02.05.2021
Table table = db.getTable("table_name")
? - person Olivier   schedule 03.05.2021