2014-10-21 9 views
1

Я использую реестр, чтобы проверить, существует ли данный DSN с помощью кода:проверка наличия DSD ODBC?

private const string ODBC_INI_REG_PATH = "SOFTWARE\\ODBC\\ODBC.INI\\"; 
public static bool DSNExists(string dsnName) 
{ 
    var sourcesKey = Registry 
     .LocalMachine.CreateSubKey(ODBC_INI_REG_PATH + "ODBC Data Sources"); 
    if (sourcesKey == null) 
     throw new Exception("ODBC Registry key for sources does not exist"); 
    string[] blah = sourcesKey.GetValueNames(); 
    Console.WriteLine("length: " + blah.Length); //prints: 0 
    return sourcesKey.GetValue(dsnName) != null; 
} 

Существует определенно не 0 DSNs и DSN я прохожу в качестве параметра на самом деле существует еще она возвращается ложный. Я не могу понять, почему?

+0

Попробуйте запустить [Process Monitor] (http://technet.microsoft.com/en-gb/sysinternals/bb896645.aspx), пока вы это делаете, чтобы увидеть, где именно он находится в реестре. – Rup

+0

Возможно, вы смотрите на неправильный реестр? 32-битная версия с 64-битной регистрацией приводила меня в бешенство, когда я получал права на свою систему DSN. Я думаю, что «Registry.LocalMachine» идет, если вы компилируете как x86 и x64. – Mike

+0

@Mike Это могло быть возможно. Я получал 32-разрядные и 64-разрядные несоответствия. У меня 64-битная машина Windows 7, как мне получить доступ к 64-битовому реестру? – Ben

ответ

0

DSN не являются значениями этого пути, они являются вспомогательными ключами. Вы, вероятно, хотите что-то вроде:

Обратите внимание, что

  1. Я перешел GetValueNames() для GetSubKeyNames()
  2. Я открывающий ключ к югу, чтобы проверить наличие: Я не уверен, есть ли лучший способ, или если это лучше, чем выполнение Содержит в результате GetSubKeyNames.
  3. Я думаю, что вы должны действительно закрыть ключи после того, как вы открыли их, чтобы освободить дескриптор.
+0

Я все еще получаю 0, и dsn, я знаю, существует, что im, проходящий в качестве параметра, все еще возвращает false.Возможно, есть некоторое отношение к комментарию Майка о 32-битном реестре и 64-битном? – Ben

+0

О, я не знаю, тогда извините - этот код работает для меня. 32/64 - это то, что вместо SOFTWARE \ ODBC вы смотрите в SOFTWARE \ Wow6432Node \ ODBC, или, возможно, ваш код автоматически переводит ваш запрос на вставку Wow6432Node для вас: я не могу запомнить правила. – Rup

3

Сначала вы должны удивляться, если машина, на которой программа бежится является x86 или x64:

/// <summary> 
    /// Determines if the current application is 32 or 64-bit. 
    /// se retorno == 32 = x86 else x64 
    /// </summary> 
    public int Bits() 
    { 
     return IntPtr.Size * 8; 
    } 

После этого установите путь реестра. Роль, которая была сделана для моего приложения, я использовал переменную is64 как int. Если переменной присваивается значение 32 система x86, x64 иначе

/// <summary> 
    /// Construtor da classe 
    /// a variavel is64 vai receber um numero inteiro (32 ou 64) representando a arquitetura da maquina 
    /// </summary> 
    /// <param name="is64"></param> 
    public Odbc(int is64) 
    { 
     if (is64 == 32) 
     { 
      this.ODBC_INI_REG_PATH = "Software\\ODBC\\ODBC.INI\\"; 
      this.ODBCINST_INI_REG_PATH = "Software\\ODBC\\ODBCINST.INI\\"; 
     } 
     else 
     { 
      this.ODBC_INI_REG_PATH = "Software\\Wow6432Node\\ODBC\\ODBC.INI\\"; 
      this.ODBCINST_INI_REG_PATH = "Software\\Wow6432Node\\ODBC\\ODBCINST.INI\\"; 
     } 
    } 

Наконец я изменил функцию вы кладете на тему. Модификация была:

Registry.LocalMachine.CreateSubKey => Registry.LocalMachine.OpenSubKey

public bool DSNExists(string dsnName) 
    { 
     try 
     { 
      var sourcesKey = Registry.LocalMachine.OpenSubKey(this.ODBC_INI_REG_PATH + "ODBC Data Sources"); 

      if (sourcesKey == null) 
      { 
       throw new Exception("ODBC Registry key for sources does not exist"); 
      } 

      string[] blah = sourcesKey.GetValueNames(); 

      Console.WriteLine("length: " + blah.Length); //prints: 0 

      return sourcesKey.GetValue(dsnName) != null; 
     } 
     catch (Exception ex) 
     { 
      throw new Exception(ex.Message); 
     } 
    } 
3

Я смотрел, как сделать это в PowerShell, и пока не строго ответа на этот вопрос, так как он сделал приходят в мои поиски. Я полагаю, что могу оставить примечание здесь:

if ((Get-OdbcDsn -Name $DSN -CimSession $OnHost) -neq $null) 
{ 
    # Code here runs if the DSN exists. 
} 

Дополнительные параметры могут быть добавлены для проверки конкретной платформы.

 Смежные вопросы

  • Нет связанных вопросов^_^