我需要一种编程方式来创建SQL Server ODBC数据源。我可以通过直接访问注册表来完成此操作。如果可以通过可用的(SQL Server / Windows)API来防止更改SQL Server驱动程序中的注册表项或值的更改,那会更好。
接受的答案注意:使用SQLConfigDataSource从注册表项等的详细信息中抽象出代码,因此这更加强大。但是,我希望SQL Server能够使用更高级别的函数来包装它,该函数使用强类型属性(而不是分隔的字符串)并通过驱动程序公开它。
答案 0 :(得分:8)
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)
答案 1 :(得分:1)
对于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
答案 2 :(得分:0)
我将使用位于system32文件夹中的odbcad32.exe。
这会将您的odbc数据源添加到更正位置,这不会受到任何补丁的影响。
答案 3 :(得分:0)
要直接在注册表中执行此操作,您可以将字符串值添加到:
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
答案 4 :(得分:0)
使用C#的示例:
(http://msdn.microsoft.com/en-us/library/aa177860.aspx上的详细SQL Server参数)
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);
}