c# - LOAD DATA 本地 INFILE 无法在 .net 核心上工作
问题描述
以下查询在 mysql 中有效。
DROP TEMPORARY TABLE IF EXISTS TempTbl;
create temporary table TempTbl like ACTIVITY;
LOAD DATA local INFILE 'C:\\test\\000000135_20190109133919.flat'
INTO TABLE TempTbl COLUMNS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 LINES;
但是当我尝试在 .net core 中运行时,出现以下错误。我该如何解决?
var db = new RheEntities(Utils.GetAppSettingsByKey("ConnectionStrings:RheConnection"));
var query = System.IO.File.ReadAllText(Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "App_Data/BulkInsertTemplate.sql"));
db.Database.ExecuteSqlCommand(query);
异常消息:
Error during LOAD DATA LOCAL INFILE
堆栈跟踪:
at MySql.Data.MySqlClient.MySqlDataReader.ActivateResultSet(ResultSet resultSet) in C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient\MySqlDataReader.cs:line 80
at MySql.Data.MySqlClient.MySqlDataReader.ReadFirstResultSetAsync(IOBehavior ioBehavior) in C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient\MySqlDataReader.cs:line 302
at MySql.Data.MySqlClient.MySqlDataReader.CreateAsync(MySqlCommand command, CommandBehavior behavior, ResultSetProtocol resultSetProtocol, IOBehavior ioBehavior) in C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient\MySqlDataReader.cs:line 287
at MySqlConnector.Core.TextCommandExecutor.ExecuteReaderAsync(String commandText, MySqlParameterCollection parameterCollection, CommandBehavior behavior, IOBehavior ioBehavior, CancellationToken cancellationToken) in C:\projects\mysqlconnector\src\MySqlConnector\Core\TextCommandExecutor.cs:line 37
at MySql.Data.MySqlClient.MySqlCommand.ExecuteNonQueryAsync(IOBehavior ioBehavior, CancellationToken cancellationToken) in C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient\MySqlCommand.cs:line 261
at MySql.Data.MySqlClient.MySqlCommand.ExecuteNonQuery() in C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient\MySqlCommand.cs:line 62
at Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.Execute(IRelationalConnection connection, DbCommandMethod executeMethod, IReadOnlyDictionary`2 parameterValues)
at Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.ExecuteNonQuery(IRelationalConnection connection, IReadOnlyDictionary`2 parameterValues)
at Microsoft.EntityFrameworkCore.RelationalDatabaseFacadeExtensions.ExecuteSqlCommand(DatabaseFacade databaseFacade, RawSqlString sql, IEnumerable`1 parameters)
at Microsoft.EntityFrameworkCore.RelationalDatabaseFacadeExtensions.ExecuteSqlCommand(DatabaseFacade databaseFacade, RawSqlString sql, Object[] parameters)
内部异常:
Use SourceStream or SslMode >= VerifyCA for LOAD DATA LOCAL INFILE
细节:
.Net 核心 2.2
Microsoft.EntityFrameworkCore 2.2.1
Pomelo.EntityFrameworkCore.MySql 2.1.4
MySqlConnector 0.47.1
解决方案
这是 MySqlConnector 中的一个安全特性;见问题 334。由于您没有连接到经过验证的主机,MySqlConnector 可以防止信息泄露漏洞,该漏洞可能让恶意服务器/代理读取您系统上的任何本地文件。
LOCAL 版本的 LOAD DATA 存在两个潜在的安全问题:
- 文件从客户端主机到服务器主机的传输由 MySQL 服务器发起。理论上,可以构建一个打补丁的服务器,它会告诉客户端程序传输服务器选择的文件,而不是客户端在 LOAD DATA 语句中指定的文件。这样的服务器可以访问客户端用户具有读取访问权限的客户端主机上的任何文件。
MySqlBulkLoader
您可以通过使用类而不是自己构建 SQL 来解决它:
var loader = new MySqlBulkLoader(db.Database)
{
FileName = "C:\\test\\000000135_20190109133919.flat",
TableName = "TempTbl",
FieldTerminator = ",",
FieldQuotationCharacter = '"',
NumberOfLinesToSkip = 1,
};
loader.Load();
推荐阅读
- c# - WPF 应用程序的 Application Insights 采样
- weblogic12c - JDEV 12.2.1.4 集成 Weblogic 未运行
- azure - 通过 azure-cli 监控 azure-iot 部署
- git - 解决冲突时无法使用 Sourcetree 进行 Git Rebase
- ios - 收到 Firebase 注册令牌但未显示通知
- python - 对一列进行一些操作后,如何在熊猫数据框中选择多列?
- git - Git报告合并冲突,但大块头是相同的
- flutter - 防止 SliverAppBar 标题在 Flutter 中收缩时换行
- python - 如何绘制谷歌或工具车辆路线问题解决方案?
- c# - 在 C# 和 Powershell 中运行 Powershell 的行为不同