我有一个关于PostgreSQL中批量复制命令的问题。例如,我有一个示例命令复制文件CSV表如下
CREATE TEMPORARY TABLE AlterTable (
a1 varchar(50),
a2 varchar(50),
a3 varchar(50),
a4 varchar(50),
a5 varchar(50),
a6 varchar(255),
a7 varchar(255),
a8 varchar(255),
a9 varchar(50),
a10 varchar(50),
a11 varchar(50),
a12 varchar(50),
a13 varchar(50),
a14 varchar(50),
a15 varchar(50),
a16 varchar(50),
a17 varchar(50),
a18 varchar(50),
a19 varchar(50),
a20 varchar(50),
a21 varchar(50));
COPY AlterTable FROM 'D:\1364746_855575_20221001_20221231.csv' DELIMITER ';' CSV HEADER;
字符串
这个命令工作得很好,但是我需要在我的Visual Studio代码中用C#实现这个命令,然后我需要在不同的环境中通过C#代码在开发,登台和产品环境中实现这个命令。我打算在wwwroot文件夹中创建新的csv文件,然后通过wwwroot文件夹中的路径执行上面的命令,如下面的命令
var extension = Path.GetExtension(file.FileName);
var fileName = Path.GetFileNameWithoutExtension(file.FileName)
+ "_" + fileImport.Id.ToString() + extension;
var filePath = $"{AppConstants.SettingKeys.StoredFilesImportingPath}/{fileName}";
if (!Directory.Exists($"wwwroot/{AppConstants.SettingKeys.StoredFilesImportingPath}"))
{
Directory.CreateDirectory($"wwwroot/{AppConstants.SettingKeys.StoredFilesImportingPath}");
}
await using (var streaming = File.Create($"wwwroot//{filePath}"))
{
await file.CopyToAsync(streaming);
}
string getAbsolutePath = Path.GetFullPath($"wwwroot//{filePath}");
型
在我得到getAbsolutePath为'C:\Users{myComputerName}\Desktop{myfolder}{anothermyfolder}{anotheranothermyfolder}\wwwroot\importings\1112223_855575_20220401_20220630_10f7d877-baa 2 -4fcb-8500-88195f9a4596.csv'之后,我将其放入如下命令
CREATE TEMPORARY TABLE AlterTable (
a1 varchar(50),
a2 varchar(50),
a3 varchar(50),
a4 varchar(50),
a5 varchar(50),
a6 varchar(255),
a7 varchar(255),
a8 varchar(255),
a9 varchar(50),
a10 varchar(50),
a11 varchar(50),
a12 varchar(50),
a13 varchar(50),
a14 varchar(50),
a15 varchar(50),
a16 varchar(50),
a17 varchar(50),
a18 varchar(50),
a19 varchar(50),
a20 varchar(50),
a21 varchar(50));
COPY AlterTable FROM 'C:\Users\{myComputerName}\Desktop\{myfolder}\{anothermyfolder}\{anotheranothermyfolder}\wwwroot\importings\1112223_855575_20220401_20220630_10f7d877-baa2-4fcb-8500-88195f9a4596.csv' DELIMITER ';' CSV HEADER;
型
这代表我犯了一个错误
- 错误:无法打开文件“C:\Users{myComputerName}\Desktop{myfolder}{anothermyfolder}{anotheranothermyfolder}\wwwroot\importings\1112223_855575_20220401_20220630_10f7d877-baa 2 -4fcb-8500-88195f9a4596.csv”进行阅读:许可被拒绝提示:COPY FROM指示PostgreSQL服务器进程读取文件。你可能需要一个客户端工具,比如psql的\copy。SQL状态:42501*
谁能帮我解决上面的问题,我真的很绝望。然后我可以在不同的环境中实现它,比如在开发和测试环境中。先谢谢你了。
1条答案
按热度按时间jgwigjjp1#
你正在做的(或者至少看起来正在做的),让我觉得效率很低。您将数据作为流,将其写入物理文件,然后尝试将该文件读入PostgreSQL。
还有其他方法可以解决这个问题。我的答案是here,展示了如何使用内置
COPY
命令的 Package 器将IEnumerable
或DataTable
直接从C#上传到PostreSQL。如果内存中已经有了数据,难道不能简单地从中创建一个对象,然后使用类似于我的代码上传它吗?这比使用服务器的硬盘驱动器要好得多。