Frage

Ich brauche einen programmatischen Weg, um eine SQL Server ODBC-Datenquelle zu schaffen. Ich kann dies tun, indem sie direkt auf die Registry zugreifen. Es wäre besser, wenn diese über ein verfügbares (SQL Server / Windows) API gegen Änderungen in dem Registrierungsschlüssel oder Werten mit aktualisierten SQL Server-Treiber zu schützen getan werden könnte.

akzeptierte Antwort Hinweis: Mit SQLConfigDataSource abstrahiert den Code von den Details des Registrierungsschlüssels etc., so ist dies robuster. Ich habe gehofft, Sie jedoch, dass SQL Server dies mit einer höheren Ebene Funktion hat gewickelt würde, die stark Attribute eingegeben haben (und nicht begrenzte Zeichenfolge) und exponierte sie durch den Fahrer.

War es hilfreich?

Lösung

SQLConfigDataSource () macht den Job.

MSDN-Artikel

Für den Fall, hier ist ein VB6 Beispiel:

Const ODBC_ADD_DSN = 1 'user data source
Const ODBC_ADD_SYS_DSN = 4 'system data source

Private Declare Function SQLConfigDataSource Lib "ODBCCP32.DLL" (ByVal
hwndParent As Long, ByVal fRequest As Long, ByVal lpszDriver As String, ByVal
lpszAttributes As String) As Long

strDriver = "SQL Server"
strAttributes = "DSN=Sample" & Chr$(0) _
& "Database=Northwind" & Chr$(0) _
& "Description= Sample Data Source" & Chr$(0) _
& "Server=(local)" & Chr$(0) _
& "Trusted_Connection=No" & Chr$(0)

SQLConfigDataSource(0, ODBC_ADD_SYS_DSN, strDriver, strAttributes)

Andere Tipps

Für VB.NET kann es auf diese Weise durchgeführt werden:

Import für 'DllImport':

Imports System.Runtime.InteropServices

Erklärung SQLConfigDataSource:

<DllImport("ODBCCP32.DLL")> Shared Function SQLConfigDataSource _
(ByVal hwndParent As Integer, ByVal fRequest As Integer, _
    ByVal lpszDriver As String, _
    ByVal lpszAttributes As String) As Boolean
End Function

Beispiel Nutzung:

Const ODBC_ADD_DSN = 1 'User data source
Const ODBC_ADD_SYS_DSN = 4 'System data source

Public Function CreateSqlServerDataSource
    Dim strDriver As String : strDriver = "SQL Server"
    Dim strAttributes As String : strAttributes = _
        "DSN=Sample" & Chr(0) & _
        "Database=Northwind" & Chr(0) & _
        "Description= Sample Data Source" & Chr(0) & _
        "Server=(local)" & Chr(0) & _
        "Trusted_Connection=No" & Chr(0)

    SQLConfigDataSource(0, ODBC_ADD_SYS_DSN, strDriver, strAttributes)
End Function

Ich würde odbcad32.exe verwenden, die in Ihrem System32-Ordner befindet.

Dies wird Ihre ODBC-Datenquellen zum correcct Standort hinzufügen, die von allen Patches erfolgte nicht werden.

diese in der Registrierung direkt tun können Sie eine Zeichenfolge hinzuzufügen:

HKLM\SOFTWARE\Microsoft\ODBC\ODBC.INI\ODBC Data Sources

einen System-DSN hinzuzufügen, oder:

HKCU\Software\ODBC\ODBC.INI\ODBC Data Sources

einen Benutzer-DSN hinzuzufügen.

Der Name der Wert ist der Name der Datenquelle und die Daten erstellen möchten, müssen ‚SQL Server‘ sein.

Auf der gleichen Ebene wie ‚ODBC-Datenquellen‘ in der Registry erstellen einen Schlüssel mit dem Namen der Datenquelle Sie erstellen möchten.

Dieser Schlüssel muss die folgenden Stringwerte:

Database     - Name of default database to which to connect
Description  - A description of the Data Source
Driver       - C:\WINDOWS\system32\SQLSRV32.dll
LastUser     - Name of a database user (e.g. sa)
Server       - Hostname of machine on which database resides

Um zum Beispiel der reg.exe Anwendung von der Kommandozeile mit einer Benutzerdatenquelle hinzufügen namens ‚ExampleDSN‘:

reg add "HKCU\Software\ODBC\ODBC.INI\ODBC Data Sources" 
    /v ExampleDSN /t REG_SZ /d "SQL Server"
reg add HKCU\Software\ODBC\ExampleDSN 
    /v Database /t REG_SZ /d ExampleDSN
reg add HKCU\Software\ODBC\ExampleDSN 
    /v Description /t REG_SZ /d "An Example Data Source"
reg add HKCU\Software\ODBC\ExampleDSN
    /v Driver /t REG_SZ /d "C:\WINDOWS\system32\SQLSRV32.DLL"
reg add HKCU\Software\ODBC\ExampleDSN
    /v LastUser /t REG_SZ /d sa
reg add HKCU\Software\ODBC\ExampleDSN
    /v Server /t REG_SZ /d localhost

Beispiel mit C #:

(Detaillierte SQL Server param Bezug auf http://msdn.microsoft. com / en-us / library / aa177860.aspx )

using System.Runtime.InteropServices; 

        private enum RequestFlags : int
        {

            ODBC_ADD_DSN = 1,
            ODBC_CONFIG_DSN = 2,
            ODBC_REMOVE_DSN = 3,
            ODBC_ADD_SYS_DSN = 4,
            ODBC_CONFIG_SYS_DSN = 5,
            ODBC_REMOVE_SYS_DSN = 6,
            ODBC_REMOVE_DEFAULT_DSN = 7

        }

        [DllImport("ODBCCP32.DLL", CharSet = CharSet.Unicode, SetLastError = true)]
        private static extern bool SQLConfigDataSource(UInt32 hwndParent, RequestFlags  fRequest, 
                                 string lpszDriver, string lpszAttributes);

        public static void CreateDSN()
        {

            string strDrivername = "SQL Server";
            string strConfig =  "DSN=StackOverflow\0" +
                                   "Database=Northwind\0" +
                                   "Description=StackOverflow Sample\0" +
                                   "Server=(local)\0" +
                                   "Trusted_Connection=No\0";

            bool success = SQLConfigDataSource(0, RequestFlags.ODBC_ADD_SYS_DSN, strDrivername, strConfig);

        }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top