Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi MSSQL 2005 Servernamen ermitteln (https://www.delphipraxis.net/117275-mssql-2005-servernamen-ermitteln.html)

Centrii 15. Jul 2008 10:25


MSSQL 2005 Servernamen ermitteln
 
Hallo Wissende,

Ich steh grad vor einem kleinen Problem und hoffe das ihr mir weiter helfen könnt.
Ich suche eine Möglichkeit wie ich alle auf einem PC installierten MSSQL2005 Server ermitteln kann,
bzw. den Servernamen ermitteln kann.
Ich hab ein Programm wo lokal oder remote auf einen PC zugreift und Werte aus einer Tabelle holt.
Nun kann aber sein das auf dem einen PC die SQL2005 Datenbank "DatenbankX","DatenbankY",usw. heißt.
Wenn ich also über try and error suche bis ich den richtigen Namen gefunden hab dauert das ewig.
Deshalb würde ich gern vorher den Namen ermitteln.

Gibts da einen Weg?

Gruß Centrii

DP-Maintenance 15. Jul 2008 10:33

DP-Maintenance
 
Dieses Thema wurde von "Phoenix" von "VCL / WinForms / Controls" nach "Datenbanken" verschoben.
Erstmal den Weg in die richtige Sparte...

Phoenix 15. Jul 2008 10:37

Re: MSSQL 2005 Servernamen ermitteln
 
Meinst Du die Instanz des SQL-Servers (also ein benannter laufender SQL-Server-Dienst, von dem es mehrere geben kann), oder meinst Du die Datenbank, die innerhalb einer solchen Instanz läuft?

Der Servername ist an und für sich der Name des Servers - also der Name der physikalischen (oder virtuellen) Maschine.

Edit Nachtrag:
Wenn Du die Datenbanken innerhalb einer Instanz meinst, so gibt es die Stored Procedure
SQL-Code:
sp_databases
, die Dir eine Liste aller vorhandenen Datenbanken in der Instanz als Tabelle ausgibt.

Centrii 15. Jul 2008 10:44

Re: MSSQL 2005 Servernamen (Instanz) ermitteln
 
Die Instanz. Wenn ich weiß das es auf dem PC PCName\InstanzX gibt weiß ich auch das es auf dem PC die DatenbankX gibt,
andernfalls PCName\InstanzY, dann muss es DatenbankY sein.
Ich mache das im moment über try and error, das geht aber zu lange, weil ich online Werte aus der Datenbank brauch, wo ich leider im Vorfeld
keine Instanz habe, nur den PCNamen.

Übrigends: Danke für verschieben Phoenix :thumb:

die Datenbanken unter der Instanz kann ich mir auch aus der Mastertabelle sysObject holen, das ist nicht das Problem.

Phoenix 15. Jul 2008 11:08

Re: MSSQL 2005 Servernamen ermitteln
 
Ah, okay. Das Stichwort dazu ist SQL-DMO (Distributed Management Objects).
Das sind eine Hand voll COM-Objekte mit denen Du sowas machen kannst.

Auf dem SQLServer2 Com-Objekt gibt es eine Methode namens ListInstalledInstances. Die macht genau das :)

Centrii 15. Jul 2008 11:57

Re: MSSQL 2005 Servernamen ermitteln
 
vielen Dank Phoenix, ich hab das mal soweit umgesetzt, leider habe ich noch ein Problemchen

Delphi-Quellcode:
var DMOSQL2, Instanzen: OLEVariant;
    i : Integer;
    Instanz: String;
begin
  DMOSQL2:= CreateOleObject('SQLDMO.SQLServer2');
  Instanzen := DMOSQL2.ListInstalledInstances('TBE87'); //mein PCName
  for i:=0 to Instanzen.count do begin
    Instanz := Instanzen.Item[i];
  end;
end;
Ich bekomme keine Instanzen zurück, obwohl ich zwei habe ?

Bernhard Geyer 15. Jul 2008 12:33

Re: MSSQL 2005 Servernamen ermitteln
 
Lokale Firewall installiert? Der Weg über COM ist etwas allergisch bezüglich Firewalls.

Schau mal ob du über die NetServerEnum-Win32API mehr bekommst.

marabu 15. Jul 2008 12:45

Re: MSSQL 2005 Servernamen ermitteln
 
Hallo Ruben,

Syntaxfehler bei der Automation sind eine häufige Fehlerursache:

Delphi-Quellcode:
var
  obj, nl: OLEVariant;
  i: Integer;
begin
  obj := CreateOleObject('SQLDMO.SQLServer2');
  nl := obj.ListInstalledInstances();
  for i := 1 to nl.Count do
    ShowMessage(Format('#%d: "%s"', [i, VarToStr(nl.Item(i))]));
end;
Freundliche Grüße

Edit: NameList is one-based ...

Bernhard Geyer 15. Jul 2008 12:52

Re: MSSQL 2005 Servernamen ermitteln
 
Zitat:

Zitat von marabu
Syntaxfehler bei der Automation sind eine häufige Fehlerursache:

Aber nur bei der Schleife. Die Methode ListInstalledInstances kann mit Servernamen (auch eigener Rechnername) aufgerufen werden. Aber u.U. geht man damit dem Firewall-Problem aus dem Weg.

