2016-08-22 55 views
0

我遇到了一些问题,一直出现错误消息,我找不到原因。在导入时将CSV导入到本地主机错误

我正在尝试构建一个在我的PC上利用WAMP的数据库功能来存储和操作数据而不是使用MS Access的进程。

下面的脚本包含我一直在处理的当前powershell脚本,它创建一个新的数据库和表来包含我的CSV数据,但是当我试图将CSV数据插入新创建的表格时,有两个重复的错误。

The property 'CommandText' cannot be found on this object. Verify that the property exists and can be set.

而且

Cannot convert value ",'" to type "System.Int32". Error: "Input string was not in a correct format."

我只是茫然地如何纠正这一点,为什么它抛出的错误,这是有目共睹的人吗?

$CL2Location = 'L:\Controls\BROKER CASH RECONCILIATIONS\cl2cashpositions-331-Corrected.csv' 
$dbnameone = "brokerreconciliation" 

[system.reflection.assembly]::LoadWithPartialName("MySql.Data") 
$mysqlConn = New-Object -TypeName MySql.Data.MySqlClient.MySqlConnection 
$mysqlConn.ConnectionString = "SERVER=localhost;DATABASE=brokerreconciliation;UID=root;PWD=''" 
$mysqlConn.Open() 

$ccmd = New-Object MySql.Data.MySqlClient.MySqlCommand 
$ccmd.Connection = $mysqlConn 
$ccmd.CommandText = "DROP DATABASE IF EXISTS " + $dbnameone 
$ccmd.ExecuteNonQuery() 

$ccmd.CommandText = 'CREATE SCHEMA `' + $dbnameone + '`' 
$ccmd.ExecuteNonQuery() 

$dbonetablescript = @" 
    CREATE TABLE brokerreconciliation.CL2 (
    `ID` MEDIUMINT(8) unsigned NOT NULL auto_increment, 
    `CL2ACCOUNTCODE` varchar(255) default NULL, 
    `ACBALANCE` varchar(255) default NULL, 
    `PARNAME1` varchar(255) default NULL, 
    PRIMARY KEY (`ID`) 
    ) AUTO_INCREMENT=1; 
"@ 

$ccmd.CommandText = $dbonetablescript 
$ccmd.ExecuteNonQuery() 

$ccmd = New-Object MySql.Data.MySqlClient.MySqlCommand 
$ccmd.Connection = $mysqlConn 
$ccmd.CommandText = "truncate table " + $dbnameone + ".CL2;" 
$ccmd.ExecuteNonQuery() 
foreach ($i in Import-Csv $cl2location) { 
    $cmd.CommandText = 
     "INSERT INTO customers (id,cl2accountcode,acbalance,parname1) VALUES (" 
     +$i.id+",'"+$i.cl2accountcode+"','"+$i.acbalance+"','"+$i.parname+"');" 
    $cmd.ExecuteNonQuery() 
} 

Import-Csv $CL2Location ##Added to ensure that the data file was being reached it is 

$mysqlConn.Close() 

示例CSV数据的链接是here

试图解决此问题我试图直接从通过初始SQL查询创建的数据表中写入数据,以减少我需要的步骤数量。下面的代码是更新,即使直接使用结果集,当我尝试将数据上载到本地主机时,我仍然遇到相同的错误。

我也编辑了CREATE TABLE元素来完全匹配基础数据库的模式,以确保没有任何问题导致此问题。

对于我如何无法将信息从CSV或脚本传递到本地主机上新创建的表,我仍然感到不知所措。

[System.Reflection.Assembly]::LoadWithPartialName("Sql.Data") 
$null = [Reflection.Assembly]::LoadWithPartialName("WindowsBase") 

##################### 
## - CREDENTIALS - ## 
##################### 

$MISA = 'xx.xx.x.xx' 

$userName = 'IR' 
$PassWord = 'IR' 
$DB = 'IR' 
$timeout = 0 

###### - StopWatch - ###### 

$timeout2 = new-timespan -Minutes 5 
$sw = [diagnostics.stopwatch]::StartNew() 

##### sql #### 

### MIS CL2 ### 

$CL2CashPositionsScript = @' 
SELECT CL2ACCOUNTCODE, sum(CAST(CL2ACCOUNTBALANCE AS MONEY)) AS CBALANCE, PARNAME1 
FROM T5CASHL2 CL2 LEFT OUTER JOIN T5PARTICIPANT PAR 
ON PAR.PARPDRPARTICIPANTID = CL2.CL2ACCOUNTCODE 

WHERE CL2CLIENTNUM not like '315' 
--AND CL2ACCOUNTCODE = '331' 

GROUP BY CL2ACCOUNTCODE, PARNAME1, PARNAME2 
ORDER BY CL2ACCOUNTCODE ASC 
'@ 

