none
Mit ExecuteNonQuery() ein SQL Server Script ausführen RRS feed

  • 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

    Montag, 1. September 2014 10:39

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

    Montag, 1. September 2014 10:54
  • Hi Jens,

    so wie es aussieht, sind GO Statements keine SQL Anweisung und werden vom Command Parser abgewiesen.

    Dass ich das Script nicht gerne auseinander nehmen möchte, sondern komplett ausführen, hatte ich ober erwähnt.

    Gruss Peter

    Montag, 1. September 2014 11:18
  • 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

    Montag, 1. September 2014 11:33
  • 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

    Montag, 1. September 2014 12:10
  • 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)

    Montag, 1. September 2014 12:14