Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi MS SQL Server mit alternativen Ports nutzen (https://www.delphipraxis.net/179512-ms-sql-server-mit-alternativen-ports-nutzen.html)

QuickAndDirty 12. Mär 2014 08:46

Datenbank: MSSQL • Version: 2012 • Zugriff über: Firedac

MS SQL Server mit alternativen Ports nutzen
 
Hallo,
Ich nutze MSSQL Server via Firedac.
Normalerweise verbindet man sich ja dann über
Code:
Servername\Instanzname
Das scheint bei MS SQL Servern die nicht den Standardport nutzen nicht zu klappen.
Dann verbinde ich mich via:
Code:
tcp:Servername\Instanzname,Port
Nun ist mir zu Ohren gekommen, dass man auch den "MS SQL Server Browser Dienst" nach den
Ports der Instanzen Fragen kann. Scheinbar ist es nämlich sogar möglich, dass eine Instanz
keinen fest zugewiesenen Port nutzt. Ich halte das zwar für unpraktikabel wegen der Firewall freigaben, aber was soll's.

Was kann ich machen das Firedac den MS SQL Server Browser zurhilfe nimmt um eine Verbindung aufzubauen?
Wenn das nicht geht. Wie kann ich diesen MS SQL Server Browser nutzen? Gibt es Delphi Bibliotheken dafür ? Hat es mal jemand gemacht?

QuickAndDirty 13. Mär 2014 09:06

AW: MS SQL Server mit alternativen Ports nutzen
 
Shameless self bump

Sharky 13. Mär 2014 11:09

AW: MS SQL Server mit alternativen Ports nutzen
 
Hai QuickanDirty,

es ist richtig das nur die Standarndinstanz auf den Standard Port 1433 hört.
Wenn Du dich jetzt via TPC/IP mit einer anderen Instanz verbinden möchtest musst Du entweder den Port der Instanz angeben (Das wird über das SQL Server Configuration Manager eingestellt).

ODER Du must den SQL-Server Browser aktivieren. Dieser kümmert sich darum das der Client mit der richtigen Instanz kommuniziert.

QuickAndDirty 13. Mär 2014 11:46

AW: MS SQL Server mit alternativen Ports nutzen
 
Zitat:

Zitat von Sharky (Beitrag 1251850)
Hai QuickanDirty,

es ist richtig das nur die Standarndinstanz auf den Standard Port 1433 hört.

Wenn Du dich jetzt via TPC/IP mit einer anderen Instanz verbinden möchtest musst Du entweder den Port der Instanz angeben (Das wird über das SQL Server Configuration Manager eingestellt).

ODER Du must den SQL-Server Browser aktivieren. Dieser kümmert sich darum das der Client mit der richtigen Instanz kommuniziert.

Ich weiß wie ich den MS SQLServer konfigurieren muss. Aber es scheint so als würde FireDac nicht auf den SQL-Server Browser zurück greifen, wenn die Instanz auf einem anderen Port läuft.
Kann man das in FireDac aktivieren?
Kann ich den SQL-Server Browser selbst fragen?

Uwe Raabe 13. Mär 2014 15:05

AW: MS SQL Server mit alternativen Ports nutzen
 
Irgendwie komme ich noch nicht dahinter, was du vorhast.

Im FireDAC ConnectionEditor kann man auf den Wizard-Button klicken, um sich eine Verbindung zusammenzubauen. Dabei wird für MSSQL der entsprechende ODBC-Dialog von Windows aufgerufen.

Soweit ich weiß sucht FireDAC selbst überhaupt nicht nach potentiellen SQL-Servern, sondern erwartet immer einen passenden Connection-String.

QuickAndDirty 13. Mär 2014 16:16

AW: MS SQL Server mit alternativen Ports nutzen
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1251867)
Irgendwie komme ich noch nicht dahinter, was du vorhast.

Ich hoffe es.

Zitat:

Zitat von Uwe Raabe (Beitrag 1251867)
Soweit ich weiß sucht FireDAC selbst überhaupt nicht nach potentiellen SQL-Servern, sondern erwartet immer einen passenden Connection-String.