## CREATE MIS CREDENTIALS ## 
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection("Connection Timeout=0") 
$SqlConnection.ConnectionString = "Data Source=$MISA;Initial Catalog=$DB; 
Initial Catalog=$DB;User ID=$userName;Password=$PassWord;" 

## - Runs Script from Set Location 

$SqlCmd = New-Object System.Data.SqlClient.SqlCommand; 
$SqlCmd.CommandTimeout=$timeout; 
$SqlCMD.CommandText = $CL2CashPositionsScript; 
$SqlCmd.Connection = $SqlConnection; 

## - Extract Data and build sql data object 

$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter; 
$SqlAdapter.SelectCommand = $SqlCmd; 
$DataSet = New-Object System.Data.DataSet; 
$SqlAdapter.Fill($DataSet); 
$DataSetTable = $DataSet.Tables["Table"]; 

####### 

$CL2Location = 'L:\Controls\BROKER CASH RECONCILIATIONS\cl2cashpositions-331-Correctedb.csv' 
$dbnameone = "brokerreconciliation" 

[System.Reflection.Assembly]::LoadWithPartialName("MySql.Data") 
$mysqlConn = New-Object -TypeName MySql.Data.MySqlClient.MySqlConnection 
$mysqlConn.ConnectionString = "SERVER=localhost;DATABASE=brokerreconciliation;UID=root;PWD=''" 
$mysqlConn.Open() 

$ccmd = New-Object MySql.Data.MySqlClient.MySqlCommand 
$ccmd.Connection = $mysqlConn 
$ccmd.CommandText = "DROP DATABASE IF EXISTS " + $dbnameone 
$ccmd.ExecuteNonQuery() 

$ccmd.CommandText = 'CREATE SCHEMA `' + $dbnameone + '`' 
$ccmd.ExecuteNonQuery() 

$dbonetablescript = @" 
    CREATE TABLE brokerreconciliation.CL2 (
    `ID` MEDIUMINT(8) unsigned NOT NULL auto_increment, 
    `CL2ACCOUNTCODE` char(12) default NULL, 
    `CBALANCE` char(20) default NULL, 
    `PARNAME1` varchar(30) default NULL, 
    PRIMARY KEY (`ID`) 
    ) AUTO_INCREMENT=1; 
"@ 

$ccmd.CommandText = $dbonetablescript 
$ccmd.ExecuteNonQuery() 

$ccmd = New-Object MySql.Data.MySqlClient.MySqlCommand 
$ccmd.Connection = $mysqlConn 
$ccmd.CommandText = "truncate table " + $dbnameone + ".CL2;" 
$ccmd.ExecuteNonQuery() 
foreach ($i in $DataSetTable) { 
    $ccmd.CommandText = 
     "INSERT INTO customers (cl2accountcode,cbalance,parname1) VALUES (" 
     +$i.cl2accountcode+"';'"+$i.cbalance+"';'"+$i.parname+"');" 
    $ccmd.ExecuteNonQuery() 
} 

$mysqlConn.Close() 
+0

在'foreach($ i中的Import-Csv $ cl2location)'块中,您拼写了'$ cmd',缺少'c' –

+0

变量名应该是'$ ccmd',而不仅仅是'$ cmd'。另外,您可能需要[直接导入CSV](https://dev.mysql.com/doc/refman/5.7/en/load-data。HTML)而不是做多个插入。 –

+0

嗨,大家好,是的,我注意到了$ ccmd错误并更新了它,但即使更新也存在相同的错误。我尝试过以各种方式格式化csv,但它拒绝插入。 –

回答

1

你不能完成的字符串是这样的:

$ccmd.CommandText = 
    "INSERT INTO customers (cl2accountcode,cbalance,parname1) VALUES (" 
    +$i.cl2accountcode+"';'"+$i.cbalance+"';'"+$i.parname+"');" 

的PowerShell将解释

$ccmd.CommandText = 
    "INSERT INTO customers (cl2accountcode,cbalance,parname1) VALUES (" 

+$i.cl2accountcode+"';'"+$i.cbalance+"';'"+$i.parname+"');" 

单独的语句,因为前两行是一个完整的声明d自己。因为+$i.cl2accountcode(即$null + [int])变成了一个整数,并且[int] + [string]仅在字符串可以转换为整数(对于字符串​​3210不是这种情况)时才有效,所以第三行会抛出错误。

为了使字符串连接工作跨越你需要或者逃避线的线条打破

$ccmd.CommandText = 
    "INSERT INTO customers (cl2accountcode,cbalance,parname1) VALUES (" ` 
    +$i.cl2accountcode+"';'"+$i.cbalance+"';'"+$i.parname+"');" 

或将连接符在该行的末尾(这样的PowerShell知道有更多的惊喜)

$ccmd.CommandText = 
    "INSERT INTO customers (cl2accountcode,cbalance,parname1) VALUES (" + 
    $i.cl2accountcode+"';'"+$i.cbalance+"';'"+$i.parname+"');"