2

我尝试使用 powershell 脚本将 csv 文件中的数据插入 mysql 数据库。在LOAD DATA查询中使用(虚拟)变量时,我遇到了麻烦。

可重现的示例:创建一个 Mysql 数据库和表

CREATE DATABASE loadfiletest;
USE loadfiletest;
CREATE TABLE testtable (field1 INT, field2 INT DEFAULT 0);

创建一个名为loadfiletestdata.csv包含的 csv 文件

1,3
2,4

创建 powershell 脚本(不要忘记更改数据库密码和可能的用户名)

[system.reflection.assembly]::LoadWithPartialName("MySql.Data")
$mysqlConn = New-Object -TypeName MySql.Data.MySqlClient.MySqlConnection
$mysqlConn.ConnectionString = "SERVER=localhost;DATABASE=loadfiletest;UID=root;PWD=pwd"
$mysqlConn.Open()
$MysqlQuery = New-Object -TypeName MySql.Data.MySqlClient.MySqlCommand
$MysqlQuery.Connection = $mysqlConn
$MysqlQuery.CommandText = "LOAD DATA LOCAL INFILE 'C:/path/to/files/loadfiletestdata.csv' INTO TABLE loadfiletest.testtable FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '""' LINES TERMINATED BY '\r\n' (field1, field2)"
$MysqlQuery.ExecuteNonQuery()

将所有内容放在文件夹中C:/path/to/files/(也应该是您在 powershell 脚本中的路径)并运行脚本。这会在表格testtable中填充

field1   field2
1        3
2        4

正如人们所期望的那样。这意味着引号之类的应该是这样的。每次执行脚本时,这些值都会插入到表中。(field1, field2)现在,当我将 powershell 脚本的最后一行替换为 时(field1, @dummy),我希望这些值

field1   field2
1        0
2        0

被插入到表中。但是,我收到错误

Exception calling "ExecuteNonQuery" with "0" argument(s): "Fatal error encountered during command execution."
At C:\path\to\files\loadfiletest.ps1:8 char:1
+ $queryOutput = $MysqlQuery.ExecuteNonQuery()
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : MySqlException

@dummy从 mysql 客户端运行查询时,它可以工作。在我看来,语法与mysql 手册中的语法相同(在页面中间的某处,查找@dummy)。

我做了一些进一步的实验,表明任何LOAD DATA包含变量@whatever的查询都会给出错误。

所以问题是:为什么它不起作用?有没有办法LOAD DATA使用 powershell 中的(虚拟)变量执行查询?如果没有,是否有优雅的解决方法?

明显的解决方法是根据表的布局创建中间 csv 文件或创建与 csv 文件布局匹配的中间表。然而,对于恕我直言应该“正常工作”的东西来说,这似乎既丑陋又麻烦。

注意:本题是本题的后续和概括。我选择开始一个新问题,因为替换旧内容会使已经给出的答案过时,并且添加此问题的内容会使旧问题变得冗长且充满无用的支线。

4

1 回答 1

2

我知道这是旧的,但我有同样的问题,我在这里找到了解决方案:http: //blog.tjitjing.com/index.php/2009/05/mysqldatamysqlclientmysqlexception-parameter-id-must-be-defined.html 引用上述博客:“从连接器的 5.2.2 版本开始,您应该添加 Allow User Variables=True 连接字符串设置,以便在 SQL 语句中使用用户定义的变量。

连接字符串示例:

数据库=testdb;数据源=localhost;用户ID=root;密码=hello;允许用户变量=True"

感谢您对我的回答投反对票。

于 2015-03-14T08:10:27.670 回答