2016-03-18 19 views
0

Wenn ich SqlCommand.ExecuteNonQuery() verwenden und seine CommandText hat eine GO (commit) es, ich bekomme eine SQLException.Verwenden GO (commit) in einem SqlCommand.ExecuteNonQuery()

Ich habe es entfernt und die SQL funktionierte, aber die ganze SQL hat viele Anweisungen und ich möchte nach jedem von ihnen commit ausführen. Und ich möchte sie nicht in mehrere SqlCommand Objekte teilen.

Gibt es eine bessere Lösung zu halten und ein einzigartiges SqlCommand Objekt zu halten?

Antwort

7

GO ist nicht fest, es ist das Batch-Trennzeichen. Sie müssen Ihren Befehls-Batch in Blöcke aufteilen und das GO weglassen, um sie mit SqlCommand.ExecuteNonQuery() ausführen zu können.

Die Transaktionsverarbeitung erfolgt unabhängig voneinander. Wenn Sie mehrere Befehle in einer Schleife ausführen, können Sie sie alle im selben ausführen, eine neue Transaktion für jede Iteration starten oder die SqlCommand.Transaction-Eigenschaft nicht zugewiesen lassen.

+0

Dank. Entschuldigung, ich habe nicht verstanden, was du meinst. Schlägst du vor, die SQL-Zeichenfolge in mehreren Läufen zu teilen, oder? Ich wollte alle Operationen in einer eindeutigen Zeichenkette behalten und 'SqlCommand.ExecuteNonQuery()' einmal für alle ausführen. Ist das wirklich unmöglich? – Hikari

+0

Es ist möglich, aber Sie müssen die "GO" -Linien entfernen. "GO" ist nicht dasselbe wie ein Transaktions-Commit. 'GO' wird von Batch-Skript-Prozessoren (osql, SQL Studio-Skript) interpretiert, um den Code als Einheit auszuführen, sodass Sie beispielsweise mehrere DDL-Anweisungen wie' CREATE VIEW' verketten können, was sonst nicht möglich ist. Wenn Sie also das "GO" entfernen, besteht die Gefahr, dass das resultierende Skript fehlschlägt. Ich empfehle eine Schleife. Sie können immer noch dasselbe 'SqlCommand'-Objekt wiederverwenden, weisen Sie einfach den' CommandText' neu zu, mit vernachlässigbarer Leistungseinbuße. – dlatikay

+0

Also sind Protokolle nicht an MDF-Dateien gebunden, wenn ein 'GO'-Befehl ausgeführt wird? Wenn das der Fall ist, werde ich es einfach entfernen und so sei es. – Hikari

1

Hier ist meine Powershell-Lösung:

[Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo") > $null 
[Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.ConnectionInfo") > $null 
$cnSQL=New-Object System.Data.SqlClient.SqlConnection("Server=$($env:COMPUTERNAME)\$InstanceName;Database=master;User Id=$User;Password=$Pwd") 
$cnServer=New-Object Microsoft.SqlServer.Management.Common.ServerConnection($cnSQL) 
$strSQL=Get-Content -Path "sqlFile.txt" | Out-String 
$cnServer.ExecuteNonQuery($strSQL) > $null 
$cnSQL.Close()