Динамическое создание DSN
Поскольку вы уже знаете, какая и где хранится DSN-информация, естественным является вопрос, нельзя ли просто создать запись в Windows Registry с необходимыми данными. Конечно, ответ на этот вопрос является положительным и в этом разделе приводится соответсвующий код, но при этом все-таки обязательно следует учитывать, что это не самый безопасный метод создания DSN, особенно не на своем собственном компьютере. Поэтому, если у вас появится желание создавать DSN именно таким образом, предварительно предупредите об этом того, кто отвечает за работоспособность данного компьютера. В любом случае перед проведением испытаний следует сохранять Windows Registry для возможного последующего восстановления. Во-первых, можно использовать API-функцию SQLConfigDataSource, полную информацию о которой можно найти по адресу http://msdn.microsoft.com/library/en-us/odbc/htm/odbcsqlconfigdatasource.asp. Во-вторых, является просто использовать соответствующие API-вызовы для непосредственной записи в Registry. Справочная информация о работе с Registry находится по адресу http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/registry_reference.asp.
В листинге 22.11 приводится пример кода для создания DSN при выполнении приложения с использованием API-функции SQLConfigDataSource. Листинг 22.11 Динамическое создание DSN из VB-кода 1: Private Const REG_SZ = 1 2: Private Const HKEY_CURRENT_USER = &H80000001 3: 4: Private Declare Function RegCreateKey _ 5: Lib "advapi32.dll" Alias "RegCreateKeyA" (_ 6: ByVal hKey As Long, _ 7: ByVal lpSubKey As String, _ 8: phkResult As Long) As Long 9: 10: Private Declare Function RegSetValueEx _ 11: Lib "advapi32.dll" Alias "RegSetValueExA" (_ 12: ByVal hKey As Long, _ 13: ByVal lpValueName As String, _ 14: ByVal Reserved As Long, _ 15: ByVal dwType As Long, _ 16: lpData As Any, _ 17: ByVal cbData As Long) As Long 18: 19: Private Declare Function RegCloseKey _ 20: Lib "advapi32.dll" (_ 21: ByVal hKey As Long) As Long 22: 23: 24: Sub CreateDSNTest() 25: Dim lngKeyHandle As Long 26: Dim lngResult As Long 27: Dim strDatabaseName As String 28: Dim strDataSourceName As String 29: Dim strDescription As String 30: Dim strDriverName As String 31: Dim strDriverPath As String 32: Dim strRegional As String 33: Dim strAutoTranslate As String 34: Dim strLastUser As String 35: Dim strServer As String 36: 37: strDataSourceName = "DSNtest" 38: strDatabaseName = "finansD" 39: strDescription = "" 40: strAutoTranslate = "No" 41: strLastUser = "Nata" 42: strDriverPath = "C:\\WINDOWS\\System32\\sqlsrv32.dll" 43: strRegional = "Yes" 44: strServer = "HOMEVLAD" 45: strDriverName = "SQL Server" 46: 47: 'После выполнения этого кода вы создаете ключ для 48: 'фактической DSN-информации, вызывая функцию RegCreateKey: 49: lngResult = RegCreateKey(HKEY_CURRENT_USER, _ 50: "SOFTWARE\ODBC\ODBC.INI\" & _ 51: strDataSourceName, lngKeyHandle) 52: 53: 'В качестве следующего шага задаем значения, связанные с этим 54: 'новым ключом, вызывая функцию RegSetValueEx: 55: lngResult = RegSetValueEx(lngKeyHandle, _ 56: "Database", 0&, REG_SZ, _ 57: ByVal strDatabaseName, _ 58: Len(strDatabaseName)) 59: lngResult = RegSetValueEx(lngKeyHandle, _ 60: "Description", 0&, REG_SZ, _ 61: ByVal strDescription, _ 62: Len(strDescription)) 63: lngResult = RegSetValueEx(lngKeyHandle, _ 64: "Driver", 0&, REG_SZ, _ 65: ByVal strDriverPath, _ 66: Len(strDriverPath)) 67: lngResult = RegSetValueEx(lngKeyHandle, _ 68: "Server", 0&, REG_SZ, _ 69: ByVal strServer, _ 70: Len(strServer)) 71: lngResult = RegSetValueEx(lngKeyHandle, _ 72: "LasUser", 0&, REG_SZ, _ 73: ByVal strLastUser, _ 74: Len(strLastUser)) 75: lngResult = RegSetValueEx(lngKeyHandle, _ 76: "Regional", 0&, REG_SZ, _ 77: ByVal strRegional, _ 78: Len(strRegional)) 79: lngResult = RegSetValueEx(lngKeyHandle, _ 80: "AutoTranslate", 0&, REG_SZ, _ 81: ByVal strAutoTranslate, _ 82: Len(strAutoTranslate)) 83: 84: 85: ' После присвоения необходимых значений 86: 'закрываем ключ, используя RegCloseKey: 87: lngResult = RegCloseKey(lngKeyHandle) 88: 89: ‘ Cоздание второго Registry-ключа, присваивание ему 90: 'значения, закрытие ключа: 91: lngResult = RegCreateKey(HKEY_CURRENT_USER, _ 92: "SOFTWARE\ODBC\ODBC.INI\ODBC Data Sources", _ 93: lngKeyHandle) 94: lngResult = RegSetValueEx(lngKeyHandle, _ 95: strDataSourceName, 0&, REG_SZ, _ 96: ByVal strDriverName, Len(strDriverName)) 97: lngResult = RegCloseKey(lngKeyHandle) 98: 99: End Sub В заключение отметим, что для доступа к данным, которые хранятся на SQL Server, можно обойтись без DSN.
|