Fragensteller
Mit ExecuteNonQuery() ein SQL Server Script ausführen

Frage
-
Hallo zusammen,
ich habe mir mit dem SQL Server Managementstudio, ein Script mit Schema einer Datenbank mit allen Tabellen erstellt.
Nun möchte ich das Script gerne verwenden, und mit SqlCommand.ExecuteNonQuery() ausführen, um damit eine neue Datenbank anzulegen.
Allerdings kommt unzählige male der Fehler: Falsche Syntax in der Nähe von 'GO'.
Einzelne "Create Table" usw. Anweisungen gehen schon.
Jedoch möchte ich nicht gerne das Script auseinandermontieren und jeden Befehl einzeln ausführen.Kann mir jemand dazu etwas sagen, wie das Script auszuführen ist.
So dass ich eine Fehlermeldung erhalte, falls etwas schief geht?Gruss Peter
Alle Antworten
-
Hallo Peter,
es sollte doch kein Problem sein das Script in einzelne SQL Anweisungen zu zerlegen und auszuführen. Es wird allerdings schwierig für uns den Fehler zu finden ohne den Code und Scripte zu sehen. Grundsätzlich ist das was du vor hast kein Zauberwerk.
Gruß
Jens
-
Auch das sollte funktionieren.... Ich habe das vor längerer Zeit mal mit dieser Sub gemacht.
Private Sub ExecSQLfromFile(ByVal FileName As String, ByVal conn As SqlClient.SqlConnection, Optional ByVal showerror As Boolean = True) Dim stReader As StreamReader = New StreamReader(FileName, System.Text.Encoding.Default) Dim strBuilder As StringBuilder = New StringBuilder Dim cm As New SqlClient.SqlCommand cm.Connection = conn Dim line As String Try Do While (stReader.Peek() > -1) line = stReader.ReadLine() If String.Compare(line.TrimStart(), 0, "GO", 0, 2, True) = 0 AndAlso String.Compare(line.TrimStart(), 0, "GOTO", 0, 4, True) <> 0 Then If strBuilder.Length > 0 Then cm.CommandText = strBuilder.ToString Try cm.ExecuteNonQuery() Catch ex As Exception '// MsgBox(ex.Message) End Try strBuilder.Length = 0 End If Else strBuilder.Append(line) strBuilder.Append(Environment.NewLine) End If Loop If strBuilder.Length > 0 Then cm.CommandText = strBuilder.ToString Try cm.ExecuteNonQuery() Catch ex As Exception End Try End If Catch ex As Exception '// If showerror Then ' Dim CurrentStack As New StackTrace(ex, True) : clsError.myError(CurrentStack, ex.ToString, True) ' End If Finally stReader.Close() End Try End Sub
Gruß
Jens
-
Hallo Jens,
das trifft den Punkt schon eher.Ich versuche es gerade ähnlich, indem ich ein String.Split verwende und somit auch einzeln übergebe. Aber wenigstens muss ich nicht alles von Hand machen.
Scheint auch zu gehen, sogar Kommentar kann man belassen.Ich schaue mir gerade noch dein Code an.
Danke für dein Schnipsel und Gruss
Peter
-
Eine Möglichkeit besteht anscheinend auch, durch den Aufruf von sqlcmd aus dem Programm.
Gruss Peter
'SQLCMD -S myServer -D myDatabase -U myUser -P myPassword -i myfile.sql
'S: server()
'd: database()
'U: User name, only necessary if you don't want to use Windows authentication
'P: Password, only necessary if you don't want to use Windows authentication
'i: File to run'Code to execute SQL files:
'var startInfo = new ProcessStartInfo();
'startInfo.FileName = "SQLCMD.EXE";
'startInfo.Arguments = String.Format("-S {0} -d {1}, -U {2} -P {3} -i {4}",
' server,
' database,
' user,
' password,
' file);
'Process.Start(startInfo)