2013-05-24 12 views
5

Ho scritto uno script molto semplice che raccoglie dati da file e cartelle e li carica in un database SQL. Credo che il mio problema sia legato al problema di parameterized sql, ma non capisco come o perché.Lo script Powershell che utilizza ExecuteNonQuery() genera l'eccezione "Sintassi errata vicino a" s "."

penso che quello che devo fare è riformattare la stringa SQL per evitare che alcuni personaggi a entrare.

Qualsiasi aiuto apprezzato.

Ecco il codice:

$Command = New-Object System.Data.SQLClient.SQLCommand 
$Command.Connection = $dbConnection 
$Command.CommandText = "INSERT INTO FileSizeTable (FileName,FileSize,FileNameLength,Date) VALUES ('$i','$items','$temp','$currentDate')" 

$Command.ExecuteNonQuery() 

"INSERT INTO FileSizeTable (FileName,FileSize,FileNameLength,Date) VALUES ('$i','$items','$temp','$currentDate')" 

Ecco l'uscita (ho spinto la stringa di comando SQL con esso come un test):

INSERT INTO FileSizeTable (FileName,FileSize,FileNameLength,Date) VALUES ('ATI Te 
chnologies','61.16 MB','39','05/24/2013 21:05:56') 
ATI Technologies   61.16 MB           39 
1 
INSERT INTO FileSizeTable (FileName,FileSize,FileNameLength,Date) VALUES ('ATIToo 
l','0.00 MB','30','05/24/2013 21:05:56') 
ATITool      0.00 MB           30 
1 
INSERT INTO FileSizeTable (FileName,FileSize,FileNameLength,Date) VALUES ('Auran' 
,'7,496.04 MB','28','05/24/2013 21:05:56') 
Auran      7,496.04 MB          28 
Exception calling "ExecuteNonQuery" with "0" argument(s): "Incorrect syntax near 
's'. 
Unclosed quotation mark after the character string ')'." 
At line:143 char:25 
+       $Command.ExecuteNonQuery() 
+       ~~~~~~~~~~~~~~~~~~~~~~~~~~ 
+ CategoryInfo   : NotSpecified: (:) [], MethodInvocationException 
+ FullyQualifiedErrorId : SqlException 
+1

Uno dei tuoi articoli ha una sola citazione (cioè un apostrofo) nel nome. –

+0

Beh, è ​​stato veloce. Roger aveva ragione, c'era un altro apostrofo di tanto in tanto. Non sono riuscito a vedere l'errore a causa della mia sottosopra. Ho usato la sostituzione per risolvere il problema. $ x = $ x.Replace ("'", "") Ci sono altri personaggi di cui dovrei preoccuparmi? O qualche altro metodo migliore per pulire le mie corde? Per ora funziona. –

+1

La sostituzione del personaggio ti porterà solo così lontano - ma ci sarà * sempre * qualche strano caso limite che manca. Utilizzare una query parametrizzata come il link che hai trovato spiega e la mia risposta dimostra. – alroc

risposta

6

Qualunque sia dati che si sta tentando di inserire dopo che il disco "Auran" ha una singola citazione/apostrofo in esso. Quando si utilizza la concatenazione di stringhe per costruire la query, si tratta di un rischio enorme e si apre agli attacchi di SQL injection.

Incolla la stringa che stai costruendo in SSMS o qualche altro strumento che può darti l'evidenziazione della sintassi SQL e la vedrai.

Il post che hai trovato su Coding Horror fornisce il consiglio/risposta corretta - usa una query parametrizzata e questo va via. La concatenazione delle stringhe per le istruzioni SQL è generalmente scoraggiata in questi giorni per motivi di prestazioni e sicurezza. Per non parlare di essere molto più facile da leggere come codice sorgente.

$Command = New-Object System.Data.SQLClient.SQLCommand 
$Command.Connection = $dbConnection 
$Command.CommandText = "INSERT INTO FileSizeTable (FileName,FileSize,FileNameLength,Date) VALUES (@name,@size,@length,@dt)"; 
$Command.Parameters.Add("@name", $i); 
$Command.Parameters.Add("@size", $items); 
$Command.Parameters.Add("@length", $temp); 
$Command.Parameters.Add("@dt", $currentdate); 
$Command.ExecuteNonQuery(); 
+0

è $ Command.CommandText significava ancora essere in quel blocco di codice? –

+0

Assente qualsiasi altra informazione sullo script, sì. Se stai facendo questo in un ciclo, ti consigliamo di spostarlo al di fuori del ciclo, e invece di usare 'Parameters.Add()' qui, dovrai aggiungere parametri vuoti al di fuori del ciclo e impostarne i valori al suo interno. – alroc

+0

Questo ha molto senso, grazie per l'assistenza. Quando uso il codice come mi hai fornito, ottengo la seguente eccezione. "Il nome della variabile '@ nome' è già stato dichiarato." Ho controllato, e non ci sono altre istanze di @name e cambiandole in @ fname produce lo stesso risultato. Ogni ulteriore assistenza è apprezzata. –

Problemi correlati