Entwickler-Ecke

Datenbanken - Fehler beim Connecten zur SQL Server LocalDB


NOS1971 - Mo 05.05.14 11:05
Titel: Fehler beim Connecten zur SQL Server LocalDB
Hallo zusammen,

ich versuche mich zu einem installierten SQL Server 2014 LocalDB zu connecten aber ich bekomme immer die Fehlermeldung das der Server nicht existieren würde oder der Zugriff verweigert würde ... der server läuft wie im taskmanager bei mir zu sehen ist und ich halte mich an die angaben auf http://docwiki.embarcadero.com/RADStudio/XE5/de/Herstellen_einer_Verbindung_zu_Microsoft_SQL_Server_(FireDAC) am ende der seite ... was mache ich falsch und noch eine verständnissfrage ... wofür würde ich als beispiel eine eigene instance benötigen ?

Hier mein Code-Auszug:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
var
 FDConnection : TFDConnection;
begin
 FDConnection := TFDConnection.Create(self);
 FDConnection.Params.Add('DriverID=MSSQL');
 FDConnection.Params.Add('Server=(LocalDB)\\v12.0');
// FDConnection.Params.Add('Integrated Security=true');
// FDConnection.Params.Add('OSAuthent=Yes');
 FDConnection.Params.Add('Database=master');
// FDConnection.Params.Add('ODBCAdvanced=AttachDbFileName=E:\ResultDataBase.mdf');
 FDConnection.Connected := true;
end;


Grüßle und Danke,
Andreas


WasWeißDennIch - Mo 05.05.14 11:23

Hast Du es mal mit einem einfachen Backslash versucht? Ich bin nicht sicher, ob der Backslash auch unter Delphi escaped werden muss.


Ralf Jansen - Mo 05.05.14 12:01

Wenn ich sowas auf .Net Seite (eigentlich einfach via connectionstring) mache dann ist der Begriff 'localdb' case sensitive.


NOS1971 - Mo 05.05.14 12:14

Ich habe es nun mit und ohne doppelten Bachslash probiert und auch LocalDB in alles Variantenversucht ... leider auch das ohne erfolg ... hier mal ein paar Screens vom SQL Server info und vom Fehler an sich.

Grüße,
Andreas


Ralf Jansen - Mo 05.05.14 12:21

Delphi/Firedac ist leider nicht meine Welt aber du hast eine benannte Instanz in der lokalDB gestartet und scheinbar gibst du die nirgendwo an. Das führt eigentlich dazu das eine neue versucht wird zu starten. Da das schonmal dauern kann läufst du vielleicht gerade einfach nur beim connecten in einen Timeout und wenn es funktioniert würde dann würdest du vermutlich nicht an der von dir erhofften Instanz hängen.

In einem klassischen Connectionstring würde man das dann so angeben "Server=(localdb)\MSSQLLocalDB"

Edit: Ignorier das. Ich hab übersehen das MSSQLLocalDB der Standardname für eine automatische Instanz ist. Ich dachte du hättest die explizit so benannt.

Aber ich sehe du benutzt bereits SQL Server 2014 die hat die Versionsnummer v12 nicht mehr v11


NOS1971 - Mo 05.05.14 12:38

Wie würde denn ein Connectionstring für meine DB aussehen ? Habe bisher nur Erfahrungen im Bereich SQLite3 gesammelt und bin im Client/Server Bereich ein ziemlicher Rookie.


Ralf Jansen - Mo 05.05.14 12:43

Hab den vorherigen Beitrag überarbeitet vielleicht war das schon das Problem.

Ein Connectionstring zur automatischen Instanz sollte so

Quelltext
1:
Server=(localdb)\v12.0;Integrated Security=true;                    

aussehen. Zu einer benannten Instanz halt

Quelltext
1:
Server=(localdb)\MeinLieberInstanzname;Integrated Security=true;                    


Aber das sind klassische OLEDB Connectionstrings (wie die auch vom native SQL Server Client benutzt werden würden) was FireDac damit anstellt (oder die überhaupt versteht) weiß ich nicht.


NOS1971 - Mo 05.05.14 12:52

Also ich habe den Code mal entsprechend geändert mit dem gleichen Ergebnis wie vorher


Delphi-Quelltext
1:
2:
 FDConnection.ConnectionString := 'DriverID=MSSQL;Server=(localdb)\v12.0;Integrated Security=true;';
 FDConnection.Connected := true;


Außerdem muss ich immer wieder den SQL Server von hand starten ... also SQLLocalDB start in der Console aufrufen ... damit hängt das aber nicht zusammen ... oder ?


Ralf Jansen - Mo 05.05.14 13:06

Solange er läuft während du dich versuchst dahin zu connecten reicht das ;)


NOS1971 - Mo 05.05.14 13:14

Ok ...

leider bringt das ganze keine Änderung ... ich bin total ratlos


NOS1971 - Mo 05.05.14 15:01

Hier mal ein Auszug aus dem Connection Manager
================================
Connection definition parameters
================================
ODBCAdvanced=
Server=(localdb)\v12.0
ConnectionDef=SQL LocalDB 2014
DriverID=MSSQL
ODBCAdvanced=
Database=master
Server=localdb)\v12.0
OSAuthent=Yes
Language=
Name=SQL LocalDB 2014
================================
FireDAC info
================================
Tool = RAD Studio XE6
FireDAC = 10.0.1 (Build 69712)
Platform = Windows 32 bit
Defines = FireDAC_NOLOCALE_META;FireDAC_MONITOR
================================
Client info
================================
Loading driver MSSQL ...
Loading odbc32.dll driver manager
Creating ODBC environment handle
Searching for ODBC driver ...
Checking for ODBC driver [SQL SERVER NATIVE CLIENT 11.0] ...
Checking for ODBC driver [SQL SERVER NATIVE CLIENT 10.0] ...
Checking for ODBC driver [SQL NATIVE CLIENT] ...
Checking for ODBC driver [SQL SERVER] ...
Found [SQL Server]
================================
Session info
================================
Failed to connect to DBMS !
[FireDAC][Phys][ODBC][Microsoft][ODBC SQL Server Driver][DBNETLIB]SQL Server existiert nicht oder Zugriff verweigert.


