SQL Server ODBC 데이터 소스를 생성하는 가장 간단하고 유지 가능한 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/170466

문제

SQL Server ODBC 데이터 소스를 작성하는 프로그래밍 방식이 필요합니다. 레지스트리에 직접 액세스 하여이 작업을 수행 할 수 있습니다. 사용 가능한 (SQL Server/Windows) API를 통해 수행 할 수있는 경우 레지스트리 키 또는 업데이트 된 SQL Server 드라이버의 값을 보호하기 위해 수행 할 수 있습니다.

허용 답변 참고 : SQLCONFIGDATASOURCE를 사용하면 레지스트리 키 등의 세부 사항에서 코드를 추상화합니다. 따라서 이는 더욱 강력합니다. 그러나 SQL Server가 더 높은 레벨 함수로 이것을 감시 한 문자열이 아닌 강력하게 입력 한 속성을 취하고 드라이버를 통해 노출되기를 바랐습니다.

도움이 되었습니까?

해결책

sqlconfigdatasource ()는 작업을 수행합니다.

MSDN 기사

여기에 vb6 예제가있는 경우를 대비하여 :

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)

다른 팁

vb.net의 경우 다음과 같은 방식으로 수행 할 수 있습니다.

'dllimport'의 가져 오기 :

Imports System.Runtime.InteropServices

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

예제 사용 :

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

System32 폴더에있는 Odbcad32.exe를 사용합니다.

이렇게하면 ODBC 데이터 소스를 AsrecCT 위치에 추가하여 패치에 의해 영향을받지 않습니다.

레지스트리에서 직접이를 수행하려면 다음에 문자열 값을 추가 할 수 있습니다.

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

시스템 DSN을 추가하려면 또는 :

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

사용자 DSN을 추가하려면

값의 이름은 작성하려는 데이터 소스의 이름이며 데이터는 'SQL Server'여야합니다.

레지스트리의 'ODBC 데이터 소스'와 동일한 수준에서 작성하려는 데이터 소스의 이름으로 키를 만듭니다.

이 키는 다음 문자열 값이 필요합니다.

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

예를 들어, 명령 줄에서 reg.exe 응용 프로그램을 사용하여 'emabespledsn'이라는 사용자 데이터 소스를 추가합니다.

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

C#을 사용한 샘플 :

(자세한 SQL Server Param Reference at 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);

        }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top