2016-08-22 10 views
0

Ich habe einige Probleme mit einer Fehlermeldung, die immer wieder aufkommt und ich kann warum nicht finden.Import CSV zu localhost Fehler beim Import

Ich versuche, einen Prozess zu erstellen, der die Datenbankfunktionalitäten von WAMP auf meinem PC verwendet, um Daten zu speichern und zu bearbeiten, anstatt MS Access zu verwenden.

Das folgende Skript enthält das aktuelle Powershell-Skript, an dem ich gearbeitet habe und das eine neue Datenbank und Tabelle für meine CSV-Daten erstellt, wenn ich versuche, die CSV-Daten in die neu erstellte Tabelle einzufügen mit zwei sich wiederholenden Fehlern.

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

Und

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

Ich bin einfach mit einem Verlust, wie dies zu korrigieren und warum es Fehler zu werfen, das ist für jeden offensichtlich?

$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() 

Link zu den CSV-Beispieldaten ist here.

Versuchen, dieses Problem zu beheben Ich habe versucht, die Daten direkt aus der Datentabelle schreiben über die anfängliche SQL-Abfrage erstellt, um die Anzahl der Schritte zu reduzieren, die ich benötigen würde. Der folgende Code ist das Update, selbst wenn ich das Resultset direkt verwende, treffe ich immer noch dieselben Fehler, wenn ich versuche, die Daten auf den lokalen Host hochzuladen.

Ich habe auch das CREATE TABLE Element bearbeitet, um das Schema der Basisdatenbank genau zu entsprechen, um sicherzustellen, dass nichts damit das Problem verursacht hat.

Ich bin immer noch ratlos, wie ich die Informationen von CSV oder Skript nicht an eine neu erstellte Tabelle auf localhost übergeben kann.

[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

Im Satz 'foreach ($ i im Import-Csv $ cl2location)' buchstabieren Sie '$ cmd' mit einem fehlenden' c' –

+0

Der Variablenname sollte '$ ccmd' sein, nicht nur' $ cmd'. Vielleicht möchten Sie auch [CSV direkt importieren] (https://dev.mysql.com/doc/refman/5.7/en/load-data).html) anstelle von mehreren Einfügungen. –

+0

Hi Leute, ja ich hatte den $ ccmd Fehler bemerkt und aktualisiert, aber die gleichen Fehler bestehen auch beim Update. Ich habe versucht, den csv auf verschiedene Arten zu formatieren, aber es weigert sich einzufügen. –

Antwort

1

Sie können nicht Strings wie diese wickeln:

$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 (" 

und

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

als separate Aussagen interpretieren, da die ersten beiden Linien sind eine vollständige Aussage in einem d für sich. Die dritte Zeile löst dann einen Fehler aus, weil +$i.cl2accountcode (d. H. $null + [int]) zu einer Ganzzahl wird und [int] + [string] nur gültig ist, wenn die Zeichenfolge in eine Ganzzahl umgewandelt werden kann (was für die Zeichenfolge ';' nicht der Fall ist).

Um die String-Verkettung Arbeit über die Leitungen müssen Sie entweder entkommen die Linie brechen

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

oder setzen Sie den Verkettungsoperator am Ende der Zeile (so Powershell weiß, dass es mehr zu kommen)

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