Phoenix 15. Jul 2008 12:56

Re: MSSQL 2005 Servernamen ermitteln
 
Da rächt es sich, das Delphi nicht case-sensitive ist ;-)
Aber der Count-1 war der zweite geschossene Bock.

Centrii 15. Jul 2008 12:57

Re: MSSQL 2005 Servernamen ermitteln
 
danke für die Antworten.

Ich bekomm erst gar keinen Instanzen zurück, an der Schleife kanns nicht liegen EDIT: auch wenn ich das -1 vergessen habe, aber beim testen kann das mal passieren :wall: .
Firewall ist aktiv und ich kann sie leider nicht beinflussen.
Das mit der NetServerEnum muss ich mir erstmal anschauen, noch nie davon gehört.
Aber schön das ich scheinbar Source mäßig alles richtig mache :-D

marabu 15. Jul 2008 13:00

Re: MSSQL 2005 Servernamen ermitteln
 
Nicht ganz unwesentlich ist auch die Verwendung runder statt eckiger Klammern beim Aufruf der Methode Item().

Phoenix 15. Jul 2008 13:06

Re: MSSQL 2005 Servernamen ermitteln
 
Zitat:

Zitat von Centrii
Aber schön das ich scheinbar Source mäßig alles richtig mache :-D

Äh.. wie gesagt: Nicht wirklich.
Bei COM kommt es eben auf die Groß- und Kleinschreibung an.
z.B. gibt es count nicht, Count schon. Und Wie marabu schon sagte: item auf dem Instanzen-Objekt ist eine Methode und muss item(i) aufgerufen werden. Es ist kein Array welches man mit index[i] anspricht.

Centrii 15. Jul 2008 13:07

Re: MSSQL 2005 Servernamen ermitteln
 
ok,ok, ich bekomm doch was zurück, ich sollte mir vielleicht auch noch den 2. Schleifendurchlauf anschauen, da stand dann meine SQL2005 Instanz drin,
aber die erste war leer, das müsste dann eigentlich mein SQL2000 Instanz sein. Hat da jemand eine Erklärung dafür?

Edit: mein "count" funktioniert aber ?!?

Centrii 15. Jul 2008 13:49

Re: MSSQL 2005 Servernamen ermitteln
 
hab es eben noch auf einem PC versucht der nur eine SQL2000 Instanz hat, dort gehts auch nicht. Die SQL2005 Instanzen werden angezeigt.

in der MSDN steht:
Zitat:

If an application calls ListInstalledInstances on an instance of SQL Server version 7.0, an empty NameList object is returned.
die Verison vom SQLServer 2000 ist aber 8, da müsste doch das ListInstalledInstances funktionieren??

Phoenix 15. Jul 2008 13:54

Re: MSSQL 2005 Servernamen ermitteln
 
GGf. wird die DefaultInstanz nicht mit aufgelistet?

marabu 15. Jul 2008 13:56

Re: MSSQL 2005 Servernamen ermitteln
 
Count oder count ist egal, aber die NameList beginnt nicht mit 0 sondern mit 1. Leider scheinen sehr unterschiedliche Ergebnisse möglich zu sein, je nach verwendeter Version der beteiligten Komponenten. Es wird gelegentlich beklagt, dass nur Servernamen geliefert werden. Ich kann das jetzt nicht nachvollziehen.

Centrii 15. Jul 2008 14:01

Re: MSSQL 2005 Servernamen ermitteln
 
ich danke dir Marabu.....
das die NameList nicht mit 0 beginnt war mein Problem, jetzt funktioniert es.

Vielen Dank an alle :thumb:

Centrii 16. Jul 2008 11:38

Re: MSSQL 2005 Servernamen ermitteln
 
jetzt steh ich vor dem Problem mit der SQLServer Version

ich nutze dazu das VERSIONMajor um die Hauptversion des Server
zu bestimmen. Leider bekomm ich immer die Verison 8, egal ob SQL2000 oder SQL2500.
Hat jemand Erfahrung damit?

Bernhard Geyer 16. Jul 2008 11:42

Re: MSSQL 2005 Servernamen ermitteln
 
Zitat:

Zitat von Centrii
jetzt steh ich vor dem Problem mit der SQLServer Version

ich nutze dazu das VERSIONMajor um die Hauptversion des Server
zu bestimmen. Leider bekomm ich immer die Verison 8, egal ob SQL2000 oder SQL2500.
Hat jemand Erfahrung damit?

Wieso wohl :mrgreen:
Zitat:

Dieses Feature wird in zukünftigen Versionen von Microsoft SQL Server nicht mehr bereitgestellt. Verwenden Sie dieses Feature beim Entwickeln neuer Anwendungen nicht, und planen Sie das Ändern von Anwendungen, in denen es zurzeit verwendet wird.
Schick doch einfach das Statement
SQL-Code:
SELECT @@VERSION
ab.

Centrii 16. Jul 2008 11:59

Re: MSSQL 2005 Servernamen ermitteln
 
ist ja auch ne Doku vom SQL2008, d.h. für mich funktioniert zumindest für SQL2005 und 2000
das gleiche steht auch beim ListInstalledInstances Method, das funktionierts.

das mit
SQL-Code:
Select @@Version
ist natürlich auch eine Lösung.

danke


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:50 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz