Quel est le moyen le plus simple et le plus facile à gérer de créer une source de données ODBC SQL Server?
-
05-07-2019 - |
Question
J'ai besoin d'une méthode de programmation pour créer une source de données ODBC SQL Server. Je peux le faire en accédant directement au registre. Ce serait mieux si cela pouvait être fait via une API disponible (SQL Server / Windows) pour se protéger contre les modifications dans les clés de registre ou les valeurs avec les pilotes SQL Server mis à jour.
Réponse acceptée Remarque: l'utilisation de SQLConfigDataSource extrait le code des détails des clés de registre, etc., ce qui le rend plus robuste. J'espérais cependant que SQL Server l'aurait enveloppé d'une fonction de niveau supérieur prenant des attributs fortement typés (plutôt qu'une chaîne délimitée) et les exposant via le pilote.
La solution
SQLConfigDataSource () effectue le travail.
Juste au cas où voici un exemple 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)
Autres conseils
Pour VB.NET, cela peut être fait de la manière suivante:
Importer pour 'DllImport':
Imports System.Runtime.InteropServices
Déclaration de 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
Exemple d'utilisation:
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
Je voudrais utiliser odbcad32.exe qui se trouve dans votre dossier system32.
Ceci ajoutera vos sources de données odbc à l'emplacement correct, qui ne sera affecté par aucun correctif.
Pour ce faire directement dans le registre, vous pouvez ajouter une valeur de chaîne à:
HKLM\SOFTWARE\Microsoft\ODBC\ODBC.INI\ODBC Data Sources
pour ajouter un DSN système, ou:
HKCU\Software\ODBC\ODBC.INI\ODBC Data Sources
pour ajouter un DSN utilisateur.
Le nom de la valeur est le nom de la source de données que vous voulez créer et les données doivent être 'SQL Server'.
Au même niveau que "Sources de données ODBC" dans le registre, créez une clé portant le nom de la source de données à créer.
Cette clé nécessite les valeurs de chaîne suivantes:
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
Par exemple, en utilisant l'application reg.exe à partir de la ligne de commande pour ajouter une source de données utilisateur appelée '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
Exemple utilisant C #:
(Référence détaillée des paramètres SQL Server à l'adresse http://msdn.microsoft. com / fr-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);
}