2016-04-11 13 views
1

Ich möchte eine öffentliche Verbindungszeichenfolge, die aus Textfeldtext aufgefüllt wird.Öffentliche SQL-Verbindungszeichenfolge mit Feldinitialisierung

public static string conString ="server=" + tb_serverinfo.Text + "; database=master;user=" + tb_user.Text + ";pwd=" + tb_password.Text + ";Connection Timeout=5"; 

Das wird nicht funktionieren aufgrund

Severity Code Beschreibung Projektdatei Zeilenunterdrückungszustand CS0236 Fehler A Feldinitialisierer nicht die nicht-statische Feld, Methode oder Eigenschaft ‚Database_Tool.tb_serverinfo referenzieren 'Die Datenbank-Tool C: \ Benutzer ... 120 Aktive

ich bin neu in C#, so kann ich nicht immer, was ich tun müssen, um mein Problem zu lösen.

Schließlich möchte ich eine öffentliche SQL-Verbindung, so dass ich nur eine try Anweisung und conn.open überall tun kann, aber ich werde versuchen und später daran arbeiten.

Danke!

+0

Ich schlage vor, Sie lesen über den Unterschied zwischen statischen Feldern und Instanzfeldern im Grunde. Ich würde auch empfehlen, eine öffentliche SqlConnection-Variable zu haben - stattdessen könnten Sie eine Methode haben, die bei Bedarf eine SqlConnection öffnet und dann von wo auch immer Sie anrufen, aber die Verbindung schließen, wenn Sie mit dieser Operation fertig sind. –

+0

@JonSkeet Ich werde darüber nachlesen, danke. Genau das möchte ich tun, öffnen und schließen in einem Versuch. – SCramphorn

Antwort

3

Der Fehler scheint ziemlich klar zu sein. Sie versuchen, eine statische (gleiche für alle Instanzen) Variable von nicht statischen (für verschiedene Instanzen unterschiedlichen) Daten zu initialisieren. Klingt wie Sie eine nicht-statische Funktion oder Eigenschaft müssen die Verbindungszeichenfolge bauen:

public string conString 
{ 
    get{ 
     return "server=" 
      + tb_serverinfo.Text 
      + "; database=master;user=" 
      + tb_user.Text 
      + ";pwd=" 
      + tb_password.Text 
      + ";Connection Timeout=5"; 
    } 
} 

Irgendwann würde ich eine öffentliche SQL-Verbindung wie ...

schlechte Idee. Verbindungen werden von .NET gepoolt. Daher ist die Erstellung eines Prozesses in der Regel kein teurer Prozess. Anstatt Energie zu verschwenden, versuchen Sie herauszufinden, ob Ihre "geteilte" Verbindung offen ist, setzen Sie die Verbindungszeichenfolge usw. Es ist besser, einfach eine zu erstellen, wenn Sie sie brauchen, sie zu öffnen, Ihre Sachen zu erledigen und sie zu entsorgen es) wenn du fertig bist.

Eine effiziente Art und Weise zu tun, ist mit einem using Block:

using(var conn = new SqlConnection(conString)) 
{ 
    using(var cmd = new SqlCommand(sql, conn)) 
    { 
     conn.Open(); 
     ... use the command 
    } // cmd is disposed 
} // conn is disposed 

Auf diese Weise alles schön aufgeräumt ist, auch wenn es eine Ausnahme.

+0

Vielen Dank! Wäre es möglich, eine if-Anweisung zu haben, um festzustellen, ob diese Parameter einer Verbindung verwendet werden? Ich möchte der Benutzer in der Lage sein, ein Kontrollkästchen für SQL-Authentifizierung/Windows haben, d. H. IF checkbox.ticked = true, dann verwenden Sie diese Zeichenfolge, sonst verwenden Sie eine andere? – SCramphorn

+0

Sicher - Sie könnten zwei verschiedene Eigenschaften haben, oder eine Funktion, die alle möglichen Parameter übernimmt und die passende Zeichenkette oder etwas anderes zurückgibt. Versuchen Sie etwas und kommen Sie mit spezifischen Problemen zurück. –

Verwandte Themen