Kann man daraus was erkennen ?


Quitzlinga - Mo 05.05.14 15:15

Hi,

musst Du evt noch Username und Passwort zum anmelden mit angeben ?

MfG

Quitzlinga


NOS1971 - Mo 05.05.14 15:17

Sollte eigentlich nicht aber habe ich auch schon ausprobiert ... leider ohne Erfolg :-(


baumina - Mo 05.05.14 15:36

user profile iconNOS1971 hat folgendes geschrieben Zum zitierten Posting springen:
Hier mal ein Auszug aus dem Connection Manager
================================
Connection definition parameters
================================
ODBCAdvanced= Eintrag doppelt?
Server=(localdb)\v12.0 Eintrag doppelt?
ConnectionDef=SQL LocalDB 2014
DriverID=MSSQL
ODBCAdvanced= Eintrag doppelt?
Database=master
Server=localdb)\v12.0 Eintrag doppelt, allerdings ohne "(" am Anfang?
OSAuthent=Yes
Language=
Name=SQL LocalDB 2014
================================
FireDAC info
================================
Tool = RAD Studio XE6
FireDAC = 10.0.1 (Build 69712)
Platform = Windows 32 bit
Defines = FireDAC_NOLOCALE_META;FireDAC_MONITOR
================================
Client info
================================
Loading driver MSSQL ...
Loading odbc32.dll driver manager
Creating ODBC environment handle
Searching for ODBC driver ...
Checking for ODBC driver [SQL SERVER NATIVE CLIENT 11.0] ...
Checking for ODBC driver [SQL SERVER NATIVE CLIENT 10.0] ...
Checking for ODBC driver [SQL NATIVE CLIENT] ...
Checking for ODBC driver [SQL SERVER] ...
Found [SQL Server]
================================
Session info
================================
Failed to connect to DBMS !
[FireDAC][Phys][ODBC][Microsoft][ODBC SQL Server Driver][DBNETLIB]SQL Server existiert nicht oder Zugriff verweigert.


Kann man daraus was erkennen ?


NOS1971 - Mo 05.05.14 15:47

Merkwürdig ... sind aber nur einmal angegeben ... kann ich den fehler irgendwie näher eingrenzen ?


Ralf Jansen - Mo 05.05.14 17:54

Zitat:
Checking for ODBC driver [SQL SERVER NATIVE CLIENT 11.0] ...


Denn Treiber scheint er nicht zu finden. Und denn ODBC Treiber den er findet weiß sicher nichts von localdb Datenbanken.
In der von dir verlinkten Anleitung wird das auch erwähnt

Zitat:
SQL Server Native Client 11.0 als Verbindung für LocalDB.


Also passenden Treiber nachinstallieren. Da ich nicht weiß wie Delphi die Treiber durchtestet solltest du auch explizit die 11er Version des native Clients nehmen und nicht die zum Sql Server 2014 passenden 12er Version. Einfach mal aus dem Logoutput geschlossen sieht das sehr hardcodiert aus.


NOS1971 - Mo 05.05.14 18:30

Werde ich nachher mal checken ... ist im moment auch noch hardgecodet weil ich erste erfahrungen mit Client/Server sammeln wollte um von SQLite auf SQL LocalDB umzustellen ... gibt es auch eine möglichkeit von delphi aus den sql server zu starten falls er nicht läuft oder den sql server beim installen zu einzustellen das er permanent läuft ?

Grüße und vielen Dank,
Andreas


NOS1971 - Di 06.05.14 14:31

SO ...

hat super geklappt ... neben dem ODBC Treiber fehlte auch noch der Native Client und mit dem Server=(localdb)\v12.0 klappt es auch nicht sondern mit Server=(localdb)\MSSQLLocalDB

Wie man sieht starte ich den SQL Server nun von Hand da er nicht dauerhaft läuft ... wie löst man das normalerweise ? Schauen ob installed und Pfad etc aus Registry lesen und dann starten ?

Hier mal der Code den ich nun nutze:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
var
 FDConnection : TFDConnection;
 E: Exception;
begin
 ShellExecute(Application.Handle,'open','C:\Program Files\Microsoft SQL Server\120\Tools\Binn\SqlLocalDB.exe','start','',SW_ShowNormal);
 FDConnection := TFDConnection.Create(self);
 FDConnection.DriverName := 'MSSQL';
 FDConnection.ConnectionName := 'MTWS';
 FDConnection.Params.Add('DriverID=MSSQL');
 FDConnection.Params.Add('Server=(localdb)\MSSQLLocalDB');
 FDConnection.Params.Add('Integrated Security=true');
 FDConnection.Params.Add('Database=master');
 FDConnection.Params.Add('OSAuthent=Yes');
 FDConnection.Params.Add('MARS=No');
 try
  FDConnection.Connected := true;
 except
  begin
   ShowMessage(E.Message);
   exit;
  end;
 end;
 // connected
 ShowMessage('Connection succesfully established!');
 Sleep(1000);
 try
  FDConnection.Connected := false;
 except
  begin
   ShowMessage(E.Message);
   exit;
  end;
 end;
 // disconnected
 ShowMessage('Connection succesfully closed!');