来自Powershell的Mysql LOAD DATA带有变量

时间:2013-05-30 12:59:44

标签: mysql powershell csv

我尝试使用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

当从mysql客户端使用@dummy运行查询时,它可以工作。此外,语法对我来说与mysql manual中的内容相同(在页面中间的某处,查找@dummy)。

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

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

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

注意:目前的问题是对this question的跟进和概括。我选择开始一个新的,因为替换旧的内容将使得答案已经过时,并且添加这个问题的内容会使旧的问题变得冗长而充满无用的副本。

1 个答案:

答案 0 :(得分:2)

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

连接字符串示例:

Database = testdb; Data Source = localhost; User Id = root; Password = hello; Allow User Variables = True"

感谢您对我的回答进行投票。