[MSSQL][VB] InstanceName

ex-kali-bur

Grünschnabel
Hallo,
bitte entschuldigt die vielleicht einfache aber mich zu verzweiflung bringende Frage ...

Ich versuche gerade eine Anwendung zu schreiben, die auf einen MSSQL-Server zugreift. So weit so gut.

Was tun, wenn mir
Code:
System.Data.Sql.SqlDataSourceEnumerator.Instance.GetDataSources()
keinen InstanceName liefert, den ich in meinen ConnectionString einbauen kann, da er default ist also NULL liefert?
Bekomme ich den auch anders raus oder gibt es für diesen Fall einen Platzhalter?

Gruß ex

PS:
 

Norbert Eder

Erfahrenes Mitglied
Einfach in den ConnectionString einbauen:

Code:
Data Source=(local)\SQLEXPRESS;Initial Catalog=DATABASENAME;User Id=USERNAME;Password=PASSWORD;
Hier steht SQLEXPRESS für die Instanz.
 

ex-kali-bur

Grünschnabel
Danke für die Antwort.

Genau das ist aber mein Problem, ich entwickle lokal mit SQLEXPRESS, das ganze soll am Ende aber auf einen anderen Server zugreifen, von dem ich nicht weiss wie er sich nennt. Mit recht hoher wahrscheinlichkeit handelt es sich dabei nicht um die Express-Version.

Daher Scanne ich das Netz nach allen verfügbaren Servern und biete die gefundenen in einer ListBox zur Auswahl an.

Am liebsten wäre es mir, wenn zusätzlich dazu auch noch die vorhandenen Datenbanken anzeigen lassen könnte.

Danke und Gruß
Bob
 

Nico Graichen

Erfahrenes Mitglied
Hi

Die SQL Server inkl. Instanzen kannst du wie folgt abfragen:
C#:
SqlDataSourceEnumerator sdse = SqlDataSourceEnumerator.Instance;
DataTable dt = sdse.GetDataSources();
StringBuilder sb = null;
string instance = String.Empty;
foreach (DataRow row in dt.Rows)
{
      sb = new StringBuilder(row["ServerName"].ToString());
      instance = row["InstanceName"].ToString();
      if (!String.IsNullOrEmpty(instance))
      {
           sb.AppendFormat(@"\{0}", instance);
           instance = String.Empty;
      }
      Items.Add(sb.ToString());
}

Das Abfragen der Datenbanken geht so:
C#:
dtTables = oleConnection.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Catalogs, null);
foreach(System.Data.DataRow r in dtTables.Rows)
{		
	Items.Add(r[0].ToString());
}
Items ist jeweils die Items-Collection der ComboBox
 

ex-kali-bur

Grünschnabel
Danke,
das mit den Datenbanken habe ich hinbekommen. Aber einen Instanznamen bekomme ich einfach nicht als Antwort. Naja, muss dann halt manuell dazu geschrieben werden.

Gruß Bob
 

Nico Graichen

Erfahrenes Mitglied
Hi,

sind denn auch mehrere Instanzen auf den Rechnern vorhanden? Die Default-Instanz hat keinen zusätzlichen Namen und taucht daher auch nur mit dem Rechnernamen in der Liste auf. Soll heißen, ist auf dem entsprechenden Rechner nur ein SQL Server installiert (z.b. nur SQL Server 2000) oder nur eine Instanz(die Defaultinstanz) vorhanden, wird nur der Rechnername gelistet
Der oben gepostete Code funktioniert auf jeden Fall. Ich nutz das selbst in meinen Anwendungen
 

ex-kali-bur

Grünschnabel
Bei mir läuft nur die eine local, da wo die Applikation dann laufen soll, weiß ich es nicht.
Das Problem dabei ist doch, dass auch bei mir der eine Server keinen Instanznamen liefert, ich mich aber ohne diesen nicht verbinden kann.

Naja, soweit läuft jetzt alles ... ich bekomme meine Daten, Bilder und weitere Dateipfade aus der Datenbank, Uploade alle Dateien per FTP auf einen Webserver und schicke dann die restlichen Daten per POST an ein PHPScript, welches dann alles weitere macht. Damit kenne ich mich wenigstens aus.

Gruß Bob
 

Nico Graichen

Erfahrenes Mitglied
Bei mir läuft nur die eine local, da wo die Applikation dann laufen soll, weiß ich es nicht.
Das Problem dabei ist doch, dass auch bei mir der eine Server keinen Instanznamen liefert, ich mich aber ohne diesen nicht verbinden kann.
Das ist genau das, was ich oben geschrieben hab. Wenn du nur einen Server installiert hast, wird auch nur die Default-Instanz erzeugt. Und die taucht auch nur als Servername auf.

Bsp: Auf einem Rechner sind SQL Server 2000 und SQL Server 2000 installiert. Der 2000er wurde zuerst installiert und erstellt die Default-Instanz. Bei der Installation des 2005er wurde eine weitere Instanz erstellt, da SQL 2000 nicht auf 2005 Instanzen zugreifen kann.
Die bei den tauchen dann wie folgt in der Liste auf:
MyServer // Default-Instanz, die des SQL Server 2000
MyServer\SQL2005 // weitere Instanz, die des SQL Server 2005
 

ex-kali-bur

Grünschnabel
Das ist genau das, was ich oben geschrieben hab. Wenn du nur einen Server installiert hast, wird auch nur die Default-Instanz erzeugt. Und die taucht auch nur als Servername auf.
Das habe ich schon verstanden.

Aber gibt es denn für die default-Instanz einen Platzhalter im Connectionstring? Die folgenden Sachen habe ich schon erfolglos ausprobiert:
Data Source=SERVER; ...
Data Source=SERVER\; ...
Data Source=SERVER\*; ...
Data Source=SERVER\default; ...
 

Norbert Eder

Erfahrenes Mitglied
Also wenn ich mich nicht gänzlich irre, muss der Default-Instanzname (zumindest beim SQL Server 2000 sollte das so sein) nicht angegeben werden.

An deiner Stelle würde ich den ConnectionString in die App.Config verpacken, dann kannst du die Applikation auch irgendwo installieren und den ConnectionString einpflegen ohne neu kompilieren zu müssen.
 

Neue Beiträge