SQL Server ODBCデータソースを作成するための最も簡単で最も保守可能な方法は何ですか?
-
05-07-2019 - |
質問
SQL Server ODBCデータソースをプログラムで作成する方法が必要です。これを行うには、レジストリに直接アクセスします。更新されたSQL Serverドライバーでレジストリキーまたは値の変更から保護するために、利用可能な(SQL Server / Windows)APIを介してこれを行うことができればより良いでしょう。
承認された回答のメモ: SQLConfigDataSourceを使用すると、レジストリキーなどの詳細からコードが抽象化されるため、より堅牢になります。ただし、SQL Serverがこれを(区切り文字列ではなく)厳密に型指定された属性を取り、ドライバーを通じて公開する高レベルの関数でラップすることを望んでいました。
解決
SQLConfigDataSource()がジョブを実行します。
念のため、ここに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データソースが正しい場所に追加されますが、これはパッチの影響を受けません。
レジストリで直接これを行うには、次の場所に文字列値を追加できます。
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アプリケーションを使用して、「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
C#を使用したサンプル:
( http://msdn.microsoftの詳細なSQL Serverパラメーターリファレンス。 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);
}