Es soll nicht suchen. Es soll zu der Instanz automatisch den Port finden.

Folgendes szenario:

Auf einem Server beim Kunden laufen 4 instanzen des MSSQL Servers. und eine instanz des SQL-Server-browsers.
Ich verwende folgenden string für den Server Parameter in Firedac.
Code:
SBS2003\EVALUATION
Der port der Instanz namens "EVALUATION" ist 2222.
Firedac scheint keine Verbindung mit diesen angaben aufzubauen. Obwohl der SQL-Server-browser aktiv ist.

Wenn ich den wert für den Server Parameter ändere in
Code:
tcp:SBS2003\EVALUATION,2222
verbindet sich Firedac.

Angeblich weiß der SQL-Server-Browser das "SBS2003\EVALUATION" auf 2222 lauscht.
Angeblich kann man SQL-Server-Browser danach fragen. "hey welchen Port hat die Instanz mit namen EVALUATION".

Wie geht das?
Ich brauche diese Information für ein Setup Programm.

Uwe Raabe 13. Mär 2014 17:07

AW: MS SQL Server mit alternativen Ports nutzen
 
Lies mal hier - hilft vielleicht weiter.

QuickAndDirty 14. Mär 2014 09:08

AW: MS SQL Server mit alternativen Ports nutzen
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1251890)
Lies mal hier - hilft vielleicht weiter.

Danke, aber es fehlt immer noch ein bisschen.
Er hat halt fest gestellt was der SQL Server Browser macht.

Ich bin jetzt etwas verunsichert wer die Gegenstelle zur kommunikation mit dem
SQL Server Browser bildet. Ist es das tool oder der SQLNative client.
Wenn es der native client schon automatisch macht, dann müsste weder ich noch Firedac sich darum kümmern.

Das ganz versuche ich ja heraus zu bekommen weil,ein Kunde sich aufgeregt hat,
dass wir uns den Port nicht einfach über den SQL-Server-Browser besorgen,
statt ihn damit zu behelligen den Port selbst rauszufinden und anzugeben.

Wenn das also der native client bereits selbst macht, hat der Kunde den SQL-Server-Browser nicht eingeschalet gehabt.
Da ich aber nicht hoffe das er so blöd ist, könnte es vielleicht sein das ich den SQL-Server Browser selbst abfragen MUSS?

taveuni 14. Mär 2014 09:51

AW: MS SQL Server mit alternativen Ports nutzen
 
Zitat:

Zitat von QuickAndDirty (Beitrag 1251977)

Ich bin jetzt etwas verunsichert wer die Gegenstelle zur kommunikation mit dem
SQL Server Browser bildet. Ist es das tool oder der SQLNative client.
Wenn es der native client schon automatisch macht, dann müsste weder ich noch Firedac sich darum kümmern.

Meine Halbwissenerfahrung (in Verbindung mit den Devarts, MSSQL und nicht standard Ports):
Wenn der Nativeclient installiert ist muss ich den Devarts den Port nicht angeben ansonsten schon.

Wie allerdings der MS Nativeclient dies in Erfahrung bringt und wie die Devarts an die Info kommen weiss ich nicht.
Was ich weiss ist - Wir können uns nicht darauf verlassen dass der Kunde immer den Native Client on board hat.
Insofern muss bei bei uns beim Setup der Port manuell eingegeben werden wenn <> default.

Uwe Raabe 14. Mär 2014 10:04

AW: MS SQL Server mit alternativen Ports nutzen
 
Zitat:

Zitat von QuickAndDirty (Beitrag 1251977)
Wenn das also der native client bereits selbst macht, hat der Kunde den SQL-Server-Browser nicht eingeschalet gehabt.

Oder der Port für den SQL-Server-Browser wird von der Firewall nicht durchgelassen. Wenn du die Gelegenheit hast, mach doch beim Kunden mal diesen Test mit PortQuery. Dann weißt du wenigstens, ob es prinzipiell klappen sollte.

