2016-07-01 7 views
0

Ich versuche, einen Benutzer in einer Datenbank basierend auf einer Anmeldung auf dem SQL Server-Stamm zu erstellen, aber ich bekomme immer Syntaxfehler. Ich sehe kein Problem in dieser einfachen Abfrage, es sei denn, SqlCommand erfordert eine andere Art von Syntax als tatsächliche T-SQL in SSMS tut.Falsche Syntax in der Nähe von GO (Erstellen von Benutzern basierend auf der Anmeldung)

var cmd = new SqlCommand("USE " + databaseName + " GO CREATE USER [" + txtUser.Text + "] FOR LOGIN [" 
       + txtUser.Text + "] GO", conn); 

Meine Verbindungszeichenfolge wie folgt aussieht

private string GetConnectionString(string initialCatalog = "") 
    { 
     return "Data Source=" + txtInstance.Text.Trim() + ";User ID=" + txtUser.Text.Trim() + 
      ";" + (initialCatalog != "" ? "Initial Catalog=" + initialCatalog : "") 
      + "Password=" + txtPass.Text.Trim() + ";Network Library=dbmssocn;"; 
    } 

ich es nicht bin vorbei ein initialCatalog

Ich versuche haben die USE Anweisung vom eigentlichen Befehl Text zu entfernen und stattdessen den DB-Name passt am besten zu GetConnectionString Methode, um es als den ursprünglichen Katalog zu setzen, aber dann bekomme ich Anmeldung fehlgeschlagen für Benutzer x

Ich nehme an, dies ist, weil der Benutzer nicht in der angegebenen Datenbank ist. Angesichts der Tatsache, dass Benutzer x ist ein Login auf SQL-Server mit vollen Rechten, wie kann ich einen Benutzer in einer Datenbank innerhalb SQL-Server mit dieser Anmeldung mit vollen Rechten verbunden erstellen?

EDIT
ich weiß, dass mein Code-Injection-Angriffe anfällig ist; Dies ist jedoch eine interne Helfer-App, die ich wahrscheinlich nur verwenden werde.

+0

, die nicht zu arbeiten schien. Am Ende habe ich Andys Antwort benutzt. Hoffte, alles in einem "ExecuteNonQuery" zu bekommen, aber es ist nicht wichtig für eine kleine App wie diese – Adrian

+0

'GO' ist eine Funktion von Sql Management Studio, es ist nicht Teil von Tsql. Sie müssen manuell von Hand in Chargen aufgeteilt werden. Sie müssen nicht 'SqlCommand'-Objekte trennen, Sie können dasselbe verwenden, aktualisieren Sie einfach die' cmd.CommandText'-Eigenschaft und rufen dann 'ExecuteNonQuery' auf. –

+1

Sie können auch [' SqlConnectionStringBuilder'] finden (https: // msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnectionstringbuilder(v=vs.110).aspx) zuverlässiger zum Erstellen von Verbindungszeichenfolgen als die Zeichenfolgeneindämmung, Sie möchten möglicherweise nachsehen. –

Antwort

0

Besser Sie ausführen sowohl die Abfragen separat

var cmd = new SqlCommand("USE " + databaseName , conn); 
cmd.ExecuteNonQuery(); 

cmd = new SqlCommand("CREATE USER [" + txtUser.Text + "] FOR LOGIN [" 
      + txtUser.Text + "]", conn); 
cmd.ExecuteNonQuery(); 
+0

Es ist nicht notwendig, neue Befehle zu erstellen. Aktualisieren Sie einfach die 'CommandText'-Eigenschaft. –

+0

Ja richtig !!! – andy

+0

@ScottChamberlain das habe ich gemacht :) – Adrian