Benutzer mit den meisten Antworten
SQLExpress Instanzpfad auslesen HKLM

Frage
-
Hallo,
ich versuche derweil den Pfad des DATA Ordners von einer SQL Instanz in der Registry auszulesen. Ich komme hierbei bis zu dem Punkt "Microsoft SQL Server". Wenn ich nun die Instanz auswählen möchte also den SubKey, dann springt er "raus".
Diesen Pfad muss ich allerdings auslesen da ich den Pfad des späteren Users nicht kenne und ich eine Batch für weitere Zwecke mit diesem Pfad erstellen muss.
Hier der Source:
public static string getPathFromRegistry() { RegistryKey VVGetPath = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Microsoft SQL Server\\MSSQL10.SQLEXPRESS\\Setup\\"_<br/> ,RegistryKeyPermissionCheck.ReadSubTree); VVGetPath.GetValue("SQLDataRoot"); string VVGetPathResult; VVGetPathResult = VVGetPath + "Data\\"; return VVGetPathResult.ToString(); }
Alle erbärmliche Versuche führten bislang ins leere. Habt ihr da noch eine Idee?
Grüße,
Dom
C# und VB.NET sind wie eine Schachtel Pralinen, ich weiß nie was ich bekomme xD
Antworten
-
Hallo Dom,
Hallo Stefan,Dom schrieb: Gibt´s denn sonst noch eine Möglichkeit heraus zu finden wo der Datenpfad des SQL Servers liegt?
Ja, Du könntest z.B. abfragen, in welchem Pfad sich die master-Datenbank befindet:using System; using System.Data.SqlClient; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { string dataPath = GetSqlExpressDataPath(); Console.WriteLine(dataPath); Console.ReadKey(true); } private static string GetSqlExpressDataPath() { string query = "SELECT SUBSTRING(physical_name, 1, CHARINDEX(N'master.mdf', LOWER(physical_name)) - 1) FROM master.sys.master_files WHERE database_id = 1 AND file_id = 1"; SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder { DataSource = ".\\SQLEXPRESS", InitialCatalog = "master", IntegratedSecurity = true }; string pathToDataDirectory = String.Empty; using (SqlConnection connection = new SqlConnection(builder.ConnectionString)) { connection.Open(); SqlCommand selectCommand = new SqlCommand(query, connection); pathToDataDirectory = (string)selectCommand.ExecuteScalar(); connection.Close(); } return pathToDataDirectory; } } }
cf. Get physical path to SQL Server 2005 data files
http://www.question-defense.com/2009/04/29/get-physical-path-to-sql-server-2005-data-filesVielleicht auch erwähnenswert in diesem Kontext:
File Locations for Default and Named Instances of SQL Server:
http://msdn.microsoft.com/en-us/library/ms143547(v=SQL.110).aspx
Gruß
Marcel- Als Antwort markiert Dom2011 Mittwoch, 18. Mai 2011 12:58
-
Hallo Dom,am saubersten und einfachsten (und unabhängig von x64 x86) ist eigentlich folgendes:
string dataPfad = new Server(@".\SQLEXPRESS").MasterDBPath;
[Edit] oder besser:string dataPfad = Path.Combine(new Server(@".\SQLExpress").RootDirectory, "Data");
http://msdn.microsoft.com/de-de/library/ms162129.aspx
http://msdn.microsoft.com/de-de/library/microsoft.sqlserver.management.smo.iserverinformation.masterdbpath(SQL.100).aspx______________
Weitere Hinweise .... der Pfad zur "master"-DB muss nicht mit dem der SQLDataRoot übereinstimmen (man kann die master bspw. auch an benutzerdefinierte Stellen legen). Die SqlDataRoot-Eigenschaft sollte man aber eh nicht mehr benutzen (s.Doku).[Edit] da Dinge wie DefaultFile bei SQLExpress ggf. leer sind, würde ich sie hier nicht benutzen.
ciao Frank
- Als Antwort markiert Dom2011 Mittwoch, 18. Mai 2011 12:58
- Bearbeitet Frank Dzaebel Mittwoch, 18. Mai 2011 15:37
Alle Antworten
-
Hi,
kann es sein, dass Du dich auf einem 64 Bit System befindest, deine Anwendung aber als x86 (32 Bit) kompiliert wird?
In dem Fall greift dein Code auf HKLM\Software\Wow6432Node\Microsoft\Microsoft SQL Server\... zu und dort gibt es den von dir angefragten Pfad nicht.
Wenn meine Vermutung zutrifft, stell mal explizit auf x64 um, dann sollte es gehen.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community -
Hi,
das stimmt allerdings, ich bin auf einem 64-Bit System und kompiliere als x86 Anwendung. Wenn ich die Applikation jetzt auf x64 kompiliere wirft er mich an genau der gleichen Stelle raus wie vorher auch. Den Pfad hab ich jetzt schon zig mal überprüft.
Gibt´s denn sonst noch eine Möglichkeit heraus zu finden wo der Datenpfad des SQL Servers liegt? Das wäre für eine spätere Batch Datei sehr sehr sehr hilfreich.
C# und VB.NET sind wie eine Schachtel Pralinen, ich weiß nie was ich bekomme xD -
Hallo Dom,
Hallo Stefan,Dom schrieb: Gibt´s denn sonst noch eine Möglichkeit heraus zu finden wo der Datenpfad des SQL Servers liegt?
Ja, Du könntest z.B. abfragen, in welchem Pfad sich die master-Datenbank befindet:using System; using System.Data.SqlClient; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { string dataPath = GetSqlExpressDataPath(); Console.WriteLine(dataPath); Console.ReadKey(true); } private static string GetSqlExpressDataPath() { string query = "SELECT SUBSTRING(physical_name, 1, CHARINDEX(N'master.mdf', LOWER(physical_name)) - 1) FROM master.sys.master_files WHERE database_id = 1 AND file_id = 1"; SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder { DataSource = ".\\SQLEXPRESS", InitialCatalog = "master", IntegratedSecurity = true }; string pathToDataDirectory = String.Empty; using (SqlConnection connection = new SqlConnection(builder.ConnectionString)) { connection.Open(); SqlCommand selectCommand = new SqlCommand(query, connection); pathToDataDirectory = (string)selectCommand.ExecuteScalar(); connection.Close(); } return pathToDataDirectory; } } }
cf. Get physical path to SQL Server 2005 data files
http://www.question-defense.com/2009/04/29/get-physical-path-to-sql-server-2005-data-filesVielleicht auch erwähnenswert in diesem Kontext:
File Locations for Default and Named Instances of SQL Server:
http://msdn.microsoft.com/en-us/library/ms143547(v=SQL.110).aspx
Gruß
Marcel- Als Antwort markiert Dom2011 Mittwoch, 18. Mai 2011 12:58
-
Hallo Dom,am saubersten und einfachsten (und unabhängig von x64 x86) ist eigentlich folgendes:
string dataPfad = new Server(@".\SQLEXPRESS").MasterDBPath;
[Edit] oder besser:string dataPfad = Path.Combine(new Server(@".\SQLExpress").RootDirectory, "Data");
http://msdn.microsoft.com/de-de/library/ms162129.aspx
http://msdn.microsoft.com/de-de/library/microsoft.sqlserver.management.smo.iserverinformation.masterdbpath(SQL.100).aspx______________
Weitere Hinweise .... der Pfad zur "master"-DB muss nicht mit dem der SQLDataRoot übereinstimmen (man kann die master bspw. auch an benutzerdefinierte Stellen legen). Die SqlDataRoot-Eigenschaft sollte man aber eh nicht mehr benutzen (s.Doku).[Edit] da Dinge wie DefaultFile bei SQLExpress ggf. leer sind, würde ich sie hier nicht benutzen.
ciao Frank
- Als Antwort markiert Dom2011 Mittwoch, 18. Mai 2011 12:58
- Bearbeitet Frank Dzaebel Mittwoch, 18. Mai 2011 15:37
-
Hi ihr beiden,
ich glaube da hattet ihr die selbe Idee.
Ich werde das später mal angehen und euch heute abend noch berichten ob es soweit funtkioniert hat.
Vielen Dank für eure Hilfe schonmal vorab.
Grüße,
dom
C# und VB.NET sind wie eine Schachtel Pralinen, ich weiß nie was ich bekomme xD -
Hallo Elmar,
- der Pfad zur Master Datenbank ist zwar häufig, aber nicht immer (insbesondere bei größeren Installationen) der richtige.
ja, ähnliches schrieb ich auch schon.
- Der korrekte Weg via SMO wäre: ...
ja, SMO erwähnte ich bereits.
Du hast aber jetzt noch DefaultFile (für das Datenverzeichnis) angesprochen.
Das wäre 'theoretisch' das beste, aber dieses empfehle ich deswegen nicht, weil der Pfad oft leer in der Praxis ist.siehe dazu auch:
[[SMO] Misleading Documentation information on DefaultFile Property | Microsoft Connect]
http://connect.microsoft.com/SQLServer/feedback/details/272702/smo-misleading-documentation-information-on-defaultfile-property#details
"DefaultLog" und "BackupDirectory" waren ja jetzt nicht die Frage von Dom, da er IMHO das Datenverzeichnis haben wollte.
ciao Frank- Bearbeitet Frank Dzaebel Mittwoch, 18. Mai 2011 16:34
-
Danke für die weiteren Antworten,
ja ich brauchte die Pfade. So lernt man aber immer mal noch was dazu.
Ich stehe allerdings vor einem weiteren Problem und bin mir noch nicht sicher ob ich es so gelöst bekomme. Ich werde mich wenn dann in einem neuen Post nochmal melden.
Die Variante mit dem Pfad zur Master klappt bestens. Ich möchte den Nutzern bei der Installation nachher soviel Arbeit abnehmen wie nur möglich und da ich die Datenbank nicht direkt bei der Installation mit übergeben will (was wohl irgendwie gehen mag) - binde ich diese einfach später beim ersten Programmstart mit ein.
C# und VB.NET sind wie eine Schachtel Pralinen, ich weiß nie was ich bekomme xD -
Hallo Dom,
- Die Variante mit dem Pfad zur Master klappt bestens.
freut mich, dass die von mir und Marcel vorgeschlagene Variante geholfen hat.
Im Hinterkopf natürlich behalten ... der Master-Tabellen-Datenpfad muss nicht der Standard-Datenpfad sein.
DefaultFile würde ich wie gesagt nicht benutzen (auch, wenn er gem. Doku das richtige "scheint"), das habe ich auch mehrfach geprüft und ja auch auf entsprechende Microsoft-Connect-Feedback verwiesen.- ... binde ich diese einfach später beim ersten Programmstart mit ein.
wenn da noch weitere Fragen sind, kann man die ja in einem neuen Thread stellen.
Ansonsten weiterhin erfolgreiches DB- und C#-Programmieren.
ciao Frank -
> Frank schrieb: freut mich, dass die von mir und Marcel vorgeschlagene Variante geholfen hat.
Bitte instrumentalisiere meine Antwort nicht. Es ist zwar schön zu sehen, dass Du mich (anders als es Elmar heute in Deinen Edits erging) endlich wieder namentlich anführst (unglaublich!), aber Du tust es anscheinend nur, weil es Dir in den Kram paßt. Du tätest gut daran, die Worte eines MVP SQL Server nicht so einfach in den Wind zu schlagen. Jede Rhetorik ist irgendwann am Ende. Das weißt Du doch inzwischen. Und dann zählen nur die Fakten. Und man zählt eins uns eins zusammen.