x000x 14. Mär 2014 11:05

AW: MS SQL Server mit alternativen Ports nutzen
 
Moin moin,

deine Frage zu FireDAC speziell kann ich dir nicht beantworten. Wenn du den SQL-Server-Browser aber selbst abfragen musst, dann kannst du per UDP ein Byte ($02) an den Dienst senden und erhälst die Antwort. Hier ein simples Bsp:
Code:
function RawQueryMSServerBrowser(const PaStrServer: String): String;
var
   Client: TIdUDPClient;
begin
   Client := TIdUDPClient.Create(nil);
   try
      Client.Send(PaStrServer, 1434, #$02);
      Result := Client.ReceiveString(1000);
   finally
      Client.Free;
   end;
end;
Ab dem 4. Byte steht dann wohl ein reiner String in der Antwort. Was genau die ersten 3 Bytes der Antwort aussagen, kann ich dir nicht sagen. Eine Info/Doku/API dazu habe ich leider nicht finden können - ich hatte das einfach nur mal mit gesnifft.

Eventuell hilfts dir ja weiter...

QuickAndDirty 14. Mär 2014 12:03

AW: MS SQL Server mit alternativen Ports nutzen
 
Zitat:

Zitat von x000x (Beitrag 1251990)
Moin moin,

deine Frage zu FireDAC speziell kann ich dir nicht beantworten. Wenn du den SQL-Server-Browser aber selbst abfragen musst, dann kannst du per UDP ein Byte ($02) an den Dienst senden und erhälst die Antwort. Hier ein simples Bsp:
Code:
function RawQueryMSServerBrowser(const PaStrServer: String): String;
var
   Client: TIdUDPClient;
begin
   Client := TIdUDPClient.Create(nil);
   try
      Client.Send(PaStrServer, 1434, #$02);
      Result := Client.ReceiveString(1000);
   finally
      Client.Free;
   end;
end;
Ab dem 4. Byte steht dann wohl ein reiner String in der Antwort. Was genau die ersten 3 Bytes der Antwort aussagen, kann ich dir nicht sagen. Eine Info/Doku/API dazu habe ich leider nicht finden können - ich hatte das einfach nur mal mit gesnifft.

Eventuell hilfts dir ja weiter...

NICE!!!!!!!!!!!!!!!!!

Danke!

Wenn es dir anders geht als mir. Du also mit Spezifikationen was anfangen kannst...tata
http://msdn.microsoft.com/en-us/libr...(PROT.10).aspx

Da ist sogar dein beispiel drin. und es geht auch als Broadcast.
cool.
http://msdn.microsoft.com/en-us/library/cc219743.aspx

Das macht quasi den weg frei, dafür dass man dem Admin einfach eine Liste gefundener Instanzen anbietet.

x000x 14. Mär 2014 12:26

AW: MS SQL Server mit alternativen Ports nutzen
 
Danke für die Links. Mit diesen Infos kann man dann die Antwort ja korrekt auswerten. Wie findet ihr nur immer sowas - ich suche vermutlich generell mit den falschen Suchbegriffen ^^

QuickAndDirty 1. Apr 2014 11:36

AW: MS SQL Server mit alternativen Ports nutzen
 
ok es bedarf scheinbar eines echten parsers
Die antwort besteht aus folgenden Produktionsregeln.
http://msdn.microsoft.com/en-us/library/cc219748.aspx


Außerdem... Wie empfange ich mit einem UDP Client korrect alle Antworten eines Broadcasts?
Ich empfange immer nur eine. Damit das funktioniert mache ich einfach gaaanz viele Broadcasts so dass verschiedene Server schneller sind.
Das kann doch nicht der weg sein wie man sowas machen muss.
Delphi-Quellcode:
procedure TMSSQLServerBrowserClient.Refresh;
var counter:Cardinal;
   Client: TIdUDPClient;
   sreceived:string;
begin
   FSQLServers.clear;

   Client := TIdUDPClient.Create(nil);
   try
    Client.Port := Port;
    Counter := getTickCount()+ 5000;
    while getTickCount() < counter do
    Begin
      Application.ProcessMessages;
      Client.Broadcast(CLNT_BCAST_EX,Port); //      Client.Send(CLNT_UCAST_EX);
      sReceived := Client.ReceiveString(10000);
      Parse(sReceived);
    end;//while getTickCount() < counter do
   finally
      Client.Free;
   end;
End;

mjustin 1. Apr 2014 12:07

AW: MS SQL Server mit alternativen Ports nutzen
 
Eine Lösung für ActiveMQ Server habe ich neulich hier gepostet:

http://mikejustin.wordpress.com/2013...and-indy-10-6/

Eventuell hilft der Code weiter, leider habe ich kein MS SQL installiert

x000x 1. Apr 2014 12:38

AW: MS SQL Server mit alternativen Ports nutzen
 
Moin moin,

Zitat:

Zitat von QuickAndDirty (Beitrag 1254297)
... Wie empfange ich mit einem UDP Client korrect alle Antworten eines Broadcasts?...

Du brauchst mit dem Client doch nur einen Broadcast senden. Um die Antworten dann zu empfangen, kannst du doch einen Server auf dem Port lauschen lassen. Damit bekommst du dann wie gewollt die Antworten.

QuickAndDirty 1. Apr 2014 14:14

AW: MS SQL Server mit alternativen Ports nutzen
 
Habe ich versucht!
Der Port 1434 ist belegt....von meinem eigenen SQL-Serverbrowser.

QuickAndDirty 3. Apr 2014 14:42

AW: MS SQL Server mit alternativen Ports nutzen
 
Also es fehlt mir wirklich, wie man vernünftig die anworten auf einen UDP Broadcast empfängt! Wenn es mehr als eine ist....
Hat einer ne Ahnung?
Spammen funktioniert zwar, aber das kann es doch nicht sein.

mjustin 3. Apr 2014 14:51

AW: MS SQL Server mit alternativen Ports nutzen
 
Zitat:

Zitat von QuickAndDirty (Beitrag 1254563)
Also es fehlt mir wirklich, wie man vernünftig die anworten auf einen UDP Broadcast empfängt! Wenn es mehr als eine ist....
Hat einer ne Ahnung?

Siehe oben, den Quelltext hatte ich in meinem verlinkten Artikel auch komplett untergebracht, UDP Empfang auch mehrerer Antworten funktioniert problemlos. Doppelte Einträge werden ausgefiltert.

QuickAndDirty 11. Apr 2014 14:00

AW: MS SQL Server mit alternativen Ports nutzen
 
Zitat:

Zitat von mjustin (Beitrag 1254564)
Zitat:

Zitat von QuickAndDirty (Beitrag 1254563)
Also es fehlt mir wirklich, wie man vernünftig die anworten auf einen UDP Broadcast empfängt! Wenn es mehr als eine ist....
Hat einer ne Ahnung?

Siehe oben, den Quelltext hatte ich in meinem verlinkten Artikel auch komplett untergebracht, UDP Empfang auch mehrerer Antworten funktioniert problemlos. Doppelte Einträge werden ausgefiltert.

OK jetzt hab ichs kapiert...versuche es mal

QuickAndDirty 11. Apr 2014 16:03

AW: MS SQL Server mit alternativen Ports nutzen
 
@mjustin:
Delphi-Quellcode:
      MCastClient:= TIdIpMCastClient.create(nil);
      MCastClient.DefaultPort := Port; //Port= 1434 
      MCastClient.OnIPMCastRead := onIPMCastRead;
      MCastClient.ReuseSocket := rsTrue;
      MCastClient.ThreadedEvent := True;
      MCastClient.Active := True;//hier kommt es zu einer exception could not bind socket, port already in use. (RSCouldNotBindSocket)
Ich habe hier ja einen SQLServer browser am laufen. wie verhindere ich diese meldung?


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:56 Uhr.

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